我正在尝试为首先由 TatSu 解析然后解释的语言实现解释器。我想向我的最终用户提供我的解释器一次报告尽可能多的语言源中包含的潜在错误的功能,包括底层 TatSu 解析器引发的 FailedParse 错误。
我知道的唯一方法是 TatSu 只生成一个 FailedParse 异常,然后停止解析。
有没有办法包装 TatSu 解析器,使其恢复解析源并报告源中任何进一步的潜在语法错误?
您需要错误恢复。您可以在 Web 上阅读有关该主题的信息。
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开始