转移/减少冲突错误

时间:2018-03-18 01:49:40

标签: bison ambiguity shift-reduce-conflict

我收到20个移位/减少冲突错误。我通过单独声明它们来处理运算符优先级。我不确定exprList和propertyList,我尝试了不同的版本,但错误不会改变。

%#include<studio.h>


void yyerror( const char *s)
{
printf("%s\n",s);
}
%}
%token tFOR tIN tFUNCTION tSEMICOLON tLPAR tLBRKT tLBRACE tCOLON tINT 
tREAL tSTRING tWHILE tVAR tELSE tCOMMA tRPAR tRBRKT tRBRACE tEQ tNOT tIF  
tIDENT
%token tGT
%token tLT
%token tEQCHECK
%left tPLUS tMINUS
%left tSTAR
%%
statementList:statement|statementList statement | statementList 
tSEMICOLON statement;
statement: assign | if | expr |statementBlock | while |for | functionCall 
| functionDeclaration;
assign: tIDENT tEQ expr | tVAR tIDENT tEQ expr;
if: ifPart elsePart;
ifPart: tIF tLPAR expr tRPAR statementBlock;
elsePart: tELSE statementBlock;
while: tWHILE tLPAR expr tRPAR statementBlock;
for: tFOR tLPAR tVAR tIDENT tIN expr tRPAR statementBlock | tFOR tLPAR 
expr tRPAR statementBlock;
functionDeclaration: tFUNCTION tIDENT tLPAR exprList tRPAR statementBlock
                        | tFUNCTION tIDENT tLPAR tRPAR statementBlock;
statementBlock: tLBRACE statementList tRBRACE;
functionCall:tIDENT tLPAR exprList tRPAR | tIDENT tLPAR tRPAR;
expr: tIDENT | tSTRING |tLBRKT tRBRKT | tLBRKT exprList tRBRKT
        |tLBRACE tRBRACE | tLBRACE propertyList tRBRACE | tNOT expr |
 expr tPLUS term | expr tMINUS term | term |
 expr tEQCHECK expr | expr tLT expr | expr tGT expr;
exprList: expr | exprList tCOMMA expr;
propertyList: tIDENT tCOLON expr
                | propertyList tCOMMA tIDENT tCOLON expr;
term:term tSTAR factor | factor;
factor: tREAL| tINT;

%%

1 个答案:

答案 0 :(得分:0)

%token未声明运算符的优先级值。因此tLTtGTtEQCHECK没有优先级声明。 (事后我才意识到tNOT也没有。)

另一方面,您已声明tPLUStMINUStSTAR的优先级,但这些定义是不必要的(并且未使用),因为您的语法已经明确了它们的优先级。

但是,我认为factor的定义中存在错误:它位于优先级链的底部,因此它应包含所有操作数语法。情况似乎并非如此;实际上,我没有看到任何可以接受括号表达式的生成(例如2 * (3 + 4)),我不知道你希望表达式包含函数调用。

您应该决定是否使用优先级声明,并且要么始终如此(通常更容易),要么根本不这样做。查看有关此主题的课程材料可能会有所帮助;如果没有,网上有很多例子。

相关问题