这是我语法中造成错误的部分:
expr : func_name '(' constant (',' constant)* ')' ;
constant
: '"' (~'"')* '"';
WS : (' '|'\t')+ {skip();} ;这个错误是关于文本的这一部分:
"w9ygS99Qp_", "vuPfq6YcbX"ANTLRWorks的解释器给出了下一个叶,其中有一个节点常量作为父级:
"
w9ygS99Qp_",
"然后是一个NoViableAltException错误。
通常,它应该有这样的叶子:
"
w9ygS99Qp_
"显然,问题是“前面的_”,因为我试图抑制_,但是当te解析器遇到next _时也会出现相同的错误。
发布于 2014-04-09 19:37:00
您的constant应该是lexer规则,而不是解析器规则。在解析器规则中,~'"'与匹配除双引号以外的任何令牌。它与不匹配,除了双引号-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。注意,ANTLRWorks有一个新的(重写的)版本,用于ANTLR4语法:http://tunnelvisionlabs.com/products/demo/antlrworks
https://stackoverflow.com/questions/22958226
复制相似问题