Next: , Previous: , Up: SMIE: 無邪気なインデントエンジン   [Contents][Index]


24.7.1.2 演算子順位文法

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)を表現するのに十分です。

Function: smie-prec2->grammar table

この関数はprec2文法tableを引数に受け取り、smie-setupで使用するのに適したalistをリターンする。prec2文法tableは、それ自体が以下の関数のいずれかによりビルドされることを意図している。

Function: smie-merge-prec2s &rest tables

この関数は複数のprec2文法tablesを、新たなprec2テーブルにマージする。

Function: smie-precs->prec2 precs

この関数は順位テーブルprecsからprec2テーブルをビルドする。precsは優先順(たとえば"+""*"より前にくる)にソートされたリストであり、要素は(assoc op ...)の形式であること。ここでopは演算子として振る舞うトークン、assocはそれらの結合法則でありleftrightassocnonassocのいずれかである。与えられた要素内のすべての演算子は同じ優先レベルと結合法則を共有する。

Function: smie-bnf->prec2 bnf &rest resolvers

この関数によりBNF記法を使用した文法を指定することができる。これはその文法のbnf表記と、同様に競合解決ルールresolversを受け取ってprec2テーブルをリターンする。

bnf(nonterm rhs1 rhs2 ...)という形式の非終端定義、各rhsは終端記号(トークンとも呼ばれる)、または非終端記号の(空でない)リストである。

すべての文法が許容される訳ではない:

  • rhsに空のリストは指定できない(いずれにせよSMIEは空文字列にマッチさせるためにすべての非終端記号を許容するので空リストが必要になることは決してない)。
  • rhsの後に連続する2つの非終端記号は指定できない。非終端記号の各ペアは終端記号(かトークン)で区切られる必要がある。これは演算子順位文法の基本的な制約である。

さらに競合が発生し得る:

  • リターンされるprec2テーブルはトークンのペア間の制約を保持し、与えられた任意のペアはT1 < T2、T1 = T2、T1 > T2のいずれかのうち1つの制約をだけ与えることができる。
  • トークンはopener(開カッコに似た何か)、closer(閉カッコのようなもの)、またはこれら2つのいずれでもないneither(2項演算子や"else"のようなinnerトークン)である。

順位の競合はresolversを通じて解決され得る。これはprecsテーブル(smie-precs->prec2を参照)のリストである。それぞれの順位競合にたいして、これらのprecsテーブルが特定の制約を指定している場合は、かわりにこの制約により競合が解決され、それ以外は競合する制約のうち任意の1つが報告されて他は単に無視される。