A typescript & Node.js implemented compiler front-end project.
This project has been ported to Rust due to performance issues. If you have planned to run it, please consider use new repository instead.
This project was began for the complete implementation of the front-end of compilers.
src/rule.ts
: Parses arule
file and generates a CLR parsing table.src/parser.ts
: Parses tokens from a lexer and generates an AST. This parser is driven by a parsing table.src/lexer.ts
: Supplies tokens to a parser by reading given input.
The rule.ts
file requires a valid rule file to generate a parsing table. This rule file is similar to the BNF notation, but not supports alternations(|
symbol).
It is super easy to define a new non-terminal. Don't forget to add an @
sign as a first letter for each non-terminal.
non-terminal-name: terminal @non-terminal terminal @non-terminal ... ;
If you want use alternations, define it multiple times.
statement: @if-statement;
statement: @for-statement;
statement: @while-statement;
statement: @var-declare-statement semicolon;
...
Every terminals should be defined in lexer.ts
too.
Any valid rule files must define a root non-terminal __root
(double underscore). This root non-terminal cannot be defined multiple times. After successful parsing, the parser may return an AST named S
for below rules.
__root = @S;
S: ...