私はプログラミング言語のインタプリタを書くことについて自分で学んでおり、抽象構文木について読んだことがあります。私はそれらが何であるかについては知っていますが、それらの使用法はわかりません。
ASTが役立つのはなぜですか?
私はプログラミング言語のインタプリタを書くことについて自分で学んでおり、抽象構文木について読んだことがあります。私はそれらが何であるかについては知っていますが、それらの使用法はわかりません。
ASTが役立つのはなぜですか?
これらは、コードのロジック/構文を表します。これは、行のリストではなく、当然ツリーであり、アスタリスクを配置する場所などの具体的な構文の問題にとらわれることはありません。
ロジックは、バックエンドのPOVからより一貫性があり便利な方法で操作できます。これは、具体的な構文の記述方法とは大きく異なる可能性があります(Lisp以外のすべての場合)。
ASTを使用する主な利点は、解析と検証のロジックを実装部分から分離できることです。ASTとして実装された通訳者は、実際に理解と保守が容易です。奇妙な構文の解析に問題がある場合は、ASTパーサーを確認します。コードの一部が期待どおりの結果を生成しない場合は、ASTを解釈するコードを確認します。
他の大きな利点は、構文が「先読み」を必要とする場合です。たとえば、構文が定義される前にサブルーチンを使用できる場合、ASTを使用しているときにサブルーチンの存在を検証するのは簡単です。オンザフライ」パーサー。
プログラミング言語のテキストを含むドキュメントの分析または変換を実行するには、ほとんどのプログラミング言語の構造を表す「構文木」が必要です。(あなたは私のバイオを通してこれのいくつかの素晴らしい例を見ることができます)。
その木が抽象(AST)であるかコンクリート(CST)であるかは、好み、利便性、およびエンジニアリングの汗の問題です。CSTという用語は、文法を使用してソースコードを分解する場合に、解析派生ツリーを説明するために特に使用されます。通常、ステートメントターミネータセミコロンなどの多くの具体的な構文のツリー要素が含まれています。ASTは、「CSTよりも単純なもの」を意味するために使用されます。たとえば、プログラム分析にあまり影響を与えないため、セミコロンツリーノードを省略します。したがって、ASTを処理するアナライザーを作成することは、同じアナライザーをCST。これを理解するためのより良い方法は、ASTが通常CSTと同形の同等物である、つまり、ASTからCSTを再生成できるはずであることを理解することです。変身したいならソーステキストを再生成すると、元のプログラムから失われる情報が少なくなるため、CSTの方が適していることがよくあります(私の派手な例ではこのアプローチを使用しています)。
抽象構文木と具体的な構文木に関するSOの議論は非常に役立つと思います。
一般に、コードを何らかの形式のASTに解析します。これは、多かれ少なかれ正式なモデルである可能性があります。したがって、Kirk Wollが上記のコメントで得たのは、言語を解析するときに、パーサーを使用して、通常はツリー形式で編成された、読んでいるものの生のコンテンツのある種のデータモデルを作成することが非常に多いということです。 。したがって、その定義によれば、非常に単純なトランスレータを実行していない限り、ASTを回避することは困難です。
私は複雑な言語を解析するためにANTLRをよく使用しますが、その文脈では、ASTのもう少し具体的な意味があります。ANTLRには、非常に単純なアクションを使用してパーサー文法でASTを生成する便利な方法があります。次に、このASTの一般的にはるかに単純なパーサーを作成します。これは、処理している言語のはるかに単純なバージョンのように操作できます。2つのパーサーを構築するという余分な作業が純利益であるかどうかは、言語の複雑さと、解析後にそれを使用して何を計画しているかによって決まります。
あなたが見たいと思うかもしれない主題に関する良い本は、ANTLRの著者であるTerrenceParrによる「LanguageImplementationPatterns」です。彼はこのトピックにかなり徹底的に取り組んでいます。とは言うものの、ASTは使い始めるまで実際には入手できなかったので、(いつものように)ASTを理解するための最良の方法です。
質問に遅れましたが、何か追加したいと思いました。実際にASTを作成する必要はありません。ソースコードを解析するときに、命令を直接出力することができます。この場合、ASTは構文解析文法に含まれています。単純な言語、特に動的に型付けされた言語の場合、これは完全に問題のない戦略です。より複雑な言語の場合、またはソースコードをさらに分析する必要がある場合は、ASTが非常に役立ちます。たとえば、言語が静的に型指定されている場合、つまり変数が固定型で宣言されている場合、ASTを使用して、変数に間違った型を割り当てていないことを確認できます。たとえば、整数を保持するように宣言されている変数に文字列を割り当てるのは誤りであり、これはASTを使用するとより便利にキャッチできます。
また、他の人が述べているように、ASTは構文解析とコード生成を明確に分離し、コードをはるかにモジュール化します。