文法について次の仕様があるとします。
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 */
何か助けはありますか?