Bison,C++ GLR 解析:如何强制移位\减少冲突?

sla*_*sav 5 c++ bison glr

如何强制通过 GLR 方法解决 shift\reduce 冲突?
假设我希望解析器为自己解决右移运算符和模板参数的两个右尖括号之间的冲突。我让词法分析器将 2 个连续的“>”符号作为单独的标记传递,而不将它们合并为一个“>>”标记。然后我将这些规则放在语法中:

operator_name:  
     "operator" ">"  
   | "operator" ">" ">"  
;  
Run Code Online (Sandbox Code Playgroud)

我希望这是一个转变\减少冲突。如果我有具有左结合性的 ">" 的标记声明,则不会发生冲突。所以我必须删除标记优先级\关联性声明,但这会导致许多其他冲突,我不想通过为每个冲突规则指定上下文优先级来手动解决这些冲突。那么,有没有办法在声明令牌的同时强制转换\减少冲突?

Tav*_*nes 2

我相信对operator_name 的规则使用上下文相关的优先级是可行的。

更新的标准指定的 C++ 语法实际上修改了语法以接受 >> 标记作为关闭两个打开的模板声明。我建议遵循它以获得标准行为。例如,必须注意“x >> y”不会被解析为“x >> y”,还必须确保“foo<bar<2 >> 1>>”无效,而“foo< bar<(2 >> 1)>>" 有效。