代码之家  ›  专栏  ›  技术社区  ›  Keep on trying

由于访问者中的分析错误,antlr4处理不完整的规则匹配

  •  0
  • Keep on trying  · 技术社区  · 6 年前

    我是antlr4的新手,我正在努力充分利用antlr从解析器错误中恢复并继续的能力。我发现,即使出现解析错误,它也可以继续访问解析树,并且它将匹配规则,但有时并非所有的规则元素都存在。这会导致访问者代码出现问题,因为我的代码希望规则匹配的所有元素都在那里,它会引发异常。

    我在考虑两种选择:

    1) 解析后,检查解析器。getNumberOfSyntaxErrors()>1,如果是,则不要继续访问解析树。这将停止抛出异常,但不会给用户尽可能好的反馈。antlr4可以很好地从错误中恢复,并且可以进入我试图解析的下一个独立部分,因此这比我想要的更强大。

    2) 我可以把自己包裹起来。访问()中的内容 异常并作出相应反应。我想这会有用的。

    但是,我想知道ctx中是否有什么东西会告诉我在解析树中它下面的内容是不完整的匹配?

    如果相关的话,我将python与antlr 4一起使用。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Mike Lischke    6 年前

    正如您所看到的,一旦遇到错误,ANTLR4就会尝试将输入流重新同步到规则结构。这通常是通过尝试检测单个丢失的令牌或单个附加令牌来实现的。其他一切通常都会导致错误节点一直到输入的末尾。

    当然,如果无法成功解析输入,则解析树将不完整,至少从错误的角度来看,这可能比实际错误所在的位置要早得多。这是因为变量lookahead导致的,它可能会消耗大量的输入来在解析过程的早期找到预测(因此可能会提前失败)。

    事实上,我建议遵循路径1)。一旦出现语法错误,解析树中就没有什么可以使用的了。这完全取决于语法结构,哪一部分将被成功解析(不要假设它将始终处于错误位置,正如我刚才解释的那样)。