SMIEの優先順位文法では、各トークンに左優先順位と右優先順位という一対の優先順位を単純に割り当てます。トークン T1 の右優先順位がトークン T2
の左優先順位よりも小さい場合、T1 < T2 と表記します。この < は、ある種の括弧として解釈するのが適切です。もし ... T1
something T2 ... が見つかった場合、それは ... T1 something) T2
... ではなく ... T1 (something T2 ...
として解析されるべきです。後者の解釈になるのは、T1 > T2 がある場合です。T1 = T2 がある場合は、同一の構文構造においてトークン T1 の後にトークン T2
が続くことを意味するため、通常は "begin" =
"end"
となります。このような優先順位のペアがあれば、中置演算子の左結合性や右結合性、括弧のようなトークンの入れ子構造、およびその他多くのケースを表現するのに十分です。
この関数は、prec2 文法 table
を受け取り、smie-setup で使用可能なアリストを返します。prec2 table
自体は、以下に挙げる関数のいずれかによって構築されることを想定しています。
この関数は、複数のprec2 tablesを受け取り、それらを新しいprec2テーブルにマージします。
この関数は、優先順位表 precs から prec2
テーブルを構築します。precs は、優先順位順にソートされた(例えば "+" が "*"
より前に来る) (assoc op ...) 形式の要素のリストである必要があり、ここで各 op は演算子として機能するトークン、assoc
はその結合性(left、right、assoc、または nonassoc
のいずれか)となります。ある要素内のすべての演算子は、同一の優先順位レベルと結合性を持ちます。
この関数では、BNF記法を用いて文法を指定できます。文法のbnf記述と競合解決ルールの集合resolversを受け取り、prec2テーブルを返します。
bnf は (nonterm rhs1 rhs2 ...) 形式の非終端記号の定義のリストであり、各 rhs は(空でない)終端記号(別名トークン)または非終端記号のリストである。
すべての文法が認められているわけではありません:
また、競合が発生することもあります:
opener(開き括弧のようなもの)、closer(閉じ括弧のようなもの)、あるいはその両方であるneither(例:中置演算子や、"else"のような内部トークン)のいずれかになります。
優先順位の競合は resolvers によって解決できます。これは precs テーブルのリストです(smie-precs->prec2 を参照)。各優先順位の競合について、該当する precs
テーブルが特定の制約を指定している場合は、その制約を用いて競合を解決します。そうでない場合は競合が報告され、競合する制約のうちいずれか一つが任意に選択され、それ以外は単に無視されます。