SMIEの演算子順位文法は、各トークンにたいしてシンプルに左優先(left-precedence)と右優先(right-precedence)という順位ペアを与えます。トークンT1
の右優先がトークンT2
の左優先より小さければT1
< T2
であると言うことにしましょう。これを解読するには<
をカッコの一種だとみなすのがよい方法です。... T1
something T2 ...
を見つけたら、これは... T1 something) T2 ...
ではなく... T1
(something T2 ...
とパースされるべきです。... T1 something) T2 ...
と解釈するのはT1
> T2
を見つけた場合でしょう。T1 =
T2
を見つけた場合、それはトークンT2とその後のトークンT1が同じ構文にあり、通常は"begin" =
"end"
を得ます。このような優先順位のペアは2項演算子(infix
operator)、カッコのようなネストされたトークン、およびその他多くのケースにたいして左結合(left-associativity)や右結合(right-associativity)を表現するのに十分です。
この関数はprec2文法tableを引数に受け取り、smie-setup
で使用するのに適したalistをリターンする。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
(閉カッコのようなもの)、またはこれら2つのいずれでもないneither
(2項演算子や"else"
のようなinnerトークン)である。
順位の競合はresolversを通じて解決され得る。これはprecsテーブル(smie-precs->prec2
を参照)のリストである。それぞれの順位競合にたいして、これらのprecs
テーブルが特定の制約を指定している場合は、かわりにこの制約により競合が解決され、それ以外は競合する制約のうち任意の1つが報告されて他は単に無視される。