🦂
Rust で仮想言語のインタプリタを作る (その3)
概要
前回c言語をベースの言語を作ってインタプリタを作りました.
変数定義と関数定義と呼び出しまで作ったので, if文, while文が動くところまで進んだのでちょっとまとめておく.
前記事
ソースコード
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;
}
下の図が, パース後の構文木
// 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
今後
やりたいこと
- 構造体の定義ができるようにする
- ポインタ (インタプリタ内でポインタを取り扱っていないので難しいかも)
- コメント (これはすぐできそう)
- マクロ
- 配列
- インタプリタではなくコンパイラにする
- llvm を使ったほうがいいかも
とりあえず, 簡単なコメントとマクロから実装していく
Discussion