【问题标题】:Bison, C++ GLR parsing: how to force shift\reduce conflict?Bison,C++ GLR 解析:如何强制转换\减少冲突?
【发布时间】:2012-02-01 14:41:58
【问题描述】:

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

operator_name:  
     "operator" ">"  
   | "operator" ">" ">"  
;  

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

【问题讨论】:

  • "+1" 表示将 ">" 视为单独的标记,而不是移位运算符或模板结束标记标记。 “-”也是如此,无论是负号还是减法运算符
  • 是的,我记得在 C# 和 Java 中使用过这种技术,但是这些解析器是基于 ANTLR 的,而且它更简单,尽管也有一些技巧。

标签: c++ bison glr


【解决方案1】:

我相信在 operator_name 的规则上使用 context-dependent precedence 会起作用。

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

【讨论】:

  • 事实证明,当您指定依赖于上下文的优先级时,bison 认为冲突已解决。也就是说,如果我明确指定我希望第一条规则的优先级与第二条规则的优先级相同,以便产生 shift\reduce 冲突,bison 会选择 shift 而不是让冲突由 glr 解决运行时。
【解决方案2】:

我曾在 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 ">"
;  

干杯。

【讨论】:

  • 好的,我使用运算符示例只是为了说明情况。考虑到“我们的思维就像编译器一样工作”,我同意,并且有一种方法可以通过使用无限前瞻来影响语法分析。但是在使用 glr 的这种情况下,bison 会在拆分解析堆栈以解决某些冲突时推迟所有语义操作,并在恢复到确定性状态时执行这些操作,因此此时影响语法分析为时已晚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多