Bison 21124-hw2.y:冲突:148班次/减少,1个减少/减少

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

这个野牛档案有什么问题

21124-hw2.y:冲突:148班次/减少,1个减少/减少 错误是这样的。哪里是模棱两可的?? 这个bison文件与flex文件连接,这些标记也是在flex中创建的。 İ在我写的这段代码中,没有包含其中的部分和主要部分。正如您在评论中所看到的,问题在于笨拙。我给了这些部分优先权,但它不起作用

        %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