GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Operator-Precedence-Grammars.html ・ emacs-doc.conao3.com

24.8.1.2 演算子優先順位文法

SMIEの優先順位文法では、各トークンに左優先順位と右優先順位という一対の優先順位を単純に割り当てます。トークン T1 の右優先順位がトークン T2 の左優先順位よりも小さい場合、T1 < T2 と表記します。この < は、ある種の括弧として解釈するのが適切です。もし ... T1 something T2 ... が見つかった場合、それは ... T1 something) T2 ... ではなく ... T1 (something T2 ... として解析されるべきです。後者の解釈になるのは、T1 > T2 がある場合です。T1 = T2 がある場合は、同一の構文構造においてトークン T1 の後にトークン T2 が続くことを意味するため、通常は "begin" = "end" となります。このような優先順位のペアがあれば、中置演算子の左結合性や右結合性、括弧のようなトークンの入れ子構造、およびその他多くのケースを表現するのに十分です。

関数: smie-prec2->grammar table

この関数は、prec2 文法 table を受け取り、smie-setup で使用可能なアリストを返します。prec2 table 自体は、以下に挙げる関数のいずれかによって構築されることを想定しています。

関数: smie-merge-prec2s &rest tables

この関数は、複数のprec2 tablesを受け取り、それらを新しいprec2テーブルにマージします。

関数: smie-precs->prec2 precs

この関数は、優先順位表 precs から prec2 テーブルを構築します。precs は、優先順位順にソートされた(例えば "+" が "*" より前に来る) (assoc op ...) 形式の要素のリストである必要があり、ここで各 op は演算子として機能するトークン、assoc はその結合性(left、right、assoc、または nonassoc のいずれか)となります。ある要素内のすべての演算子は、同一の優先順位レベルと結合性を持ちます。

関数: 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(閉じ括弧のようなもの)、あるいはその両方であるneither(例:中置演算子や、"else"のような内部トークン)のいずれかになります。

優先順位の競合は resolvers によって解決できます。これは precs テーブルのリストです(smie-precs->prec2 を参照)。各優先順位の競合について、該当する precs テーブルが特定の制約を指定している場合は、その制約を用いて競合を解決します。そうでない場合は競合が報告され、競合する制約のうちいずれか一つが任意に選択され、それ以外は単に無視されます。