我究竟什么时候可以使用期望运算符?
When exactly can I use the expectation operator?
我正在使用 boost spirit x3 开发解析器。我完成了语法,解析器按预期进行了解析。现在我想添加错误处理,所以我必须在我的语法中添加期望点。
我的问题是什么时候可以使用期望运算符 >
而不是 "followed by" 运算符 >>
?
如果 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
。
我正在使用 boost spirit x3 开发解析器。我完成了语法,解析器按预期进行了解析。现在我想添加错误处理,所以我必须在我的语法中添加期望点。
我的问题是什么时候可以使用期望运算符 >
而不是 "followed by" 运算符 >>
?
如果 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
。