Next: SMIE Grammar, Previous: SMIE setup, Up: SMIE [Contents][Index]
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つが報告され、他は単に無視される。