我在 Yacc(类似于 Bison)工作,有类似的场景。
有时,标准语法被称为“由语法指导的解析”。
这种情况有时被称为“语义指导的解析”。
例子:
...
// shift operator example
if ((x >> 2) == 0)
...
// consecutive template closing tag example
List<String, List<String>> MyList =
...
让我们记住,我们的大脑就像编译器一样工作。人脑可以编译这个,但以前的语法不能。嗯。让我们看看人类的大脑是如何编译这段代码的。
如您所知,连续的“>”和“>”标记之前的“x”表示表达式或左值。头脑认为“两个连续的大于符号,在一个表达式之后,应该成为一个单一的移位运算符标记”。
对于“字符串”标记:“两个连续的大于符号,在类型标识符之后,应该成为两个连续的模板结束标记标记”。
我认为这种情况不能通过通常的运算符优先级、移位或减少,或者只是语法来处理,而是使用(“hacking”)解析器本身提供的一些函数。
我在您的示例语法规则中没有看到错误。“操作员”符号避免混淆您提到的两种情况。应该关注的部分是使用移位运算符的语法,以及使用连续的模板结束标记。
operator_expr_example:
lvalue "<<" lvalue |
lvalue ">>" lvalue |
lvalue "&&" lvalue |
;
template_params:
identifier |
template_declaration_example |
array_declaration |
other_type_declaration
;
template_declaration_example:
identifier "<" template_params ">"
;
干杯。