diff --git a/docs/parser/overview.md b/docs/parser/overview.md new file mode 100644 index 00000000..68020192 --- /dev/null +++ b/docs/parser/overview.md @@ -0,0 +1,16 @@ +# AiScriptパーサーの全体像 + +AiScriptのパーサーは2つの段階を経て構文ツリーに変換される。 + +1. ソースコードをトークン列に分割する +2. トークン列を順番に読み取って構文ツリー(AST)を構築する + +ソースコードをトークン列に分割する処理(トークナイズと呼ばれる)は「Scanner」というモジュールが担当する。 +トークン列から構文ツリーを構築する処理(パース)は、syntaxesディレクトリ以下にあるパース関数が担当する。名前がparseから始まっている関数がパース関数。 + +AiScriptのパーサーではトークナイズはまとめて行われない。 +パース関数が次のトークンを要求すると、下位モジュールであるScannerが次のトークンを1つだけ読み取る。 + +Scannerによって現在の読み取り位置(カーソル位置)が保持される。 +また、Scannerの各種メソッドで現在のトークンが期待されたものと一致するかどうかの確認やトークンの種類の取得などを行える。 +これらの機能を利用することにより、パース関数を簡潔に記述できる。 diff --git a/docs/parser/scanner.md b/docs/parser/scanner.md index 6e78da1b..3f226e03 100644 --- a/docs/parser/scanner.md +++ b/docs/parser/scanner.md @@ -1,5 +1,4 @@ # Scanner 設計資料 -作成者: marihachi ## 現在のトークンと先読みされたトークン _tokensの0番には現在のトークンが保持される。また、トークンが先読みされた場合は1番以降にそれらのトークンが保持されていくことになる。 @@ -7,3 +6,7 @@ _tokensの0番には現在のトークンが保持される。また、トーク nextメソッドで現在位置が移動すると、それまで0番にあったトークン(現在のトークン)は配列から削除され、1番にあった要素は現在のトークンとなる。 配列から全てのトークンが無くなった場合はトークンの読み取りが実行される。 + +## CharStream +ScannerはCharStreamを下位モジュールとして利用する。 +CharStreamは入力文字列から一文字ずつ文字を取り出すことができる。 diff --git a/docs/parser/token-streams.md b/docs/parser/token-streams.md new file mode 100644 index 00000000..62b1ca1d --- /dev/null +++ b/docs/parser/token-streams.md @@ -0,0 +1,11 @@ +# TokenStreams +各種パース関数はITokenStreamインターフェースを実装したクラスインスタンスを引数にとる。 + +実装クラス +- Scanner +- TokenStream + +## TokenStream +読み取り済みのトークン列を入力にとるストリーム。 +テンプレート構文の式部分ではトークン列の読み取りだけを先に行い、式の内容の解析はパース時に遅延して行われる。 +この時の読み取り済みのトークン列はTokenStremとしてパース関数に渡される。