Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 野牛,C++;GLR解析:如何强制移位\减少冲突?_C++_Bison_Glr - Fatal编程技术网

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

C++ 野牛,C++;GLR解析:如何强制移位\减少冲突?,c++,bison,glr,C++,Bison,Glr,如何强制通过GLR方法解决shift\reduce冲突? 假设我想让解析器自己解决右移运算符和模板参数的两个右尖括号之间的冲突。我让lexer将两个连续的“>”符号作为单独的标记传递,而不将它们合并为一个“>>”标记。然后我把这些规则放到语法中: operator_name: "operator" ">" | "operator" ">" ">" ; 我希望这是一个转变\减少冲突。如果我有带左关联性的“>”的令牌声明,这不会是冲突。因此,我必须

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

operator_name:  
     "operator" ">"  
   | "operator" ">" ">"  
;  
我希望这是一个转变\减少冲突。如果我有带左关联性的“>”的令牌声明,这不会是冲突。因此,我必须删除token preference\associativity声明,但这会导致许多其他冲突,我不想通过为每个冲突规则指定上下文优先级来手动解决这些冲突。那么,有没有一种方法可以在声明令牌时强制移位\减少冲突?

我相信在运算符名称的规则上使用会起作用

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

我在Yacc(类似于Bison)工作过,有类似的场景

标准语法有时被称为“语法引导的语法分析”

这种情况有时被称为“语义引导的解析”

例如:

...
// shift operator example
if ((x >> 2) == 0)
...
// consecutive template closing tag example
List<String, List<String>> MyList =
...
。。。
//轮班操作员示例
如果((x>>2)==0)
...
//连续模板结束标记示例
列表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 ">"
;  
运算符表达式示例:
“左值”|
左值“&&”左值|
;  
模板参数:
标识符|
模板\声明\示例|
数组声明|
其他类型声明
;  
模板\声明\示例:
标识符“”
;  

欢呼。< /P>“+ 1”作为“>”作为单独的令牌而不是移位运算符或模板结束标记令牌。对于“-”也会发生同样的情况,无论是负号还是减法运算,我记得我在C#和Java中使用了这种技术,但是这些解析器是基于ANTLR的,而且比较简单,尽管也有一些技巧。事实证明,bison在指定上下文相关的优先级时考虑了冲突的解决。也就是说,如果我明确指定我希望第一条规则的优先级与第二条规则的优先级相同,以便产生移位\减少冲突,那么bison会选择移位,而不是让冲突在运行时由glr解决。好的,我使用了操作符示例来澄清这一情况。考虑到“我们的思维就像一个编译器”,我同意,有一种方法我们可以通过使用无限前瞻来影响语法分析。但在本例中,对于glr,bison在拆分解析堆栈以解决某些冲突时会推迟所有语义操作,并在恢复到确定性状态时执行这些操作,因此此时影响语法分析为时已晚。