【发布时间】:2012-02-01 14:41:58
【问题描述】:
如何强制通过 GLR 方法解决 shift\reduce 冲突?
假设我希望解析器自己解决右移位运算符与模板参数的两个右尖括号之间的冲突。我让词法分析器将 2 个连续的“>”符号作为单独的标记传递,而不将它们合并为一个“>>”标记。然后我把这些规则放到语法中:
operator_name:
"operator" ">"
| "operator" ">" ">"
;
我希望这是一个转变\减少冲突。如果我有具有左关联性的“>”的令牌声明,这不会是冲突。所以我必须删除令牌优先级\关联性声明,但这会导致许多其他冲突,我不想通过为每个冲突规则指定上下文优先级来手动解决这些冲突。那么,有没有办法在声明令牌的同时强制 shift\reduce 冲突?
【问题讨论】:
-
"+1" 表示将 ">" 视为单独的标记,而不是移位运算符或模板结束标记标记。 “-”也是如此,无论是负号还是减法运算符
-
是的,我记得在 C# 和 Java 中使用过这种技术,但是这些解析器是基于 ANTLR 的,而且它更简单,尽管也有一些技巧。