首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLR3 NoViableAltException

ANTLR3 NoViableAltException
EN

Stack Overflow用户
提问于 2014-04-09 09:27:31
回答 1查看 455关注 0票数 1

这是我语法中造成错误的部分:

代码语言:javascript
复制
expr : func_name '(' constant (',' constant)* ')' ;

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

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

这个错误是关于文本的这一部分:

代码语言:javascript
复制
"w9ygS99Qp_", "vuPfq6YcbX"

ANTLRWorks的解释器给出了下一个叶,其中有一个节点常量作为父级:

代码语言:javascript
复制
"
w9ygS99Qp_",
"

然后是一个NoViableAltException错误。

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

代码语言:javascript
复制
"
w9ygS99Qp_
"

显然,问题是“前面的_”,因为我试图抑制_,但是当te解析器遇到next _时也会出现相同的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-09 19:37:00

您的constant应该是lexer规则,而不是解析器规则。在解析器规则中,~'"'匹配除双引号以外的任何令牌。它与不匹配,除了双引号-char之外,任何字符符都不匹配。

这样做反而是:

代码语言:javascript
复制
expr : func_name '(' Constant (',' Constant)* ')' ;

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

好的,所以我必须用Java编译语法,然后用Java测试它,如果我理解得很好呢?

是的,或者使用ANTLRWorks的调试器代替。调试器工作起来很有魅力。

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

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22958226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档