🦂

Rust で仮想言語のインタプリタを作る (その3)

2024/12/27に公開

概要

前回c言語をベースの言語を作ってインタプリタを作りました.
変数定義と関数定義と呼び出しまで作ったので, if文, while文が動くところまで進んだのでちょっとまとめておく.

前記事
https://zenn.dev/kaito_73519/articles/be7d5a6993861b

ソースコード
https://github.com/nagato0614/NagatoInterpreter

if文

if文を使えるようになったことでフィボナッチ数列を再帰的に計算ができるようになった.

int fib = 0;
int fibonacci(int n) {
    if (n == 0) {
        return 0;
    } else if (n == 1) {
        return 1;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

void main(void) {
    fib = fibonacci(10);
    return fib;
}

下の図が, パース後の構文木

fib

// if文
selection_statement ::= if '(' logical_or_expression ')' statement
                        | if '(' logical_or_expression ')' statement else statement

statement ::= expression_statement
              | compound_statement
              | selection_statement
              | iteration_statement
              | jump_statement

if 文のあとは statement として取り扱うことで一つの expression_statement または,'{', '}' で囲まれた compound_statement によって複数の statement が取り扱う形となっています.
jump_statementは break, return 文です.

フィボナッチを自分のインタプリタで計算できたのは結構感動した.

while文

while loop ができるようになり, もちろん break 文も使うことができる.
ただ実装として各 statement を評価したあと値か jump_state を返すという実装になっているのでなんか気持ち悪い.

int main(void) {
    int count = 10;
    int sum = 0;
    while (count > 0) {
        sum = sum + count;
        count = count - 1;
        return 1;
    }
    return sum;
}
// while文
iteration_statement ::= while '(' logical_or_expression ')' compound_statement

sum

今後

やりたいこと

  • 構造体の定義ができるようにする
  • ポインタ (インタプリタ内でポインタを取り扱っていないので難しいかも)
  • コメント (これはすぐできそう)
  • マクロ
  • 配列
  • インタプリタではなくコンパイラにする
    • llvm を使ったほうがいいかも

とりあえず, 簡単なコメントとマクロから実装していく

Discussion