From 02628a56d6e9889b7797e5e94e0be587b8afa1e5 Mon Sep 17 00:00:00 2001 From: servostar Date: Mon, 6 May 2024 16:41:23 +0200 Subject: [PATCH] fixed shift reduce conflicts by removing epsilon functions --- src/yacc/parser.y | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/yacc/parser.y b/src/yacc/parser.y index d6226e4..48db348 100644 --- a/src/yacc/parser.y +++ b/src/yacc/parser.y @@ -73,57 +73,61 @@ expr: ValFloat | operation; exprlist: expr ',' exprlist - | expr - | ; + | expr; -paramlist: paramlist '(' exprlist ')' - | ; +paramlist: '(' exprlist ')' paramlist + | '(' exprlist ')'; funcall: Ident paramlist { DEBUG("Function call"); }; -assign: Ident '=' expr { DEBUG("Assignment"); }; - -statementlist: statementlist statement - | ; +statementlist: statement statementlist + | statement; statement: assign | decl | definition - | branch; + | branch + | funcall; branchif: KeyIf expr '{' statementlist '}' { DEBUG("if"); }; branchelse: KeyElse '{' statementlist '}' { DEBUG("if-else"); }; branchelseif: KeyElse KeyIf expr '{' statementlist '}' { DEBUG("else-if"); }; branchelseifs: branchelseifs branchelseif - | ; + | branchelseif; branch: branchif branchelseifs | branchif branchelseifs branchelse; identlist: Ident ',' identlist - | Ident - | ; + | Ident; -decl: type ':' identlist { DEBUG("Declaration"); }; +decl: type ':' identlist; definition: decl '=' expr { DEBUG("Definition"); }; assign: Ident '=' expr { DEBUG("Assignment"); }; sign: KeySigned - | KeyUnsigned - | ; + | KeyUnsigned; scale: scale KeyShort | scale KeyHalf | scale KeyLong | scale KeyDouble - | ; + | KeyShort + | KeyHalf + | KeyLong + | KeyDouble; -type: sign scale Ident - | sign scale KeyInt - | sign scale KeyFloat; +typekind: Ident + | KeyInt + | KeyFloat; + +type: typekind + | scale typekind + | sign typekind + | sign scale typekind; operation: oparith | oplogic