2011-12-31 40 views
1

我正在用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有選擇,在它的右邊表達再次分配(即,後綴和賦值運算符如下)如果它被鏈接起來。

任何想法我的理解有什麼問題?

回答

1

如果我喂解釋與任一輸入,...

不要使用ANTLRWorks'解釋:它是越野車,而忽視任何類型的謂語。使用它的調試器:它完美地工作。

如果輸入可以作爲postfixExpression讀取,它將檢查postfixExpression之後的下一個標記是否是賦值運算符之一,如果是,則它會將該規則解析爲assignmentExpression。

你是對的。

編輯[解決]現在,我可以實現這個解決方案的另一個問題:assignExpression必須選擇它的右手錶達式是再次賦值(即後綴和賦值運算符如下),if它被鏈接起來。

這是怎麼回事?