From a5dadb796d84016770906ef03a103e82580bfa50 Mon Sep 17 00:00:00 2001 From: marihachi Date: Tue, 24 Oct 2023 21:43:32 +0900 Subject: [PATCH 1/2] add parser docs --- docs/parser/overview.md | 16 ++++++++++++++++ docs/parser/scanner.md | 5 ++++- docs/parser/token-streams.md | 11 +++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 docs/parser/overview.md create mode 100644 docs/parser/token-streams.md 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..fadc1def --- /dev/null +++ b/docs/parser/token-streams.md @@ -0,0 +1,11 @@ +# TokenStreams +各種パース関数はITokenStreamインターフェースを実装したクラスインスタンスを引数にとる。 + +実装クラス +- Scanner +- TokenStream + +## TokenStream +読み取り済みのトークン列を入力にとるストリーム。 +テンプレート構文では式部分の読み取りだけを先に行い、内容の解析はパース時に行われる。 +この際の読み取り済みのトークン列はTokenStremによりパース関数に渡される。 From 739e8425545c54a2692624f0332b9e9e4ac7d65f Mon Sep 17 00:00:00 2001 From: marihachi Date: Tue, 24 Oct 2023 21:49:56 +0900 Subject: [PATCH 2/2] fix doc --- docs/parser/token-streams.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/parser/token-streams.md b/docs/parser/token-streams.md index fadc1def..62b1ca1d 100644 --- a/docs/parser/token-streams.md +++ b/docs/parser/token-streams.md @@ -7,5 +7,5 @@ ## TokenStream 読み取り済みのトークン列を入力にとるストリーム。 -テンプレート構文では式部分の読み取りだけを先に行い、内容の解析はパース時に行われる。 -この際の読み取り済みのトークン列はTokenStremによりパース関数に渡される。 +テンプレート構文の式部分ではトークン列の読み取りだけを先に行い、式の内容の解析はパース時に遅延して行われる。 +この時の読み取り済みのトークン列はTokenStremとしてパース関数に渡される。