ANTLR3 NoViableAltException

时间:2014-04-09 09:27:31

标签: antlr antlr3 antlrworks

这是我的语法中出现错误的部分:

expr : func_name '(' constant (',' constant)* ')' ;

constant
    :    '"' (~'"')* '"';

WS      :      (' '|'\t')+ {skip();} ;

错误与文本的这一部分有关:

"w9ygS99Qp_", "vuPfq6YcbX"

ANTLRWorks的解释器为我提供了下一个叶子,其节点常量为父:

"
w9ygS99Qp_",
"

然后是NoViableAltException错误。

通常,它应该有这样的叶子:

"
w9ygS99Qp_
"

显然,问题是_之前的_,因为我试图压制_,但是当te解析器遇到下一个_时会出现同样的错误。“

1 个答案:

答案 0 :(得分:0)

您的constant应该是词法分析器规则,而不是解析器规则。在解析器规则中,~'"'匹配除双引号令牌之外的任何令牌匹配任何charatcer ,但双引号char除外。

请改为:

expr : func_name '(' Constant (',' Constant)* ')' ;

Constant
    :    '"' (~'"')* '"';
  

好的,因此我必须在Java中编译语法,然后在Java中测试它,如果我理解得好的话?

是的,或使用ANTLRWorks'而是调试器。调试器就像一个魅力。

要在普通Java中测试,请执行以下操作:

import org.antlr.runtime.*;

public class Main {
  public static void main(String[] args) throws Exception {
    TLexer lexer = new TLexer(new ANTLRStringStream("name(\"w9ygS99Qp_\", \"vuPfq6YcbX\")"));
    TParser parser = new TParser(new CommonTokenStream(lexer));
    parser.expr();
  }
}
  

也许我应该使用ANTLR4,才能正确使用ANTLRWorks?

如果您可以选择使用ANTLR3或ANTLR4,那么请选择ANTLR4。请注意,ANTLR4用于ANTLR4语法的新(重写)版本:http://tunnelvisionlabs.com/products/demo/antlrworks