【发布时间】:2010-10-16 14:32:41
【问题描述】:
我正在编写一个从(简化的)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
本节的语法:
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
;
我怎样才能消除这种冲突?
谢谢。
【问题讨论】:
-
您可能应该用您正在使用的解析器生成器标记这个问题 - 或者至少在问题的某处提及它。
-
我提到了java cup,但是不能添加标签,因为你需要1.5k的声望才能添加新标签。
标签: compiler-construction syntax pascal shift-reduce-conflict