2015-04-02 78 views
1

我試圖解析這樣的事情,遞歸表達規則返回null

! (a="1" AND b="2")

但是,'!' expression先進行處理,所以它會成爲!(a="1" AND b="2")expression部分的價值將變爲空。 (因爲它還沒有處理)

任何想法?這似乎是一個普遍的問題。

附加規則:

expression returns [String value] 
: StringLiteral 
{ $value = $StringLiteral.text; } 

| IntegerLiteral 
{ $value = $IntegerLiteral.text; } 

| Identifier '=' StringLiteral 
{ $value = $Identifier.text + ":" + $StringLiteral.text; } 

| Identifier '=' IntegerLiteral 
{ $value = $Identifier.text + ":" + $IntegerLiteral.text; } 

| '!' expression 
{ $value = " ! " + $expression.value; } 

| '(' expression ')' 
{ $value = '(' + $expression.value + ')'; } 

| le = expression AND re = expression 
{ $value = $le.value + " AND " + $re.value; } 

| le = expression OR re = expression 
{ $value = $le.value + " OR " + $re.value; } 
; 

回答

1

這只是一些命名混亂:

expression returns [String value] // A 
    ... 

    | '!' expression 
    { $value = " ! " + $expression.value; } 
; 

因爲你的詞法規則被稱爲expression,$值$和參考expression.value以相同的變量。在設置它之前,您正在閱讀它,結果爲null值。

你想要的是:

expression returns [String value] // A 
    ... 

    | '!' e = expression 
    { $value = " ! " + $e.value; } 
; 
+0

偉大的答案!我和parens有同樣的問題,並解決了它們! – daisy 2015-04-02 15:13:18