ANTLR 词法分析器根本无法向前看

标签 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。那么这里的问题是什么?

谢谢您的帮助!

最佳答案

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

当词法分析器看到输入 "aa" ,它尝试匹配 token AAA .当它失败时,它会尝试匹配任何其他也匹配 "aa" 的 token 。 (词法分析器不会回溯以匹配 A !)。由于这是不可能的,因此会产生错误。

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

关于ANTLR 词法分析器根本无法向前看,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12190501/

相关文章:

c - YACC 和 Lex 未定义对 `yylex' 的引用

java - 如何编写 ANTLR 语法翻译器以返回带有方法的 java 类?

java - 使用 ANTLR 的嵌套 boolean 表达式解析器

parsing - 如何为规则中可以匹配多个项目的每一项执行 ANTLR 解析器操作?

java - ANTLR 类转换异常

java - 如何让词法分析器解析java中的特定代码部分?

parsing - Yacc 和 Lex "syntax error"

c - 如何标记 SSA

lexer - 为什么是 'a' 。 ANTLR 中的 .'z' 匹配 $ 或 £ 等通配符

java - ANTLR忽略oracle脚本中的 "/"