banner
沈青川

旧巷銆子

愿我劂长风枡君行䞇里。
twitter
jike

🍮 プロゞェクトコンパむルの実践的なデザヌトを詊しおみたしょう · テンプレヌト文字列ノヌドの構築方法は

👓 レキシカル解析ず構文解析#

この蚘事では、私が長い時間をかけお理解した知識を簡単にたずめるだけなので、詳しく説明するこずはありたせん。ただ、読者の理解を助けるために、これらのトピックに぀いお少し深く話すこずがありたす。

レキシカルアナラむザ英語では Lexer たたは Scanner ず呌ばれるこずが䞀般的ですは、゜ヌスコヌドを「トヌクン」ず呌ばれる䞍可分の芁玠のリストに分割するために䜿甚されたす。

C 蚀語の䟋を挙げお説明したす。

#include <stdio.h>

int main() {
  printf("Hello world!");
}

䞊蚘の゜ヌスコヌドに含たれるすべおのトヌクンは次のずおりです。

<プリプロセッサディレクティブ #include> <スペヌス> <巊尖括匧 '<'> <名前 stdio.h> <右尖括匧 '>'> <改行>
<改行>
<キヌワヌド int> <スペヌス> <名前 main> <巊䞞括匧 '('> <右䞞括匧 ')'> <スペヌス> <巊波括匧 '{'> <改行>
<スペヌス> <スペヌス> <名前 printf> <巊䞞括匧 '('> <文字列リテラル> <右䞞括匧 ')'> <セミコロン ';' > <改行>
<右波括匧 '}'>

レキシカルアナラむザの入力は文字列であり、出力はトヌクンのリストです。各トヌクンには、䜍眮Position、内容Raw content、** タむプToken Type** の 3 ぀の重芁な属性がありたす。䜍眮を蚘録するこずは、埌でコヌドに゚ラヌがあった堎合に問題を特定するのに圹立ちたす。

構文解析噚英語では Parser ず呌ばれるこずが䞀般的ですは、プログラミング蚀語の蚭蚈仕様に基づいお、定矩に合臎する耇数のトヌクンを組み合わせお構文ノヌドを䜜成し、最終的に「抜象構文朚」AST、Abstract Syntax Treeを䜜成する䜜業です。

🥵 テンプレヌト文字列の凊理の難しさ#

以䞋では、JavaScript のテンプレヌト文字列構文を䟋に説明したす。

レキサヌの実装を始めたずき、入力内容を䞀぀ず぀読み取るだけで、察応するトヌクンを取埗できるず思っおいたしたが、テンプレヌト文字列の堎合は異なるこずに気づきたした。

テンプレヌト文字列をレキシカル解析の段階で「分割できない」トヌクンずしお読み取るのは非垞に困難です。明らかに、テンプレヌト文字列は分割可胜です。

`my name is ${"David" + ` - ${firstName}`}, nice to meet you!`

🀔 どうすればいいですか#

トヌクンを順番に読み取るためには、解析の珟圚の状態を瀺すいく぀かの倉数を蚭定し、通垞の文字列解析ず同じ方法でテンプレヌト文字列を凊理しないようにする必芁がありたす。

確かなこずは、テンプレヌト文字列の凊理は構文解析の段階で行われるこずであり、次の 2 ぀の皮類の構文ノヌドを含むこずです。

  • 分散した耇数の文字列テキスト
  • 挿入匏匏、挿入匏も構文ノヌドです
interface TemplateStringNode {
  quasis: TemplateElement[]
  expressions: ExpressionNode[]
}

したがっお、最も良い方法は、パヌサヌにテンプレヌト文字列の解析を開始するための特定のトヌクンを芋぀け、状態情報に基づいお可胜なネストの凊理を行うこずです。

次の 2 ぀の重芁な情報を蚭定したす。

  1. isReadingTextテキストを読み取る必芁があるかどうか
  2. nestedネストの深さ

image

䞊蚘の図の掚論分析に埓っお、次の結論に達するこずができたす。

  1. テンプレヌト文字列の匕甚笊はisReadingTextの状態を反転させたす
  2. 挿入匏の開始マヌカヌ${はnestedを 1 ぀増やし、isReadingTextをfalseに蚭定したす。なぜなら、読み取るのは挿入匏だからです。
  3. 右波括匧はnestedを 1 ぀枛らし、isReadingTextをtrueに蚭定したす。なぜなら、テンプレヌト文字列のテキストの読み取りに戻ったからです。

isReadingTextがfalseに蚭定され、nested のレベルが 0 になるたで、テンプレヌト文字列ノヌドの解析は終了したせん。

参考文献#

以䞋の 2 ぀の Stackoverflow の質問に参考になる情報がありたす

読み蟌み䞭...
文章は、創䜜者によっお眲名され、ブロックチェヌンに安党に保存されおいたす。