在阅读了 Spirit X3 关于错误处理的教程和一些实验之后。我得出了一个结论。
\n\n我相信 X3 中的错误处理主题还有一些改进的空间。从我的角度来看,一个重要的目标是提供有意义的错误消息。首先也是最重要的是添加一个将_pass(ctx)
成员设置为 false 的语义操作,\xe2\x80\x99 不会这样做,因为 X3 会尝试匹配其他内容。仅抛出 anx3::expectation_failure
会提前退出解析函数,即不尝试匹配其他任何内容。所以剩下的就是解析器指令expect[a]
和解析器operator>
以及手动抛出x3::expectation_failure
从语义操作中手动抛出。我确实相信有关此错误处理的词汇量太有限。请考虑以下 X3 PEG 语法行:
const auto a = a1 >> a2 >> a3;\nconst auto b = b1 >> b2 >> b3;\nconst auto c = c1 >> c2 >> c3;\n\nconst auto main_rule__def =\n(\n a |\n b |\n c );\n
Run Code Online (Sandbox Code Playgroud)\n\n现在对于表达式a
我不能使用expect[]
or operator>
,因为其他替代方案可能是有效的。我可能是错的,但我认为 X3 要求我拼写出可以匹配的备用错误表达式,如果它们匹配,它们可以抛出x3::expectation_failure
这很麻烦。
问题是,是否有一种好方法可以使用当前的 X3 设施通过 …