2013-02-26 94 views
0

更新: 有什麼方法可以在解析器語法中重新使用規則嗎?也許我對ANTLR樹解析器的理解不正確。我認爲ANTLR樹解析器是另一種解析器。我仍然需要制定正確的規則來滿足我的要求。如果是的話,AST的建議是什麼?我已經生成了正確的AST結構,但在樹解析器中似乎沒有用處。如何在ANTLR 3樹分析器中表示多個節點

爲什麼 ^(OR first=andExp other=andExp*) 不能wrtten到 andExp (OR^ andExp)* 在樹分析器?我想我沒有得到編寫樹解析器的關鍵點。

我想用Antlr3編寫一個SQL風格條件表達式分析器。 它需要支持像

a = 1 and b = 2 and c = 3 

我已經完成了詞法和語法分析器,但我有問題,當我根據AST創建樹分析器。

目前只支持像a = 1 and b = 2明確的2個節點,但不能支持a = 1 and b = 2 and c = 3

貌似^(OR first=andExp other=andExp*)是不正確的,但我不知道如何修改它。由於我是ANTLR的新手,所以我檢查了很多示例來完成我的樹分析器,但仍然不知道如何在ANTLR樹分析器中表示多個節點。有人可以幫我解決它嗎?任何意見都表示讚賞。

我的詞法分析器和解析器可以在下面的URL中找到。

simple criteria expression parser with antlr3

這裏是我的樹分析器:

tree grammar CriteriaExpressionEval; 

options { 
    language = Java; 
    tokenVocab = CriteriaExpression; 
    ASTLabelType = CommonTree; 
} 

@header {package com.antlr;} 


eval 
    : 
    expression 
    ; 

expression returns[String expStr] 
    : ^(OR first=andExp other=andExp*) 
     { 
     $expStr = $first.addExpStr + " " + $OR.text + " " + $other.addExpStr; 
     System.out.println("expression -- ^(OR first=andExp other=andExp*) [" + $expStr + "]"); 
     } 
    |andExp 
     { 
     $expStr = $andExp.addExpStr; 
     System.out.println("expression -- andExp [" + $expStr + "]"); 
     } 
    ; 

andExp returns[String addExpStr] 
    : ^(AND left=subcond right=subcond*) 
     { 
     $addExpStr = $left.subCondStr + " " + $AND + " " + $right.subCondStr; 
     System.out.println("andExp -- ^(AND left=subcond right=subcond*) [" + $addExpStr + "]"); 
     } 
    |subcond 
     { 
     $addExpStr = $subcond.subCondStr; 
     System.out.println("andExp -- subcond [" + $addExpStr + "]"); 
     } 
    ; 

subcond returns[String subCondStr] 
    : LPAREN expression RPAREN 
     { 
     $subCondStr = "(" + $expression.expStr + ")"; 
     System.out.println("subcond -- LPAREN expression RPAREN [" + $subCondStr + "]"); 
     } 
    |atom 
     { 
     $subCondStr = $atom.atomStr; 
     System.out.println("subcond -- atom [" + $subCondStr + "]"); 
     } 
    ; 

atom returns[String atomStr] 
    : 
    prop=EXPR OPERATOR val=EXPR { $atomStr = $prop.text + $OPERATOR.text + $val.text; } 
    ; 

回答

1

這聽起來像你不明白你所創建的樹的結構。我建議在您的樹上打印toStringList()以顯示結構。

相關問題