APL/J言語:構文解析(パーシング)と実行
文(センテンス)は言語の構文解析ルールに従ってフレーズを順々に実行することにより評価されます。たとえば文10%3+2は、最初にフレーズ3+2が評価され、その結果が10を割るのに使われます。
1.実行は右から左に進みます。右かっこがあれば、対応する左かっこによって囲まれたセグメントが評価され、その結果がセグメント全体と囲んでいる両かっこを置き換えます。
2.副詞と接続詞(conjunction)は動詞より先に実行されます。フレーズ,"2-aは(,"2)-aと同じ意味になり、,"(2-a)ではありません。さらに、副詞や接続詞の左引数は左側の動詞フレーズ全体です。従って、+/ . */bは、一番右側の副詞/(スラッシュ)は動詞フレーズ+/ . *全体に作用し、動詞*(アスタリスク)だけに作用するのではありません。
3.動詞は可能であれば二項動詞として作用します。つまり、左側の名詞の引数があれば、その名詞が接続詞の右側引数でない限りかならず、二項となります。
4.セクションFで動詞や副詞の特殊な連結について説明します。
5.この構文解析ルールの要約が下記に述べらる厳密な構文解析ルールと一致するためには、名詞や動詞以外のものを生成する副詞や接続詞フレーズをかっこで囲む必要があるかもしれません。
これらのルールの一つの重要な帰結は、かっこで囲わない表現において動詞の右側引数は右側全体のフレーズの結果であるということです。センテンス3*p%q^|r-5は従って左から右に向かって読むことができます。全体の結果は3*の右側フレーズ全体の結果を3倍したものです。右側フレーズ全体の結果はp%の右側フレーズ全体の結果でpを割った商になります。という具合に左から右に読んでいくことができます。
構文解析は連続する要素(またはコピュラの直前の代名詞や名詞以外の場合のその値)をキュー(初期状態ではマーカー§でプレフィックスされた元のセンテンス)の末尾からスタック(初期状態ではマーカー4つで示されている)のトップに移すことで進みます。最後にスタックの該当する部分が実行され、全体の結果となります。例えば、a=: 1 2 3ならばb=:+/2*aは次のように構文解析され、実行されます。(スタックの底の4つのマーカーは示されていません。)
§ b =: + / 2 * a § b =: + / 2 * 1 2 3 Move § b =: + / 2 * 1 2 3 Move § b =: + / 2 * 1 2 3 Move § b =: + / 2 * 1 2 3 Move § b =: + / 2 4 6 2 Dyad § b =: + / 2 4 6 Move § b =: + / 2 4 6 Move § b =: +/ 2 4 6 3 Adverb § b =: 12 0 Monad § b =: 12 Move § 12 7 Is § 12
この例で次の2点がわかります。
1)フレーズ2 * 1 2 3の実行は次の要素である/(スラッシュ)が移されて来るまで行われない、ということです。なぜなら来るものが接続詞ならば2はその引数かもしれず、その場合*(アスタリスク)は単項動詞となり、1 2 3に作用することになるからです。
2)名前aは値としてスタックに移動するのに対し、名前bは(コピュラの前にあるため)変化せずbのままスタックに移動し、代名詞bとして値12が代入されます。
構文解析はsystem\packages\misc\trace.ijsにあるトレース機能を使って観察することができます。
スタックの実行は4要素に限定され、実行可能かどうかは下記の構文解析表(parse table)に述べられているように、要素のクラス(名詞、動詞、etc.、代入前の名前は動詞として扱われます)のみによって決まります。スタックの最初の4要素は表の最初の4つの要素と比べられ、すべてが最初に合致sたもの選択されます。行の(太字イタリック)の部分が最終コラムに書かれているアクションの対象となります。
EDGE VERB NOUN ANY 0 Monad
EDGE+AVN VERB VERB NOUN 1 Monad
EDGE+AVN NOUN VERB NOUN 2 Dyad
EDGE+AVN VERB+NOUN ADV ANY 3 Adverb
EDGE+AVN VERB+NOUN CONJ VERB+NOUN 4 Conj
EDGE+AVN VERB+NOUN VERB VERB 5 Fork
EDGE CAVN CAVN ANY 6 Bident
NAME+NOUN ASGN CAVN ANY 7 Is
LPAR CAVN RPAR ANY 8 Paren
凡例:
AVN = ADV+VERB+NOUN
CAVN = CONJ+ADV+VERB+NOUN
EDGE = MARK+ASGN+LPAR