这是我的语法中出现错误的部分:
expr : func_name '(' constant (',' constant)* ')' ;
constant
: '"' (~'"')* '"';
WS : (' '|'\t')+ {skip();} ;
错误与文本的这一部分有关:
"w9ygS99Qp_", "vuPfq6YcbX"
ANTLRWorks的解释器为我提供了下一个叶子,其节点常量为父:
"
w9ygS99Qp_",
"
然后是NoViableAltException错误。
通常,它应该有这样的叶子:
"
w9ygS99Qp_
"
显然,问题是_之前的_,因为我试图压制_,但是当te解析器遇到下一个_时会出现同样的错误。“
答案 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