2011-11-26 57 views
1

当我与输入执行以下语法(3),I获得该解析树:ANTLR递归

enter image description here

它不能识别的闭括号。可能是什么问题

term 
    : IDENT | '(' term ')' | INTEGER 
    ; 

INTEGER : '0'..'9'+; 
IDENT : ('a'..'z' | 'A'..'Z')('a'..'z' | 'A'..'Z' | '0'..'9')*; 
WS : (' ' | '\t' | '\r' | '\n' | '\f')+{$channel = HIDDEN;}; 
+0

恐怕你的图片链接不适合我,所以我不能确定你看到了什么行为。 – Gian

+0

我编辑了链接,谢谢 – akaya

回答

1

语法没有问题。看起来您正在使用Eclipse ANTLR插件,该插件依次使用ANTLRWorks的解释器。这个解释是出了名的越野车:如果你得到意想不到的行为,始终运行手动测试,或使用ANTLRWorks'调试程序,其调试输入"(3)"这样的:

enter image description here

要启动ANTLRWors调试器,选择菜单运行>>调试或按CTL + D

1

我认为这可能是UI中的一个错误。我认为解析器看到了)。你有没有尝试从Java调用解析器?

public static void main(String[] args) 
    throws Exception 
{ 
    // TODO Auto-generated method stub 
    ANTLRStringStream strstrm = new ANTLRStringStream("(3)"); 
    ffLexer lex = new ffLexer(strstrm); 
    CommonTokenStream tokStrm = new CommonTokenStream(lex); 
    ffParser prs = new ffParser(tokStrm); 
    prs.term(); 

} 

如果添加一个动作你的长期规则:

term 
    : IDENT | a='(' term b=')' {System.out.println($a.text + " " + $b.text);} | INTEGER 
    ; 

你应该得到的输出

() 

另外,如果你创建另一个解析器规则:

prog: term+; 

然后给出输入(3)(4)(5)解析树如预期