Bison 21124-hw2.y:冲突:148班次/减少,1个减少/减少
这个野牛档案有什么问题 21124-hw2.y:冲突:148班次/减少,1个减少/减少 错误是这样的。哪里是模棱两可的?? 这个bison文件与flex文件连接,这些标记也是在flex中创建的。 İ在我写的这段代码中,没有包含其中的部分和主要部分。正如您在评论中所看到的,问题在于笨拙。我给了这些部分优先权,但它不起作用Bison 21124-hw2.y:冲突:148班次/减少,1个减少/减少,bison,yacc,Bison,Yacc,这个野牛档案有什么问题 21124-hw2.y:冲突:148班次/减少,1个减少/减少 错误是这样的。哪里是模棱两可的?? 这个bison文件与flex文件连接,这些标记也是在flex中创建的。 İ在我写的这段代码中,没有包含其中的部分和主要部分。正如您在评论中所看到的,问题在于笨拙。我给了这些部分优先权,但它不起作用 %token tFOR tIN tIF tFUNCTION tSEMICOLON tLPAR tLBRKT tSTAR tPLUS tLBRACE tLT tCO
%token tFOR tIN tIF tFUNCTION tSEMICOLON tLPAR tLBRKT tSTAR tPLUS tLBRACE tLT tCOLON tINT tREAL tSTRING tWHILE tVAR tELSE tEQCHECK tCOMMA tRPAR tRBRKT tRBRACE tGT tEQ tMINUS tNOT tIDENT
// these are tokens which i getting in flex
%left '+' '-' '!'
%left '*' "=="
%left '<' '>'
%left ';'
%left '='
%left '(' ')'
%left '{' '}'
%left '[' ']'
%left ',' ':'
// these re the prirotiries
%%
// down below all thing grammer part.
prog : statementList
;
statementList : statementList statement
| statementList ';' statement
| statement
;
statement : assign | if | expr | statementBlock
| while | for | functionCall | functionDeclaration
;
assign : tIDENT '=' expr
| tVAR tIDENT '=' expr
;
if : ifPart elsePart
;
ifPart : tIF '(' expr ')' statementBlock
;
elsePart : tELSE statementBlock
|
;
while : tWHILE '(' expr ')' statementBlock
;
for : tFOR '(' tIDENT tIN expr ')' statementBlock
| tFOR '(' tVAR tIDENT tIN expr ')' statementBlock
;
functionDeclaration : tFUNCTION tIDENT '(' exprList ')' statementBlock
| tFUNCTION tIDENT '(' ')' statementBlock
;
statementBlock: '{' statementList '}'
;
functionCall : tIDENT '(' exprList ')'
| tIDENT '(' ')'
;
// i think the problem is there
expr : tIDENT | tREAL | tINT | tSTRING |
| '[' ']' | '[' exprList ']'
| '{' '}' | '{' propertyList '}'
| '!' expr | expr '+' expr | expr '-' expr
| expr '*' expr | expr "==" expr
| expr '<' expr | expr '>' expr
//if there is the expr between '*' star should havpriority
;
exprList : expr | exprList ',' expr
;
propertyList : tIDENT ':' expr
| propertyList ',' tIDENT ':' expr
;
// this down below is main it say grammaticly correct or not?(i didnt wrote that part)
%%
%t当tVAR tELSE TechCheck tCOMMA tRPAR tRBRKT tSTAR Tprus tLBRACE Ttlt Tclon tIF t功能在tVAR tELSE TechCheck tCOMMA tRPAR tRBRKT TrbrBrace TgthTeq Tminu tTident时,为tIN t t t功能提供令牌t
//这些是我在flex中得到的代币
%左'+'''-''''
%左“*”==“
%左“
%左“;”
%左“=”
%左'('')
%左'{'}'
%左'['']'
%左','':'
//这些是prirotiries
%%
//下面是所有东西的语法部分。
程序:语句列表
;
语句列表:语句列表语句
|语句列表“;”陈述
|声明
;
语句:赋值| if | expr |语句块
|而| for | functionCall | functionDeclaration
;
分配:tIDENT“=”expr
|tVAR tIDENT“=”表达式
;
if:ifPart elsePart
;
ifPart:tIF'('expr')'语句块
;
elsePart:tELSE语句块
|
;
while:twile'('expr')'语句块
;
for:tFOR“(“tIDENT tIN expr”)”语句块
|t对于“(“tVAR tIDENT tIN expr”)”语句块
;
functionDeclaration:tFunctionTident'('exprList')'语句块
|t函数tIDENT'('')语句块
;
语句块:“{”语句列表“}”
;
函数调用:tIDENT'('exprList')'
|潮汐'('')'
;
//我认为问题就在那里
实验:tIDENT | tREAL | tINT | tSTRING|
|“['']”|“['exprList']”
|“{”}”|“{”propertyList'}”
| '!' expr | expr'+'expr | expr'-'expr
|expr'*'expr | expr“==”expr
|expr“”expr
//如果“*”之间有表达式,则星号应具有优先级
;
exprList:expr | exprList','expr
;
propertyList:tIDENT':'expr
|propertyList','tIDENT':'expr
;
//下面这个是主要的,它说语法正确与否?(我没有写那部分)
%%
问题在这里,在第一行引用的末尾:
expr : tIDENT | tREAL | tINT | tSTRING |
| '[' ']' | '[' exprList ']'
重复的|有效地创建了规则:
expr : %empty
这会立即导致大量冲突,特别是因为您允许分号是可选的:
statementList : statementList statement
| statementList ';' statement
| statement
如果您要求bison提供警告,则该错误(以及您可能需要考虑的许多其他警告)将立即显示:
bison -Wall ...
答案总是模棱两可的。@AntoineL:在这种情况下不是。语法只允许在复合语句中使用分隔语句块,因此您必须编写
if(cond){if(cond)..
,这是明确的,因为当我删除| tSTRING后修复它时,没有任何悬空.tIDENT | tREAL | tINT | tSTRING。您这样说谢谢!@rici