1
1
在一般情况下,我不确定您是否能够使用解析器生成器做到这一点。至少,不是完全自动的。请考虑以下格式不正确的表达式:
解析器应该对此做些什么呢?当它遇到第一个非法的标记(右括号)时,它可能以某种方式猜测用户希望在某个地方有一个左括号,但是在哪里呢?它可以放在任何地方都会产生不同的值。 相反,它可以假装以前发生的一切从来没有发生过。结果会是
仍然是畸形的。 |
2
1
你需要在设计语法时考虑检查点。我所说的检查点是指c的分号、python的换行符或cobol的句点(例如)。此检查点是编译器恢复的数量,以便它们可以报告的不仅仅是发现的第一个错误。 我没有使用bison,但是yacc允许覆盖错误处理,我希望等效的gnu工具是 至少 像我们以前的unix旧车一样强大。 我以前用过配置文件yacc语法。假设您有以下格式正确的段:
由于一些奇怪的原因,用户错拼了“数量”,使其不正确。在回调的那一点上,您可以只抛出一个错误标志,在到达检查点之前阻止进一步的处理。您让解析器继续运行(捕捉并忽略进一步的错误),并确保回调不会对损坏语法中的任何虚假成功做出任何响应。 这可以简单地忽略到右大括号为止的所有其他节,甚至设置price的默认值,只忽略到换行符为止(这样至少可以得到一个部分格式的对象)。 但是,只要在到达检查点时重置错误标志,就可以继续处理。 我仍然会确保用户收到通知,有时会认为继续处理客户不想要的数据是错误的:-)。 |
Kris · Flex-新行无法识别 7 年前 |
omn_1 · yylineno为错误报告提供意外结果 7 年前 |
lluisrojass · 为什么Yacc/野牛规则没有用? 7 年前 |
gornvix · 分析多个文件时出现错误的lex状态 9 年前 |
Jason Kleban · 语法规范解决移位/减少冲突 12 年前 |
footy · 如何解决2+2和2++2冲突 12 年前 |
KAction · Bison意外的标识符错误 12 年前 |