给定以下语法规范:
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 */
有什么帮助吗?