报告与 TatSu 中一样多的不同语法错误

问题描述

我正在尝试为首先由 TatSu 解析然后解释的语言实现一个解释器。我想向我的最终用户提供我的解释器一次报告尽可能多的语言源中包含的潜在错误功能包括由底层 TatSu 解析器引发的 FailedParse 错误

我所知道的唯一方法是 TatSu 只生成一个 FailedParse 异常,然后停止解析。

有没有办法包装 TatSu 解析器,使其继续解析源代码并报告源代码中任何进一步的潜在语法错误

解决方法

您需要错误恢复。您可以在网上阅读有关该主题的信息。

TaTsu 不会自行进行错误恢复,仅提供部分支持。

这就是想法。鉴于语法的这一部分:

block = {statement ';'}+
statemtent =
    | if_statement
    | expression
    ;

您更改语法以添加错误恢复规则。

block = {statement ';'}+
statemtent =
    | if_statement
    | expression
    | statement_error
    ;

statement_error = ->&';' ;  # skip until a semicolon is seen

可以在整个语法中应用相同类型的恢复。

然后,在语义定义中,解析器将为每个 xxx_error 规则记录一条错误消息。

还有其他安排规则的方式,“skip” (->) 表达式的放置位置随心所欲。

TatSu 可以为错误恢复提供更多支持,它可能会从解决 #203