QA@IT

言語作成 構成についてアドバイスください。

1643 PV

「ふつうのコンパイラをつくろう」という本や「JavCC コンパイラ・コンパイラ for Java」という本を参考にJavaCCとJavaを使って日本語で書けるプログラミング言語を作ろうとしています。
独学でやっていて以下のことは一応できるようになりました。
・自作関数
・標準出力
・条件文
・繰り返し文
・四則演算や条件演算

変数を実装したいと考えているのですが、これだという方法が思いつきません。
構成を整理すべく、抽象構文木を作ってみました。
http://fast-uploader.com/file/6971612628177/

コードは以下のものです。

ここから{始まり}
    箱[変数]を作る
    [変数]に「こんにちは。」を入れる
    もし[変数]と「こんにちは。」が同じなら
        「ちゃんと入ってました。」と言う
    ではないなら
        「入れるのに失敗しました。」と言う
    をする
    {関数}を始める
ここまで{始まり}

ここから{関数}
    「{関数}が呼び出されました。」と言う
ここまで{関数}

このコードは、たとえばJavaで書いてみると以下のようなコードです。
(自作言語にはオブジェクト指向やimportなどはありませんが。)

class Main{
    public static void main(String[] args){
        String hensuu;
        hensuu="こんにちは。";
        if(hensuu.equals("こんにちは。")){
            System.out.println("ちゃんと入ってました。");
        }
        else{
            System.out.println("入れるのに失敗しました。");
        }
        kansuu();
    }

    public static void kansuu(){
        System.out.println("{関数}が呼び出されました。");
    }

 
たぶん抽象構文木はそんな感じであっているだろうと思っていますが、意味解析でコードの中の実行に必要なデータを各種クラスに記憶させていっているんですけど、現状のやり方はよくないのでは?とも思ってまして、もしこうした方がいいなどのアドバイスがあればよろしくお願いします。

すべてを書きたい気持ちもありますが、それは多くなるのでとりあえず関数・条件文まわりのクラスについて書いてみます。
・KansuuNodeクラス(extends Node)
関数のリストを記憶させるためのクラス
関数の名前と本体となる下記ProgramNodeのオブジェクトをHashtableに記憶
プログラム起動担当

・ProgramNodeクラス(extends Node)
関数の本体や条件文の条件に一致したときしなかったときに実行されるもの、つまりJavaなどで{}で囲まれた部分の中身を記憶させるためのクラス
下記MosiNaraNodeクラスなどのオブジェクトを実行する順番通りにVectorに記憶
Vectorの中身を順番に実行

・MosiNaraNodeクラス(extends CodeNode)
条件文のクラス
条件式のEnzanNodeクラスのオブジェクト・条件に一致したときしなかったときに実行されるProgramNodeのオブジェクトを記憶
EnzanNodeを実行して条件に一致するかどうかを調べ、それに応じたProgramNodeを実行

・EnzanNodeクラス(extends SikiNode)
条件式などのクラス
演算子(String)・左辺・右辺の情報(AtaiNodeかEnzanNodeのオブジェクトまたはnull)を記憶
演算子によって四則演算などの演算を行い、その結果を返す

・AtaiNodeクラス(extends SikiNode)
値のクラス
条件式などで使う文字列や数字などの値をとりあえずStringで記憶
実行の時に持っている値を返す

・YobidasiNodeクラス(extends CodeNode)
関数を呼び出すためのクラス
関数の名前と、呼び出すためにリストも記憶させてしまっている
実行の時にリストから名前とセットになっているProgramNodeを実行する

今それぞれにzikkouメソッドを付けていて、それを呼び出していけば実行できるように作っています。
なんか"どのオブジェクトも僕のことを見れて、僕はそのオブジェクトが必要になるだろう情報を持ってるよ"というようなクラスを作れたら関数の呼び出しとか変数の取り出しとかの部分がいい感じにできるかな?なんて考えたりもするのですが、そういうクラスって作成可能でしょうか?
そもそもどのようにするのがよいのでしょうか?

ウォッチ

この質問への回答やコメントをメールでお知らせします。