c++ - 我究竟什么时候可以使用期望运算符?

标签 c++ parsing c++14 boost-spirit boost-spirit-x3

我正在使用 boost spirit x3 开发解析器。我完成了语法,解析器按预期进行了解析。现在我想添加错误处理,所以我必须在我的语法中添加期望点。 我的问题是什么时候可以使用期望运算符 > 而不是“后跟”运算符 >>? 如果 a >> b 从未出现在语法的另一部分中,我是否只能像 a > b 那样使用它?

最佳答案

期望运算符实质上禁用了回溯。如果 b 必须始终跟在 a 之后,那么现在是使用期望点的好时机:>。如果有一些逻辑组合可以导致 a 后跟其他内容,则不应使用期望,而应使用 >>>

如果您的语法有替代方案,您需要特别注意您没有打败有效的回溯。

例如,如果您正在编写一个语言解析器,要求将 if 语句的条件表达式放在括号中,则有效的语法可能包括:

if_statement = lit("if") > '(' > statement > ')';

if 是关键字,它后面必须跟(if(< 之间可能有空格 但关键字 if 后面必须跟一个 (

(注意:实际情况是语法比这复杂一点。对于 if 作为关键字,它不能只匹配以字母 i 和 f 开头的一些标记)

如果您知道在遇到规则时 a 必须始终跟在 b< 之后,您可以在语法中使用 a > b/。您可能在整个语法的其他地方有一个 a >> b

关于c++ - 我究竟什么时候可以使用期望运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38942583/

相关文章:

java - xml dom解析器在java中按名称查找标签

Android:RSS 解析在特殊字符处停止

php - 如何提取 PHP DOMXpath 中的混合内容?

c++ - QT C++应用程序在单一计时器中崩溃并连接

c++ - 类型到值元函数可以用作 C++14 中的变量别名吗?

c++ - 将椭圆转换为折线

c++ - boost 使用 struct 中包含的 typedef 定义的 native 类型的序列化

c++ - 在 C++ 中调用作为参数传递的同一模板函数的两个版本

c++ - 我如何在 VC++ 中使用 _W64 和 __w64?

c++ - OS X 上 Eclipse 中的 "Symbol ' cin ' can not be resolved"错误