我在关联性方面遇到麻烦。由于某种原因,我的=运算符比我的::运算符具有更高的优先级

例如,如果我有

“1::[] = []”

作为一个字符串,我会得到

1 = []::[]

作为我的表情,而不是

[1] = []

如果我的字符串是“1::2::[] = []”

我以为我会将其解析为exp1 EQ exp2,然后从那时开始它将解析exp1和exp2。但是它解析为exp1 COLONCOLON exp2代替

.
.
.

%nonassoc LET FUN IF
%left OR
%left AND
%left EQ NE LT LE
%right SEMI COLONCOLON
%left PLUS MINUS
%left MUL DIV
%left APP

.
.
.

exp4:
    | exp4 EQ exp9                { Bin ($1,Eq,$3) }
    | exp4 NE exp9                { Bin ($1,Ne,$3) }
    | exp4 LT exp9                { Bin ($1,Lt,$3) }
    | exp4 LE exp9                { Bin ($1,Le,$3) }
    | exp9                        { $1 }

exp9:
    | exp COLONCOLON exp9         { Bin ($1,Cons,$3) }
    | inner                       { $1 }

.
.
.

最佳答案

看来您可能有多个表达规则(expexp1exp2,... exp9),在这种情况下,操作的优先级由这些规则(哪个规则扩展到另一个规则)和%left的相互关系确定。 / %right声明在很大程度上不相关。

yacc优先级规则仅用于解决移位/减少冲突,如果语法没有移位/减少冲突(已通过使用多个规则解决歧义),则优先级将无效。

10-08 11:59