什么时候可以使用期望运算符
When exactly can I use the expectation operator?
我正在研究一个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++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 一元*运算符的操作数是否期望一个 prvalue
- 灵气:用期望运算符替换序列时出错
- C++ iStream 运算符>>期望任意输入类型
- 为什么*=运算符没有按我期望的方式运行?
- 我没有得到我期望使用按位not运算符的答案.我很感激你的帮助
- 什么时候可以使用期望运算符