给出以下语法规范:
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 */
有任何帮助吗?
答案 0 :(得分:2)
您的Statement
空制作品。你可能不打算;你当然不需要;这可能是你冲突的原因。
你的块生产是错误的。您需要定义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 */