ASTの抽象的な文法の木とPythonコードを分析して実現します。
コンピュータ科学では、抽象的な文法ツリー(abstract sysntax treeまたはASTと略される)または文法ツリー(syntax tree)は、ソースコードの抽象的な文法構造のツリー表現形式であり、ここではプログラミング言語のソースコードを指す。ツリー上の各ノードはソースコードの構造を表している。文法が「抽象的」というのは、ここの文法は実際の文法に出てくる細部を表していないからです。例えば、ネストかっこは木の構造に隠れていて、ノードの形で現れていません。if−conditionn−thenのような条件ジャンプ文は、2つのブランチを有するノードを使用して表現されてもよい。
抽象的な文法ツリーに対して、具体的な文法ツリーを分析ツリーと呼びます。一般的に、ソースコードの翻訳とコンパイルの過程で、構文解析器は分析ツリーを作成します。ASTが作成されると、後の処理中に意味分析段階などの情報が追加されます。
抽象的な文法の木の構造はソース言語の文法に依存しないで、つまり文法の分析の段階の採用した文脈は文法に関係ないです。Parsserプロジェクトでは、文法に対して等価な変換(左再帰、回溯、二義性などをなくす)を行うことが多いので、文法に余分な成分を導入し、後の段階に悪影響を与え、各段階を混乱させてしまうこともあります。したがって、多くのコンパイラ(GJCを含む)は、しばしば独立して構文分析ツリーを構築し、フロントエンドとバックエンドのための明確なインターフェースを確立する。
Python実現
a+3*b'について説明すると仮定して、a=2,b=5
コードは簡単です。もう詳しく説明しません。
抽象的な文法ツリーに対して、具体的な文法ツリーを分析ツリーと呼びます。一般的に、ソースコードの翻訳とコンパイルの過程で、構文解析器は分析ツリーを作成します。ASTが作成されると、後の処理中に意味分析段階などの情報が追加されます。
抽象的な文法の木の構造はソース言語の文法に依存しないで、つまり文法の分析の段階の採用した文脈は文法に関係ないです。Parsserプロジェクトでは、文法に対して等価な変換(左再帰、回溯、二義性などをなくす)を行うことが多いので、文法に余分な成分を導入し、後の段階に悪影響を与え、各段階を混乱させてしまうこともあります。したがって、多くのコンパイラ(GJCを含む)は、しばしば独立して構文分析ツリーを構築し、フロントエンドとバックエンドのための明確なインターフェースを確立する。
Python実現
a+3*b'について説明すると仮定して、a=2,b=5
コードは簡単です。もう詳しく説明しません。
Num = lambda env, n: n
Var = lambda env, x: env[x]
Add = lambda env, a, b:_eval(env, a) + _eval(env, b)
Mul = lambda env, a, b:_eval(env, a) * _eval(env, b)
_eval = lambda env, expr:expr[0](env, *expr[1:])
env = {'a':2, 'b':5}
tree = (Add, (Var, 'a'),
(Mul, (Num, 3),
(Var, 'b')))
print _eval(env, tree)
出力結果は17です