文法総則

この章では、#Script のソースコードの文法を規定する 解析表現文法について説明する。

ソースコード

スクリプトプログラムのソースコードは、一つの Unicode 文字列として表される。 Unicode 文字列とは、Unicode 規格で定めるところのコード済み文字列 (coded character sequence) すなわち Unicode コードポイントの列である。 ソースコードは、Unicode 正規化形式 C に基づいて正規化してあることが望まれるが、 必須ではない。 また、実行環境はソースコードを解釈するときにそれを正規化する必要はない。

解析表現文法

#Script の構文は解析表現文法によって定義する。

解析表現文法 (parsing expression grammar: PEG) は、有限個の終端記号非終端記号解析ルールおよび一つの開始表現から成る。 #Script のソースコードの構文解析において、各終端記号は一つの Unicode コードポイントである。非終端記号は、解析ルールによる置換の対象となる 抽象的構成要素である。解析ルールは、非終端記号を解析表現に置換する写像である。 開始表現は、非終端記号の一つである。

解析表現

解析表現は、 解析ルールによって置換される非終端記号に対応する、 文法上の構成要素を表す式である。 解析表現は、原子解析表現と解析表現演算子から成る。

原始解析表現

原始解析表現は、解析表現の最も基本的な構成要素であり、次の三つのうちのどれかである:

一つの終端記号
終端記号そのものを表す。
一つの非終端記号
解析ルールがこの非終端記号に対応させる解析表現を表す。
[空]
0 個の Unicode コードポイントを表す。

原始解析表現は、それ自身が解析表現である。

解析表現演算子

ある解析表現 e, e1, e2 に対して、以下の解析表現演算子を適用した結果もまた解析表現である:

連続: e1 e2
解析表現 e1 の直後に解析表現 e2 が続いたものを表す。
選択: e1 / e2
解析表現 e1, e2 のどちらでもよいことを表す。
0 個以上: e*
解析表現 e が 0 個以上連続しているものを表す。これは e+ / [空] と等価である。
1 個以上: e+
解析表現 e が 1 個以上連続しているものを表す。これは e e* と等価である。
任意: e?
解析表現 e が 0 個または 1 個存在することを表す。これは e / [空] と等価である。
肯定先読み: &e
その直後に e が連続するような [空] を表す。ただし、e 自身は &e には当てはまらない。
否定先読み: !e
その直後に e が連続しないような [空] を表す。ただし、e 自身は !e には当てはまらない。

演算子の優先順位は、以下の一覧に挙げる順番である (先にあるほうが優先順位が高い):

  1. 0 個以上、1 個以上、任意
  2. 肯定先読み、否定先読み
  3. 連続
  4. 選択

演算子の優先順位を変更するために、数学の数式と同じように括弧を用いる。

文法解析において、0 個以上、1 個以上、および任意の演算子は、貪欲に振舞う。すなわちこれらの演算子は解析表現の他の部分がどのようになっているかに かかわらず (文脈に依存せず)、出来るだけ多くの e を当てはめる。 従って、例えば解析表現 (a* a) に当てはまる入力は存在しない。連続する a は全て a* の部分に当てはまるため、その後の a の部分に当てはまる a は残っていないからである。

また、選択の演算子は、当てはまる表現の長さやその他の条件によらず、常に e1 を優先して選択する。従って、e2 が当てはまる可能性があるのは e1 が当てはまらなかった場合のみである。

肯定先読み、否定先読みの演算子は、解析表現が当てはまるための条件を指定する。 例えば解析表現 (a &b) は、aba の部分には当てはまるが acada の部分には当てはまらない。また解析表現 (a !b) は、acada の部分には当てはまるが aba の部分には当てはまらない。

この仕様書での表記規則

この仕様書は、HTML によって書いてある。以下に、 この仕様書において解析表現文法を記述するための規則を定める。

ソースコードの解析

ソースコードの解析は、与えられたソースコードを 指定された開始表現に当てはめることによって行う。

ソースコード全体が解析の対象となる開始表現に当てはまらない場合は、 文法エラーとする。

© 2006-2007 Magicant