【问题标题】:How to resolve shift reduce conflicts in my grammar?如何解决移位减少我的语法冲突?
【发布时间】: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


【解决方案1】:

你的语法是模棱两可的,而且是左右递归的。根据我对解析器的(有限)知识,我知道大多数解析器生成器都无法解析。

这是模棱两可的,因为val_expr ADD val_expr SUB val_expr可以解析为:

       ADD
      /   \
val_expr  SUB
         /   \
   val_expr  val_expr

        SUB
       /   \
     ADD  val_expr
    /   \
val_expr  val_expr

我从未使用过 Java CUP,但这是我使用另一个解析器生成器做类似事情的方法:

val_expr ::=
    expr1 (SUB | ADD | <add all your operators here>) val_expr
    | expr1 ;

expr1 ::=
    NIL | BOOL_CONST | INT_CONST | CHAR_CONST | <etc> ;

这使得语法明确且只有右递归,我知道的所有解析器生成器都可以处理。

这个语法的一个缺点是你没有任何优先级,但是 Java CUP 可能有另一种方式来指定优先级。

编辑:修正第一条语法规则。

【讨论】:

  • 我的语法实际上还有其他一些问题,当我解决了这些问题后,所有的冲突都“自动”消失了。但是,根据您的帖子,我也更改了(并使其更漂亮)我的语法。谢谢,我学到了新东西!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多