この章では、#Script のソースコードの文法を規定する 解析表現文法について説明する。
スクリプトプログラムのソースコードは、一つの Unicode 文字列として表される。
Unicode 文字列とは、Unicode
規格で定めるところのコード済み文字列 (coded character
sequence)
すなわち Unicode コードポイントの列である。
ソースコードは、Unicode 正規化形式 C に基づいて正規化してあることが望まれるが、
必須ではない。
また、実行環境はソースコードを解釈するときにそれを正規化する必要はない。
#Script の構文は解析表現文法によって定義する。
解析表現文法 (parsing expression grammar: PEG) は、有限個の終端記号、非終端記号、解析ルールおよび一つの開始表現から成る。 #Script のソースコードの構文解析において、各終端記号は一つの Unicode コードポイントである。非終端記号は、解析ルールによる置換の対象となる 抽象的構成要素である。解析ルールは、非終端記号を解析表現に置換する写像である。 開始表現は、非終端記号の一つである。
解析表現は、 解析ルールによって置換される非終端記号に対応する、 文法上の構成要素を表す式である。 解析表現は、原子解析表現と解析表現演算子から成る。
原始解析表現は、解析表現の最も基本的な構成要素であり、次の三つのうちのどれかである:
原始解析表現は、それ自身が解析表現である。
ある解析表現 e, e1, e2 に対して、以下の解析表現演算子を適用した結果もまた解析表現である:
演算子の優先順位は、以下の一覧に挙げる順番である (先にあるほうが優先順位が高い):
演算子の優先順位を変更するために、数学の数式と同じように括弧を用いる。
文法解析において、0 個以上、1 個以上、および任意の演算子は、貪欲に振舞う。すなわちこれらの演算子は解析表現の他の部分がどのようになっているかに
かかわらず (文脈に依存せず)、出来るだけ多くの e を当てはめる。
従って、例えば解析表現 (a
* a
)
に当てはまる入力は存在しない。連続する a
は全て a
*
の部分に当てはまるため、その後の a
の部分に当てはまる
a
は残っていないからである。
また、選択の演算子は、当てはまる表現の長さやその他の条件によらず、常に e1 を優先して選択する。従って、e2 が当てはまる可能性があるのは e1 が当てはまらなかった場合のみである。
肯定先読み、否定先読みの演算子は、解析表現が当てはまるための条件を指定する。
例えば解析表現 (a
&b
) は、ab
の
a
の部分には当てはまるが ac
や ad
の
a
の部分には当てはまらない。また解析表現 (a
!b
) は、ac
や ad
の a
の部分には当てはまるが ab
の a
の部分には当てはまらない。
この仕様書は、HTML によって書いてある。以下に、 この仕様書において解析表現文法を記述するための規則を定める。
ソースコードの解析は、与えられたソースコードを 指定された開始表現に当てはめることによって行う。
ソースコード全体が解析の対象となる開始表現に当てはまらない場合は、 文法エラーとする。
© 2006-2007 Magicant