From 9b95875ba9fc69828dec96b4d1e79b1a0bc43e9e Mon Sep 17 00:00:00 2001 From: Forest Belton Date: Tue, 14 Sep 2021 20:01:33 -0400 Subject: [PATCH] Add remaining arithmetic binops to parser --- lib/parser.pegjs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/parser.pegjs b/lib/parser.pegjs index b0474e5..3338def 100644 --- a/lib/parser.pegjs +++ b/lib/parser.pegjs @@ -23,10 +23,24 @@ Stmt = @AssignStmt SEMI AssignStmt = name:Ident ASSIGN expr:Expr { return stmt("assign", { name, expr }) } // Expressions -Expr = AddExpr +Expr = BitOrExpr + +BitOrExpr = head:BitXorExpr tail:(op:BitOrOp e:BitXorExpr)* { return assocl(head, tail || []) } +BitOrOp = PIPE { return "bit_or" } + +BitXorExpr = head:BitAndExpr tail:(op:BitXorOp e:BitAndExpr)* { return assocl(head, tail || []) } +BitXorOp = CARET { return "bit_xor" } + +BitAndExpr = head:ShiftExpr tail:(op:BitAndOp e:ShiftExpr)* { return assocl(head, tail || []) } +BitAndOp = AMPERSAND { return "bit_and" } + +ShiftExpr = head:AddExpr tail:(op:ShiftOp e:AddExpr)* { return assocl(head, tail || []) } +ShiftOp = LTLT { return "shift_left" } + / GTGT { return "shift_right" } AddExpr = head:UnaryExpr tail:(op:AddOp e:UnaryExpr)* { return assocl(head, tail || []) } AddOp = PLUS { return "add" } + / MINUS { return "subtract" } UnaryExpr = op:UnaryOp? e:BaseExpr { return op ? uexpr(op, e) : e } UnaryOp = TILDE { return "bit_negate" } @@ -59,6 +73,11 @@ U8 = @'u8' WS U16 = @'u16' WS // Terminal symbols +PIPE = '|' WS +CARET = '^' WS +AMPERSAND = '&' WS +LTLT = '<<' WS +GTGT = '>>' WS PLUS = '+' WS TILDE = '~' WS MINUS = '-' WS