0

所以我的语法出现了可怕的移位/减少错误。这是一个最小的测试用例:

%token PLUS MINUS TIMES DIVIDE NUMBER
%token EQUAL NEQUAL GREATER LESS NOT

%left   EQUAL   NEQUAL
%left   GREATER LESS
%left   PLUS    MINUS
%left   TIMES   DIVIDE
%left   UMINUS  NOT

%%

exp             : exp binop exp
                | unop exp
                | NUMBER
                ;

binop           : MINUS
                | PLUS
                | TIMES
                | DIVIDE
                | EQUAL
                | NEQUAL
                | GREATER
                | LESS
                ;

unop            : MINUS %prec UMINUS
                | NOT
                ;

%%

但是,通过实验,我设法使问题消失了:

%token PLUS MINUS TIMES DIVIDE NUMBER
%token EQUAL NEQUAL GREATER LESS NOT

%left   EQUAL   NEQUAL
%left   GREATER LESS
%left   PLUS    MINUS
%left   TIMES   DIVIDE
%left   UMINUS  NOT

%%

exp             : binops
                | unops
                | NUMBER
                ;

unops           : MINUS exp %prec UMINUS
                | NOT exp
                ;

binops          : exp MINUS exp
                | exp PLUS exp
                | exp TIMES exp
                | exp DIVIDE exp
                | exp EQUAL exp
                | exp NEQUAL exp
                | exp GREATER exp
                | exp LESS exp
                ;

%%

谁能解释为什么我首先会出现移位/减少错误以及为什么会这样?这甚至是一个适当的解决方案吗?如果不是,那是什么?

4

1 回答 1

2

在您的第一个语法中,优先级声明绝对没有任何作用。优先级仅适用于包含具有优先级的终端的替代方案;在您的第一个语法中,这将是 and 的产生binopunop。但是这些作品的替代品是完全明确的。优先级不需要决定减少PLUSbinop

在您的第二种语法中,优先关系确实有影响,因为竞争的模棱两可的替代方案(binops和的产生unops)直接包括终端。

换句话说,优先级不会“查看”非终端。

于 2013-06-02T04:58:17.010 回答