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 Conflicts があります。

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 に答える