0

给定以下语法规范:

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 */

有什么帮助吗?

4

1 回答 1

3
  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 */
    
于 2015-10-02T02:16:34.347 回答