我想解析一个在ocamlyacc中的语法(几乎与常规的yacc相同),它支持没有运算符的函数应用程序(如Ocaml或Haskell)以及正常的分类二元和一元运算符。我得到了与' - '运算符的减少/减少冲突,可用于减法和否定。下面是语法的样品我使用:解决在yacc/ocamlyacc中减少/减少冲突
%token <int> INT
%token <string> ID
%token MINUS
%start expr
%type <expr> expr
%nonassoc INT ID
%left MINUS
%left APPLY
%%
expr: INT
{ ExprInt $1 }
| ID
{ ExprId $1 }
| expr MINUS expr
{ ExprSub($1, $3) }
| MINUS expr
{ ExprNeg $2 }
| expr expr %prec APPLY
{ ExprApply($1, $2) };
的问题是,当你得到这样的表达式“A - B”的分析器不知道这是否应该降低为“( - b)“(否定b,后面是申请)或”a - b“(减法)。减法减少是正确的。我如何解决冲突,支持该规则?
`%left APPLY` /`%prec APPLY`解决了`a b c` - 它的左联合(所以它的(a b)c)和较低优先级的含糊性。问题在于,优先规则不适用于表现为减少/减少冲突的歧义。 – 2011-10-06 17:59:03