簡體   English   中英

ANTLR4 中關於立即左遞歸的錯誤

[英]Error about Immediate left recursion in ANTLR4

我在 a.g4 文件中寫了以下語法:

expr
    :function=expr'('((arg',')*arg)?')'                             #callFun
    |object=expr'.'SYMBOL                                           #objCall
    |coll=expr'['arg']'                                             #collage
    |varId=SYMBOL                                                   #varValue
    |(expr)                                                         #brackets
    |expr ADD ADD                                                   #lastInc
    |expr SUB SUB                                                   #lastDec
    //2
    |ADD ADD <assoc=right> expr                                     #postInc
    |SUB SUB <assoc=right> expr                                     #postDec
    |NOT <assoc=right> expr                                         #not
    |SUB <assoc=right> expr                                         #negative
    |'new' expr                                                     #createObj
    //3
    |expr MUL expr                                                  #mul
    |expr DIV expr                                                  #div
    |expr MOD expr                                                  #mod
    //4
    |expr ADD  expr                                                 #add
    |expr SUB  expr                                                 #sub
    //5
    |expr LMOVE expr                                                #lMove
    |expr RMOVE expr                                                #rMove
    //6
    |expr LESS expr                                                 #less
    |expr LESS EQUAL expr                                           #lessEqual
    |expr GREATER expr                                              #greater
    |expr GREATER EQUAL expr                                        #greaterEqual
    //7
    |expr EQUAL EQUAL expr                                          #equal
    |expr NOT EQUAL expr                                            #notEqual
    //8
    |expr AND ADD expr                                              #and
    //9
    |expr OR OR expr                                                #or
    //10
    |expr '?' <assoc=right> exprA = expr':'exprB = expr             #trueAfalseB
    //11
    |expr EQUAL <assoc=right> expr                                  #putIn
    |expr ADD EQUAL <assoc=right> expr                              #addPutIn
    |expr SUB EQUAL <assoc=right> expr                              #subPutIn
    |expr MUL EQUAL <assoc=right> expr                              #mulPutIn
    |expr DIV EQUAL <assoc=right> expr                              #divPutIn
    |expr MOD EQUAL <assoc=right> expr                              #modPutIn
    |expr LMOVE EQUAL <assoc=right> expr                            #lMovePutIn
    |expr RMOVE EQUAL <assoc=right> expr                            #rMovePutIn
    //12
    |THROW <assoc=right> expr                                       #throw
    //13
    |expr','expr                                                    #comma
    ;

如果我沒記錯的話,這個語法中只有立即左遞歸。但是有一個錯誤消息:“以下規則集是相互左遞歸的[expr]”。為什么?

正如 Kaby76 在評論中提到的那樣,這個替代方案:

expr
 : ...
 | (expr)
 | ...
 ;

是原因。 您可能打算這樣做:

expr
 : ...
 | ‘(‘ expr ‘)’
 | ...
 ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM