コンパイラならば作ったことあります。インタプリタはないですが。
最初はコンパイラ・インタプリタどちらにするか悩んだのですが、インタプリタは言語翻訳機関とプログラム実行機関の2つを備えないといけないので面倒なことと、JavaVM (Java プログラムのインタプリタみたいなもの)について調査したときに色々と躓いてなかなか前進できなかった経験があるので、結局コンパイラにしました。
とりあえず形にはなったので、現在様々な言語仕様を検討し、より良い言語を目指している段階です。
可能ならいずれインタプリタの制作にも挑戦したいものです。
それで、「是非教えてください」と言われましても、この分野は深く広い学問体系になっているので、漠然としていてなにから取り組めばよいのやら…
とりあえず今回は処理のおおまかな流れについてお話しさせてください。
1.ソースファイルを先頭から1字ずつ読んで、それがどんな文字なのか(アルファベット / 数字 / 記号 / 日本語, etc...)を解析して、この情報を基に、個々の文字を単語レベルに結合します。
たとえばC言語のソースでは
コード:
if (i == 0) baz = foo + bar;
ならば
コード:
if 予約語
( 括弧(開)
i 識別子
== 演算子
0 数値
) 括弧(閉)
baz 識別子
= 演算子
foo 識別子
+ 演算子
bar 識別子
; 終端文字
こんな感じです。
この段階で、その単語(本当は
字句または
トークンといいます)が識別子か予約語なのか、または演算子やその他の記号なのかを検査しておきます。
このフェイズを
字句解析と言います。
2.1で得られた字句の並び方がプログラミング言語の構文として正しいかを解析します。
開括弧と閉括弧がちゃんと一致しているか、などの検査もこの段階で行います。
ソースの基本的な構文エラーはここで検出することになります。
この構文解析器の設計は、プログラミング言語の構文設計と密接に繋がっています。
プログラミング言語の構文を考えることは、ここの構造を考えることに等しいと言えるでしょう。
このフェイズを
構文解析と言います。
3.ソースが言語構文のとおりだと確認できたら、こんどはこのソースがどういう動作を期待しているのかについて解析します。
たとえば、別の板で質問されていた逆ポーランド解析も主にこの段階で活躍します。
このフェイズを
意味解析と言います。
また 2 と 3 のフェイズは強力に連携し合わなければならないので、設計を簡略化するために、これらを合わせて一つのフェイズとみなすこともあるそうです。
4.インタープリタならこの処理を即時実行して、1~3を繰り返すことになります。
コンパイラならさらに必ずしも必要ではない様々な処理(最適化処理など)を行って、オブジェクトファイルを出力します。
このような具合です。最初から一度にこれらすべてを設計してプログラムを組み上げるのは大変な作業ですから、まずは「2 + 3」が計算できるような簡単な計算機、次いで逆ポーランド電卓、(逆ポーランドではなく)普通の計算式を処理できる電卓、if などの条件分岐やループしか持たない簡単なインタプリタなどを作って、徐々にステップアップしながら同時にインタプリタを拡張していく方法をお勧めします。