相关疑难解决方法(0)

ANTLR词法分析器根本无法预测

我有以下语法:

rule: 'aaa' | 'a' 'a';
Run Code Online (Sandbox Code Playgroud)

它可以成功解析字符串'aaa',但它无法解析'aa'并出现以下错误:

line 1:2 mismatched character '<EOF>' expecting 'a'
Run Code Online (Sandbox Code Playgroud)

仅供参考,这是词法分析器的问题而不是解析器,因为我甚至没有调用解析器.主要功能如下:

@members {
  public static void main(String[] args) throws Exception {
    RecipeLexer lexer = new RecipeLexer(new ANTLRInputStream(System.in));
    for (Token t = lexer.nextToken(); t.getType() != EOF; t = lexer.nextToken())
      System.out.println(t.getType());
  }
}
Run Code Online (Sandbox Code Playgroud)

结果与更明显的版本相同:

rule: AAA | A A;
AAA: 'aaa';
A: 'a';
Run Code Online (Sandbox Code Playgroud)

显然,ANTLR词法分析器尝试将输入'aa'与失败的规则AAA匹配.除了ANTLR是一个LL(*)解析器或其他什么,词法分析器应该与解析器分开工作,它应该能够解决歧义.语法在良好的旧lex(或flex)下运行良好,但在ANTLR中似乎没有.那么这里的问题是什么?

谢谢您的帮助!

antlr lex lexer antlr3

4
推荐指数
1
解决办法
2269
查看次数

标签 统计

antlr ×1

antlr3 ×1

lex ×1

lexer ×1