A powerful and minimal language.
The main concepts of this language are set to be a simple, high performance, human-friendly and less-verbose.
- No inheritance
- No method overloading
- No main function
- Consistent reusable syntax
- Minimal keywords
println('Hello, world!');
The reference compiler is written in Rust
and uses LLVM
and backend.
src/rule
: Parses arule
file and generates a CLR parsing table.src/parser.rs
: Parses tokens from a lexer and generates an AST. This parser is driven by a parsing table.src/lexer.rs
: Supplies tokens to a parser by reading given input.src/codegen
: Generates LLVM IR codes.
The rule
crate requires a valid rule file to generate a parsing table. This rule file is similar to the BNF notation except for that it is 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 to 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: ...