2014-01-09 30 views
1

所以我的原則是令牌空當匹配語法規則,雖然符合

/* Addition and subtraction have the lowest precedence. */ 
additionExp returns [double value] 
    : m1=multiplyExp  {$value = $m1.value;} 
     (op=AddOp m2=multiplyExp)* { 
             if($op != null){ // test if matched 
             if($op.text == "+"){ 
              $value += $m2.value; 
             }else{ 
              $value -= $m2.value; 
             }           
             } 
             } 
    ; 

AddOp : '+' | '-' ; 

我的測試IST 3 + 4但op.text總是返回NULL,從來沒有一個字符。

有誰知道我如何測試AddOp的價值?

在從ANTLR4 Actions and Attributes的例子它應該工作:

stat: ID '=' INT ';' 
    { 
    if (!$block::symbols.contains($ID.text)) { 
     System.err.println("undefined variable: "+$ID.text); 
    } 
    } 
    | block 
    ; 
+0

有相當多的事情不正確,據我所知。 ANTLR工具是否接受你的語法?我認爲它應該會產生'additionExp'工具的錯誤,因爲actions/embedded-code必須放在替代的末尾。另外,'$ op!= null'也會觸發一個錯誤,不是?最後,你使用'=='比較字符串('$ op.text ==「+」'),這是不正確的(參見:http://stackoverflow.com/questions/767372/java-string-equals-與)。 –

+0

@BartKiers它可以正常工作,你可以從發佈的例子中看到。但是你在字符串比較上是正確的。我需要'.equals'而不是'=='。 – RedX

+0

你會驚訝有多少人發佈一些不反映他們實際代碼的代碼片段。 B.t.w.,我只是注意到你把嵌入式代碼放在'(...)*'之外。這應該在裏面。 –

回答

1

確定$op.text總是null?您的比較似乎檢查$op.text=="+"而不是檢查null

  1. 我總是從這些答案與您在使用ANTLR 4時,它會清理你的語法,並大大簡化代碼的長期維護你所有的行動代碼遷移到聽衆和/或觀衆的建議。

  2. 這可能是這裏的主要問題:在Java中比較String對象應使用equals進行:"+".equals($op.text)。請注意,我使用此順序來保證你永遠不會得到NullPointerException,即使$op.textnull

  3. 我建議刪除op=標籤並引用$AddOp

    1. 當您切換到使用偵聽器和訪問者時,刪除顯式標籤將稍微減小分析樹的大小。

    2. (僅與高級用戶相關)在某些涉及語法錯誤的邊界情況下,標記可能不會被分配,而對象仍然存在於分析樹中。特別是,當標籤分配給規則引用(您的op標籤分配給標記引用)時會發生這種情況,並且標記的規則中會顯示錯誤。如果通過偵聽器/訪問者中自動生成的方法引用上下文對象,即使未分配標籤,實例也可用,從而提高了報告某些錯誤詳細信息的能力。