我正在用D的ANTLR實現解析器。這種語言基於C語言,因此聲明和表達式存在一些歧義。試想一下:ANTLR語法和語法謂詞中的左值感知
a* b = c; // This is a declaration of the variable d with a pointer-to-a type.
c = a * b; // as an expression is a multiplication.
作爲第二個例子中只能出現在賦值表達式的右邊我試圖解決這個問題,下面的代碼片段:
expression
: left = assignOrConditional
(',' right = assignOrConditional)*
;
assignOrConditional
: (postfixExpression ('=' | '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '~=' | '<<=' | '>>=' | '>>>=' | '^^='))=> assignExpression
| conditionalExpression
;
assignExpression
: left = postfixExpression
(op = ('=' | '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '~=' | '<<=' | '>>=' | '>>>=' | '^^=')
right = assignOrExpression
)?
;
conditionalExpression
: left = logicalOrExpression
('?' e1 = conditionalExpression ':' e2 = conditionalExpression)?
;
至於我的理解去,這應該儘量避免含糊不清,但測試失敗。如果我向解釋器提供任何輸入,則從規則assignOrConditional開始,它將失敗並顯示NoViableAltException。 的投入是
a = b
b-=c
d
也許我誤解怎麼謂詞工作,因此這將是巨大的,如果有人可以糾正我的解釋代碼:如果輸入可以理解爲一個postfixExpression它會檢查postfixExpression之後的下一個標記是賦值運算符之一,如果是,則它會將該規則解析爲assignmentExpression。 (請注意,assignmentExpression和conditionalExpression運作良好)。如果下一個標記不是它們,它會嘗試將其解析爲conditionalExpression。
編輯 [解決]現在,有這種解決方案的另一個問題,我可以體會到:在assignmentExpression有選擇,在它的右邊表達再次分配(即,後綴和賦值運算符如下)如果它被鏈接起來。
任何想法我的理解有什麼問題?