ANTLR 4:我如何知道是否所有输入都已解析?

ANTLR 4: How do I know if all the input was parsed?

如果我的输入是 "ab" 并且解析正在寻找 "a",它会按预期识别 "a",但我需要尾随 "b" 才能产生错误。我该如何测试?

如果我没记错的话,您可以在 Antlr 语法中使用 actions,它类似于:

grammar Expr;       
prog:   a b;
a:  'a';
b: 'b'{throw new Exception();};

解析器看到 b 的有效声明后将抛出错误。除了抛出错误之外,您还可以打印出一些调试信息。

词法分析器在源输入的末尾生成一个 EOF 标记。要强制处理所有输入,需要将 EOF 作为主要解析器规则的一部分:

r : a+ EOF ;
a : A ;
b : B ;
A : 'a' ;
B : 'b' ;

解析器,从规则 r 开始,输入 'abaab',将抛出一个无法识别的输入错误 - 实际上是两个。默认的解析器错误策略将尝试跳过有限数量的连续未知标记 - 一个 IIRC - 并尝试与输入标记流重新同步。在这种情况下,它将成功重新同步,首先使用 A 令牌,然后使用 EOF 令牌。

可选地,使用

  1. Parser.addErrorListener(...) 添加您自己的错误报告器(扩展 BaseErrorListener)
  2. Parser.setErrorHandler(...) 添加您自己的错误恢复策略(扩展 DefaultErrorStrategy)