diff --git a/examples/syntax3.rs b/examples/syntax3.rs index 6684e2ae742d2013358c9883eccb1f3fb22f9ff0..005a9c9bca6591264afc0a4ce2ad9e3675a50532 100644 --- a/examples/syntax3.rs +++ b/examples/syntax3.rs @@ -16,7 +16,7 @@ fn b(x: bool) -> i32 { fn c() { b(false); let b = if true { - let mut a = 1; + let mut a: i32 = 1; while a > 0 { a = a - 1 } diff --git a/src/ast/ast.rs b/src/ast/ast.rs index b750a433c98bf8dc9558be9c8da21b57e43e62d2..0907875986f375cf259939befb5f53b78fbe7079 100644 --- a/src/ast/ast.rs +++ b/src/ast/ast.rs @@ -1,4 +1,4 @@ -use std::fmt; +// use std::fmt; // ast diff --git a/src/ast/parser.lalrpop b/src/ast/parser.lalrpop index 4c517cd4615d53be8de67995e9b40fd319eb65f4..1594e82b50edf8a9756315d5a971f4b2ca944a8a 100644 --- a/src/ast/parser.lalrpop +++ b/src/ast/parser.lalrpop @@ -19,8 +19,8 @@ CommaNoTrail<T>: Vec<T> = { <mut v:(<T> ",")*> <e:T> => { v.push(e); v } } -Tier<Op,NextTier>: Box<Expr> = { - Tier<Op,NextTier> Op NextTier => Box::new(Expr::Op(<>)), +Tier<Op, NextTier>: () = { + Tier<Op,NextTier> Op NextTier, NextTier }; @@ -28,114 +28,108 @@ pub Program: () = { Function* } -pub Function: () = { +Function: () = { "fn" Id Params ("->" Type)? Block, } -pub Params: () = { +Params: () = { "()", // seems like a haxx "(" (Param ",")* Param? ")", } -pub Param:() = { +Param:() = { "mut"? Id ":" Type, } -pub Type:() = { +Type:() = { "i32", "bool", "()", } -pub Block: () = { +Block: () = { "{" StmtSeq* "}", "{" StmtSeq* Stmt "}", } -pub StmtSeq: () = { +StmtSeq: () = { Stmt ";", StmtBlock, } -pub StmtBlock: () = { +StmtBlock: () = { "while" Expr Block, "if" Expr Block ("else" Block)?, Block, } -pub Stmt: () = { +Stmt: () = { ";", - "let" "mut"? Id "=" Expr, + "let" "mut"? Id (":" Type)? "=" Expr, ExprNoBlock "=" Expr, ExprNoBlock, } -pub Expr: () = { +Expr: () = { ExprBlock, ExprNoBlock, } -pub ExprBlock: () = { +ExprBlock: () = { "if" ExprNoBlock Block "else" Block, Block, } -// Here is our ordinary expressions -pub ExprNoBlock: () = { - ExprNoBlock "||" Expr0, - ExprNoBlock "&&" Expr0, - Expr0, -} +ExprNoBlock = Tier<AndOr, Expr0>; +Expr0 = Tier<Comparison, Expr1>; +Expr1 = Tier<AddSub, Expr2>; +Expr2 = Tier<MulDiv, Expr3>; +Expr3 = Tier<Unary, Term>; -// Comparison -pub Expr0: () = { - Expr0 "==" Expr1, - Expr0 "!=" Expr1, - Expr0 ">" Expr1, - Expr0 "<" Expr1, - Expr1, +AndOr: () = { + "||", + "&&", } +Comparison: () = { + "==", + "!=", + ">", + "<", +} -// AddSub -pub Expr1: () = { - Expr1 "+" Expr2, - Expr1 "-" Expr2, - Expr2, +AddSub: () = { + "+", + "-", } -// MulDiv -pub Expr2: () = { - Expr2 "/" Expr3, - Expr2 "*" Expr3, - Expr3, +MulDiv: () = { + "/", + "*", } -// Unary -pub Expr3: () = { - "*" Term, - "&" Term, - "&" "mut" Term, - "!" Term, - Term, +Unary: () = { + "!", + "*", + "&", + "&" "mut", } -pub Term: () = { +Term: () = { Id, Num, Id "(" CommaNoTrail<Expr> ")", - "(" Expr ")", } -pub Num: i32 = { +Num: i32 = { r"[0-9]+" => i32::from_str(<>).unwrap(), }; -pub Id: String = { +Id: String = { r"(_|[a-z]|[A-Z])([a-z]|[A-Z]|[0-9]|_)*" => String::from_str(<>).unwrap(), }; \ No newline at end of file