ANTLR lexer根本无法预测

时间:2012-08-30 05:38:54

标签: antlr lex antlr3 lexer

我有以下语法:

rule: 'aaa' | 'a' 'a';

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

line 1:2 mismatched character '<EOF>' expecting 'a'

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

@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());
  }
}

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

rule: AAA | A A;
AAA: 'aaa';
A: 'a';

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:6)

ANTLR生成的解析器是(或可以是)LL(*),而不是它的词法分析器。

当词法分析器看到输入"aa"时,它会尝试匹配标记AAA。当它无法执行此操作时,它会尝试匹配同样匹配"aa"的任何其他令牌(词法分析器不会回溯以匹配A!)。由于这是不可能的,因此会产生错误。

这通常不是问题,因为在实践中,通常会有某种标识符规则"aa"可以回归。那么,你试图解决的实际问题是什么,或者你只是对内部运作感到好奇?如果是第一个,请编辑您的问题并描述您的实际问题。