首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >移位/减少冲突错误

移位/减少冲突错误
EN

Stack Overflow用户
提问于 2018-03-18 01:49:40
回答 1查看 116关注 0票数 1

我收到一个20班/减少冲突错误。我通过分别声明操作符优先级来处理它们。我不确定exprList和propertyList,我尝试了它们的不同版本,但是错误不会改变。

代码语言:javascript
运行
复制
%#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;

%%
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-18 03:09:52

%token不为运算符声明优先级值。因此,tLTtGTtEQCHECK没有优先级声明。(正如我后来意识到的那样,tNOT也没有。)

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

但是,我认为在您对factor的定义中有一个错误:它位于优先级链的底部,所以它应该包含所有的操作数语法。情况似乎并非如此;实际上,我没有看到任何产品会接受带括号的表达式(如2 * (3 + 4)),而且我也不知道如何期望表达式包括函数调用。

您可能应该决定是否使用优先级声明,或者一致地使用(这通常更容易),或者根本不使用优先级声明。复习有关这一主题的课程材料可能会有所帮助;如果没有,网络上有很多例子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49343767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档