diff --git a/src/ast/parser.lalrpop b/src/ast/parser.lalrpop index 1594e82b50edf8a9756315d5a971f4b2ca944a8a..d011793644df38ba18ac8e48353c849371014fff 100644 --- a/src/ast/parser.lalrpop +++ b/src/ast/parser.lalrpop @@ -19,8 +19,13 @@ CommaNoTrail<T>: Vec<T> = { <mut v:(<T> ",")*> <e:T> => { v.push(e); v } } -Tier<Op, NextTier>: () = { - Tier<Op,NextTier> Op NextTier, +Tier2<Op, NextTier>: () = { + Tier2<Op, NextTier> Op NextTier, + NextTier +}; + +Tier1<Op, NextTier>: () = { + Op NextTier, NextTier }; @@ -45,6 +50,7 @@ Type:() = { "i32", "bool", "()", + "!", } Block: () = { @@ -81,49 +87,50 @@ ExprBlock: () = { Block, } +// Lowest Precedence +ExprNoBlock = Tier2<AndOrOp, AndOr>; +AndOr = Tier2<ComparisonOp, AddSub>; +AddSub = Tier2<AddSubOp, MulDiv>; +MulDiv = Tier2<MulDivOp, Unary>; +Unary = Tier1<UnaryOp, Term>; -ExprNoBlock = Tier<AndOr, Expr0>; -Expr0 = Tier<Comparison, Expr1>; -Expr1 = Tier<AddSub, Expr2>; -Expr2 = Tier<MulDiv, Expr3>; -Expr3 = Tier<Unary, Term>; +// Highest Precedence +Term: () = { + Id, + Num, + Id "(" CommaNoTrail<Expr> ")", + "(" Expr ")", +} -AndOr: () = { +AndOrOp: () = { "||", "&&", } -Comparison: () = { +ComparisonOp: () = { "==", "!=", ">", "<", } -AddSub: () = { +AddSubOp: () = { "+", "-", } -MulDiv: () = { +MulDivOp: () = { "/", "*", } -Unary: () = { +UnaryOp: () = { "!", "*", "&", "&" "mut", } -Term: () = { - Id, - Num, - Id "(" CommaNoTrail<Expr> ")", - "(" Expr ")", -} - Num: i32 = {