试图通过改变语法来解决转移减少冲突

时间:2015-10-02 01:59:00

标签: c parsing bison yacc lalr

给出以下语法规范:

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

这些是我在YACC / BISON计划中使用的规则。我有转换/减少冲突。

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 个答案:

答案 0 :(得分:2)

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