Bison Java cup:转移/减少冲突
我正在尝试使用JFlex和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
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
。运算符是一个字段选择器,我们可以将其视为不同后缀运算符的集合,每个后缀运算符对应于相应组合类型的每个成员名称
这就是简单的答案。只要我们说字段选择器具有形式
点标识符
,歧义就消失了。好的,感谢您的清晰简洁的解释。我要回顾一下生产规则。