それは、インタープリターを作成する言語の複雑さと、ツールの選択によって異なります。シンプルなインタープリターはシンプルです。
高階関数と数値をサポートする言語の Haskell での AST の定義として、以下を検討してください。
data Exp = Lam String Exp
| App Exp Exp
| Var String
| Num Int
これで、単純な「eval」関数としてインタープリターを作成できます。
eval (App e1 e2) env = (unF (eval e1 env)) (eval e2 env)
eval (Lam x e) env = F (\v -> (eval e ((x,v):env)))
eval (Num n) env = N n
eval (Var x) env = case (lookup x env) of
Just v -> v
Nothing -> error ("Unbound variable " ++ x)
以上です。いくつかの退屈なサポート定義は次のとおりです。
data Val = F (Val -> Val) | N Int
unF (F x) = x
instance Show Val where
show (F _) = "<procedure>"
show (N n) = show n
つまり、上記の 3 つのコード ブロックを Haskell ソース ファイルにコピー ペーストすると、次のように ghci を使用してテストできる、動作するインタープリターが作成されます。
*Main> eval (App (Lam "x" (Var "x")) (Num 1)) []
1
*Main> eval (Var "x") []
*** Exception: Unbound variable x
古典的なSICPやEOPL、または小さな本で言語の作成について読むことができます。型付き言語を構築したい場合は、さらに読む必要があるかもしれません。
そうは言っても、言語を構築する場合は、最初にたくさん読むことを強くお勧めします. 一つには、非常にやりがいがあります。そして第二に、言語の作成方法を知らない人々によってあまりにも多くの恐ろしい言語が世界にもたらされており (その多くは、さまざまな歴史的理由から非常に人気が高まっています)、私たちはそれらに行き詰まっています.