尝试通过更改语法来解决 Shift Reduce 冲突

Trying to Resolve Shift Reduce Conflicts by Changing Grammar

给定以下语法规范:

Statement → { Statement* }
      → VarDecl
      → if ( Exp ) Statement else Statement
      → while ( Exp ) Statement
      → System.out.println ( Exp ) ;
      → id = Exp ;
      → id [ Exp ]= Exp ;

这些是我想出的用于 YACC/BISON 程序的规则。不过我有 Shift/Reduce 冲突。

StatementList:
    '{' StatementList Statement '}'
     |  Statement
     ;

Statement: 
    |   VarDecl
    |   IF '('Exp')' StatementList ELSE StatementList
    |   WHILE'('Exp')' StatementList
    |   SOP'('Exp')' ';'
    |   ID '=' Exp ';'
    |   ID'['Exp']' '=' Exp';'
    ;

也试过这个语法:

CompoundStatement:
        '{' StatementList '}'

StatementList:
    StatementList Statement
    |   Statement
    ;

Statement: 
    |   VarDecl
    |   IF '('Exp')' Statement ELSE Statement
    |   WHILE'('Exp')' Statement
    |   SOP'('Exp')' ';'
    |   ID '=' Exp ';'
    |   ID'['Exp']' '=' Exp';'
    |   CompoundStatement
    ;

也没用。仍然有冲突。 (虽然这通过了我设置的测试用例)

这也没有:

StatementList
     : %empty /* Explicit empty production, bison 3.0+ */
     | StatementList Statement

Statement
     : '{' StatementList '}'
     | IF '('Exp')' Statement ELSE Statement
     | /* ... and the rest of the statements */

有什么帮助吗?

  1. Statement 的产生式为空。您可能不打算这样做;你当然不需要;这可能是你们冲突的原因。

  2. 你的积木制作是错误的。您需要定义 StatementList 以实现 Statement*,然后按照您的原始语法进行操作:

    StatementList
         : %empty /* Explicit empty production, bison 3.0+ */
         | StatementList Statement
    
    Statement
         : '{' StatementList '}'
         | IF '('Exp')' Statement ELSE Statement
         | /* ... and the rest of the statements */