尝试通过更改语法来解决 Shift Reduce 冲突
Trying to Resolve Shift Reduce Conflicts by Changing Grammar
给定以下语法规范:
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 */
有什么帮助吗?
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 */
给定以下语法规范:
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 */
有什么帮助吗?
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 */