++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

コンパイラ作成

leave a comment »

前に作ったスタックとヒープのデモに引き続き、関数呼び出し(特に再帰)とスタックの関係を作ろうとしてたはずが、気が付いたらスタック型の仮想マシンと、それ用の簡易コンパイラを作り始めてたりする。

経緯的には、

  • 前のデモのときもそうだったけど、「実際に手を動かして見れるデモ」を作ろうとすると、簡易独自言語を作らざるを得ない
  • 再帰のデモしようと思ったら、関数くらいは作れないとダメよなぁ
  • 再帰を認めるってことは、条件分岐くらい必要なんでは・・・

という感じで、以下のような独自言語を実装することに。

let factorial(x) = x > 1 ? x * factorial(x – 1) : 1;
let sum(n) = n * (n + 1 ) / 2;
let n = 5;
let x = factorial(n);
let y = sum(n);
(x + y) * x * y;

仕様:

  • 扱えるのは整数のみ。型なんて概念ないよ。
  • 加減乗除、比較、条件演算子くらいは使える。
  • 関数を定義できる(再帰呼び出しも可)。
  • 詳しい文法: stack.mg(MGrammer 形式)

とりあえず、構文解析して抽象構文木作るところまでは完成済み。後は仮想マシン語コード作るだけ。デモ全体が完成したらソースコードとかも公開予定。

あと、作ってて思った雑感など:

  • どうか MGrammer を Silverlight から使えるようにしてください。
    • まあ、MGrammer は本来、こういう言語を作るためのものじゃないけど。
    • IronPythonなんかでは、パーサージェネレーターは使わずに直接 C# で構文解析コード書いてるらしいですし。
    • とはいえ、いったんMGrammerでプロトタイプ作ってから C# 実装すると気持ち的にかなり楽。
  • 構文解析を極力簡単にしようとすると、関数型言語っぽくなるなぁ。
  • 予約語は let しかない(笑)
    • 実のところ、let も不要なですけども、宣言してない変数にいきなり x = 0; とかできるのが気持ち悪かったのと、あんまり先の方までトークンの先読みしたくなかったので。
  • なんか、スタックのデモというよりは、コンパイラの教科書的なものを作ってる気分に。
    • てか、大学のコンパイラの授業思い出すなぁ。

Written by ufcpp

2009年5月7日 @ 17:49

カテゴリー: 未分類

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。