私はプログラミングをしている限り(たった5年)コンパイラ/インタプリタの設計/実装に興味があり、それは常に誰も実際に話さない舞台裏の「魔法」のように見えました(少なくとも私は知っていますオペレーティングシステム開発のための2つのフォーラムですが、コンパイラ/インタプリタ/言語開発のためのコミュニティを知りません)。とにかく、最近、プログラミングの知識を全体として広げることを期待して、自分で作業を開始することにしました(そしてねえ、それはかなり楽しいです:)。それで、私が持っている限られた量の読み物とウィキペディアに基づいて、私はコンパイラー/インタープリターのためのコンポーネントのこの概念を開発しました:
ソースコード->字句解析->抽象構文木->構文解析->意味解析->コード生成->実行可能コード。
(コード生成と実行可能コードにはまだまだあることは知っていますが、まだそれほど理解していません:)
そして、その知識を基に、ソースファイルから入力を受け取り、トークンを別のファイルに出力するための非常に基本的なレクサー(Java)を作成しました。サンプルの入力/出力は次のようになります。
入力:
int a := 2
if(a = 3) then
print "Yay!"
endif
出力(レクサーから):
INTEGER
A
ASSIGN
2
IF
L_PAR
A
COMP
3
R_PAR
THEN
PRINT
YAY!
ENDIF
個人的には、そこから構文/意味解析、さらにはコード生成に進むのは本当に簡単だと思います。それは私に疑問を投げかけます。私のレクサーが同じようにうまく機能しているように見えるのに、なぜASTを使用するのですか?しかし、私がこのトピックを研究するために使用する私の情報源の100%はすべて、これがコンパイラー/インタープリターの必要な部分であることを断固として主張しているようです。ASTが実際に何であるか(プログラムの論理フローを示すツリー)のポイントを見逃していますか?
TL; DR:現在、コンパイラーの開発を進めており、字句解析機能を終了しました。出力によって、ASTを実行するのではなく、構文解析/意味解析が簡単になるようです。では、なぜそれを使用するのですか?私は1つのポイントを逃していますか?
ありがとう!