A toy compiled, statically typed, functionnal programming language.
let add = (a: u32, b: u32) => a + b;
let main = () => print add (8, 4);
# output: `12`
let fact = match {
0 => 1,
n => n * (fact n - 1),
};
let main = print fact 8;
# output: `40320`
The compiler follows a pretty simple multi-stage architecture, each stage consumes some of the precedent stages outputs and produces one or multiple outputs:
lexer/tokenizer:source=>tokenssyntax parser:tokens=>syns(syntax nodes)semantic parser:source,tokens,syns=>sems(semantic nodes),typestype inference:sems,types=>sems,typesssa generation:source,tokens,sems,types=>ssa,*types*
Then the codegen step can be either:
c codegen:ssa,types=>c source codeamd64 codegen:ssa,types=>gnu assembly
All theses steps are explicitly written down in src/main.rs