Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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
Bison Java cup:转移/减少冲突_Bison_Yacc_Shift Reduce Conflict_Cup - Fatal编程技术网

Bison Java cup:转移/减少冲突

Bison Java cup:转移/减少冲突,bison,yacc,shift-reduce-conflict,cup,Bison,Yacc,Shift Reduce Conflict,Cup,我正在尝试使用JFlex和Cup编写解析器,但在处理递归点符号(如具有递归属性访问的函数调用)时遇到了一些问题,如: var x = obj.property1.functionCall(p1, p2).property2; 以下是相关的解析器定义: unary_exp ::= postfix_exp | ADD2 unary_exp | SUB2 unary_exp | unary_operator unar

我正在尝试使用JFlex和Cup编写解析器,但在处理递归点符号(如具有递归属性访问的函数调用)时遇到了一些问题,如:

var x = obj.property1.functionCall(p1, p2).property2;
以下是相关的解析器定义:

unary_exp ::= postfix_exp
              | ADD2 unary_exp
              | SUB2 unary_exp
              | unary_operator unary_exp;

unary_operator ::=  ADD
                    | SUB
                    | BIT_NOT
                    | NOT;

postfix_exp ::= primary_exp
                | postfix_exp LPAR_SQ right_value_exp RPAR_SQ
                | postfix_exp LPAR optional_postfix_exp_list RPAR
                | postfix_exp DOT postfix_exp
                | postfix_exp SUB2
                | postfix_exp ADD2;

primary_exp ::= BOOL
                | STRING
                | INTEGER
                | NUMBER
                | NULL;
我得到了以下转换/减少冲突:

Warning : *** Shift/Reduce conflict found in state #190
  between postfix_exp ::= postfix_exp DOT postfix_exp (*) 
  and     postfix_exp ::= postfix_exp (*) LPAR optional_postfix_exp_list RPAR 
  under symbol LPAR
  Resolved in favor of shifting.

Warning : *** Shift/Reduce conflict found in state #190
  between postfix_exp ::= postfix_exp DOT postfix_exp (*) 
  and     postfix_exp ::= postfix_exp (*) LPAR_SQ right_value_exp RPAR_SQ 
  under symbol LPAR_SQ
  Resolved in favor of shifting.

Warning : *** Shift/Reduce conflict found in state #190
  between postfix_exp ::= postfix_exp DOT postfix_exp (*) 
  and     postfix_exp ::= postfix_exp (*) DOT postfix_exp 
  under symbol DOT
  Resolved in favor of shifting.

Warning : *** Shift/Reduce conflict found in state #190
  between postfix_exp ::= postfix_exp DOT postfix_exp (*) 
  and     postfix_exp ::= postfix_exp (*) ADD2 
  under symbol ADD2
  Resolved in favor of shifting.

Warning : *** Shift/Reduce conflict found in state #190
  between postfix_exp ::= postfix_exp DOT postfix_exp (*) 
  and     postfix_exp ::= postfix_exp (*) SUB2 
  under symbol SUB2
  Resolved in favor of shifting.

Error : *** More conflicts encountered than expected -- parser generation aborted

请有人向我解释如何处理这些冲突,或者在哪里可以找到使用java cup、yacc或bison的工作示例?

您的语法包括以下内容:

postfix_exp ::= postfix_exp DOT postfix_exp
你认为这准确吗?
的右操作数是否可以是任意后缀?如果是,那么
a.3
是什么意思?那么
x.false
呢?(一个
primary\u exp
是一个
postfix\u exp
,对吧?语法就是这么说的。)

离家近一点,
a.b++
的含义是什么?在某种意义上,
b++
的操作数吗?当然
b
a
成员的名字,而不是自变量

语法传达意义,即使它们不实现语义。它们指定表达式的不同部分相互关联的方式。(“Parse”和“parts”听起来很相似,因为动词“Parse”来自名词“part”,如“to split to parts”。)所以你应该努力使你的语法符合语言的结构

现在,每当您看到这样的产品时:

foo ::= foo OPERATOR foo;
你知道语法是模棱两可的。它是不明确的,因为它为
操作符
生成左关联和右关联解析。例如,如果
操作符
-
,它将把
(1-1)-1
(假设
foo
可以生成
1
)与
1-(1-1)
。语法歧义通常表现为语法表冲突

解决歧义很重要,因为这两个表达式具有不同的值。这就是为什么我们要么使用表达式类型的层次结构,要么使用运算符优先级声明。(因此我们知道如何解决关联性问题。)

但是在
运算符的情况下,我们实际上没有未指定关联性的二进制运算符。我们实际上根本没有二进制运算符,这就是为什么这里的产品名为
postfix\u exp
。运算符是一个字段选择器,我们可以将其视为不同后缀运算符的集合,每个后缀运算符对应于相应组合类型的每个成员名称


这就是简单的答案。只要我们说字段选择器具有形式
点标识符
,歧义就消失了。

好的,感谢您的清晰简洁的解释。我要回顾一下生产规则。