2016-12-07 98 views
0

我想要的記號來描述簡單的語法與ANDOR,但失敗並出現以下錯誤Antlr4:規則的以下幾組相互左遞歸

的規則下集是相互左遞歸

語法是以下:

expr: 
    NAME | 
    and | 
    or; 

and: 
    expr AND expr; 

or: 
    expr OR expr; 

NAME : 'A' .. 'B' + ; 
OR: 'OR' | '|'; 
AND: 'AND' | '&'; 

同時,下面的語法

expr: 
    NAME | 
    expr AND expr | 
    expr OR expr; 

NAME : 'A' .. 'B' + ; 
OR: 'OR' | '|'; 
AND: 'AND' | '&'; 

確實編譯。

爲什麼?

回答

1

ANTLR4僅支持直接左遞歸(這已經比以前的版本有所改進)。這意味着你可以在一個單一的規則已經離開了遞歸,但不能在多個規則(例如規則a使用規則b它採用a作爲一種替代的第一條規則

+0

但我需要爲每個操作都有合適的節點,比如分析樹中的AND和OR。如果有一條規則會解析所有這些規則,這是如何實現的? – Dims

+0

你可以通過查看現有的語法學到很多東西(例如https://github.com/antlr/grammars-v4)。您可以定義您的規則,以便將左遞歸部分最終放入單個規則中,或者可以以非遞歸方式進行操作。 –

0

前面已經提到:ANTLR4只支持直接左遞歸。你可以標記方案做出distiction在生成的訪問者或聽衆:

expr 
: NAME   #NameExpr 
| expr AND expr #AndExpr 
| expr OR expr #OrExpr 
; 

NAME : 'A' .. 'B' + ; 
OR : 'OR' | '|'; 
AND : 'AND' | '&'; 

注意'A'..'Z'+是老V3的語法,在V4你可以這樣做:[A-Z]+

參見:https://github.com/antlr/antlr4/blob/master/doc/parser-rules.md#alternative-labels