AcrylicShrimp / testlang-rust

A rust implemented compiler front-end project includes CLR parser generator that uses LLVM as back-end.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

testlang-rust

A powerful and minimal language.

Concept

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

Hello, world!

println('Hello, world!');

Compiler

The reference compiler is written in Rust and uses LLVM and backend.

Structure

  • src/rule: Parses a rule 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.

Rule file

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).

Basic form

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.

Root non-terminal

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: ...

About

A rust implemented compiler front-end project includes CLR parser generator that uses LLVM as back-end.


Languages

Language:Rust 100.0%