在Lexer或Push to Parser中允许无效输入?

时间:2015-08-30 06:00:05

标签: c# antlr4

我使用Antlr4构建解析器,我有一个实现问题。我已经看过一些语法,这些语法有一个默认的词法分析器规则,它将匹配最后的任何字符。我也看到了一些使用这样一条规则的建议,以便词法分析器匹配任何输入并创建一个令牌。这有效地将问题传递给解析器 - 我假设语法作者认为这是一个改进。

这是个好主意吗?如果是这样的话?

1 个答案:

答案 0 :(得分:1)

通过创建DefaultErrorStrategy的扩展并在解析器上设置它,您可以控制解析器处理错误输入的方式。可以跳过一些连续的未知/无效标记,并且解析器与输入流重新同步。在解析器上设置ParserErrorListener的实例以报告错误和恢复。

如果不感兴趣这些功能,则在词法分析器中删除未知/无效源文本,并在解析器上设置BailErrorStrategy。您仍然可以使用ParserErrorListener来报告解析器失败的点和环境。

适用于您的用例。

<强>更新

例如,假设输入数据流是已知的,可能会出现错误突发 - 无论是由于传输数据丢失还是解析用户正在主动键入的文本 - 用例目标是解析可以解析的内容和标记错误什么不能/被跳过。使用ErrorStrategy智能地重新同步解析器,以最小化每个错误突发的明显范围,甚至猜测丢失的令牌序列。

或者,在解析应该没有错误的文本时 - 用例目标是进行'准确'转换 - 然后立即终止解析任何错误是正确的。使用BailErrorStrategy和一个定制的ErrorListener来提供有关错误来源和性质的最恰当的详细信息。