Uro*_*s K 2 compiler-construction syntax pascal shift-reduce-conflict
我正在编写一个从(简化的)Pascal到ARM asm的编译器.我正处于这个过程的第二步 - 在编写词法分析器之后,我正在使用java cup进行语法分析.
我写了我的语法,但有5个S/R冲突,这些都非常相似.例:
Warning : *** Shift/Reduce conflict found in state #150
between assign_stmt ::= val_expr ASSIGN val_expr (*)
and val_expr ::= val_expr (*) LBRACKET val_expr RBRACKET
under symbol LBRACKET
Resolved in favor of shifting
Run Code Online (Sandbox Code Playgroud)
我这节的语法:
assign_stmt ::=
val_expr ASSIGN val_expr;
val_expr ::=
NIL | BOOL_CONST | INT_CONST | CHAR_CONST | PTR val_expr %prec MEM | ADD val_expr %prec UADD |
SUB val_expr %prec USUB | NOT val_expr | val_expr PTR %prec VAL | val_expr MUL val_expr |
val_expr DIV val_expr | val_expr ADD val_expr | val_expr SUB val_expr | val_expr EQU val_expr |
val_expr NEQ val_expr | val_expr LTH val_expr | val_expr GTH val_expr | val_expr LEQ val_expr |
val_expr GEQ val_expr | val_expr AND val_expr | val_expr OR val_expr | IDENTIFIER |
val_expr LBRACKET val_expr RBRACKET | val_expr DOT IDENTIFIER | IDENTIFIER LPARENTHESIS params_list RPARENTHESIS |
LBRACKET type_desc RBRACKET | LPARENTHESIS val_expr RPARENTHESIS
;
Run Code Online (Sandbox Code Playgroud)
我怎么能消除这种冲突?
谢谢.
你的语法含糊不清,左右递归.根据我(有限的)关于解析器的知识,我知道大多数解析器生成器都无法解析这个问题.
这是不明确的,因为val_expr ADD val_expr SUB val_expr可以解析为:
ADD
/ \
val_expr SUB
/ \
val_expr val_expr
Run Code Online (Sandbox Code Playgroud)
和
SUB
/ \
ADD val_expr
/ \
val_expr val_expr
Run Code Online (Sandbox Code Playgroud)
我从来没有使用过Java CUP,但是我在这里使用另一个解析器生成器做了类似的事情:
val_expr ::=
expr1 (SUB | ADD | <add all your operators here>) val_expr
| expr1 ;
expr1 ::=
NIL | BOOL_CONST | INT_CONST | CHAR_CONST | <etc> ;
Run Code Online (Sandbox Code Playgroud)
这使得语法明确,并且只是右递归,这可以由我所知道的所有解析器生成器处理.
这个语法的一个消极方面是你没有任何优先权,但Java CUP可能有另一种方法来指定优先级.
编辑:修复了第一个语法规则.