2014-06-30 49 views
2

我在這裏使用C語法:https://github.com/antlr/grammars-v4/tree/master/c來解析表達式int a2 = 5;。 ANTLR版本是4.3。簡單C表達式的大解析樹

這裏的「5」匹配一個非常大的規則鏈:initializer->assignmentExpression->conditionalExpression->logicalOrExpression->logicalAndExpression-> ...大約10個以上-> primaryExpression->5

雖然解析最終是正確的,但這似乎是語法中的一個錯誤。有人可以提出修正或澄清?

Image of parse tree

回答

4

不,這是沒有任何錯誤。樹下越低意味着運算符的優先級越高。

編輯

,這些規則被鏈接一樣,可能是因爲特倫斯寫道從C11規範的語法事實(它是這麼說的語法的評論)。而在官方規格中,規則可能就是這樣寫的。但是,您可以用更緊湊的方式重寫語法。 ANTLR4允許直接遞歸規則,使得規則:

等同於以下單(ANTLR4)規則
expr 
: add 
; 

add 
: mult (('+'|'-') mult)* 
; 

mult 
: unary (('*'|'/') unary)* 
; 

unary 
: '-' atom 
| atom 
; 

atom 
: '(' expr ')' 
| NUMBER 
; 

expr 
: '-' expr 
| expr ('*'|'/') expr // higher precedence than rules starting with `expr` defined below 
| expr ('+'|'-') expr 
| '(' expr ')' 
| NUMBER 
; 
+0

我還有一個疑問:語法將'int a1;'解釋爲'declarationSpecfiers',即令牌'int'和'a1'被解釋爲'declarationSpecifier'。我期望'a1'被解釋爲'initDeclaratorList'的一部分。我通過改變'declaration'規則來解決這個問題,使用'initDeclarationList'而不是'initDeclarationList?'。這是好的還是這打破了別的東西? –

+0

@AnujKalia,嗯,不知道。您可以在存儲庫的跟蹤器上提出問題/問題:https://github.com/antlr/grammars-v4/issues –

0

語法可能被設計成不同的,雖然,造成不太深的結果。

例如,參見https://github.com/antlr/grammars-v4/blob/master/java/Java.g4#L497。這在一個規則中結合了許多優先級。我不確定是否可以爲C創建類似的規則(並且是可讀的),但它可能是可能的。

這種規則(包括直接左遞歸)在以前版本的Antlr4中不可用,因此C語法可能在此類規則不可用時創建。

+0

如果將所有不同的操作合併到一個規則中,則無法控制操作符優先級(更不用說可讀性語法)。 –

+0

@MikeLischke:但它似乎在所提到的Java語法中起作用(我也修改了它以用於我自己的語法)。正如我所提到的,可讀性可能會受到影響 – Onur

+1

@MikeLischke,你可以:下面是一個有效的ANTLR4規則,其中'*'和'/'比'+'和'-'具有更高的優先級,因爲它們是首先定義的:'e:e('*' |'/')e | e('+'|' - ')e | INT;' –