SMIE 的优先文法为每个标记分配一对优先级:左优先级与右优先级。
若标记 T1 的右优先级小于 T2 的左优先级,我们记为 T1 < T2。
可以把这个 < 理解为一种括号关系:若出现 ... T1 something T2 ...,
则应解析为 ... T1 (something T2 ...,而非 ... T1 something) T2 ...。
若为 T1 > T2,则对应后一种解释。若为 T1 = T2,
表示 T2 与 T1 属于同一语法结构,典型如 "begin" = "end"。
这样的优先级对足以表达中缀运算符的左结合、右结合,
以及括号式嵌套等多种常见情况。
接收一个 prec2 文法表 table,返回可用于 smie-setup 的关联表。
prec2 表本身由下面的函数构建。
接收多个 prec2 表,合并为一个新的 prec2 表。
从优先级表 precs 构建 prec2 表。
precs 应是按优先级排序的列表(例如 "+" 排在 "*" 前面),
元素形如 (assoc op ...),
其中每个 op 是作为运算符的标记;
assoc 为结合性,可为 left、right、assoc 或 nonassoc。
同一元素中的所有运算符共享同一优先级与结合性。
允许使用 BNF 表示法定义文法。 它接收文法的 bnf 描述以及冲突消解规则 resolvers,返回一个 prec2 表。
bnf 是非终结符定义列表,形如 (nonterm rhs1 rhs2 ...),
每个 rhs 是由终结符(标记)或非终结符组成的非空列表。
并非所有文法都被接受:
此外可能出现冲突:
"else" 这类内部标记)。
优先级冲突可以通过 resolvers 来解决,它是一个 优先级(precs) 表的列表(参见 smie-precs->prec2):对每一个优先级冲突,如果这些 precs 表中指定了某个特定约束,就使用该约束来解决冲突;否则会报告冲突,并任意选择其中一个冲突约束生效,其余约束则直接忽略。