Mercurial > hg > Members > nobuyasu > myCompiler
diff Bison-Flex/Compiler-StackBase/UTF8/vm.h @ 5:caede627f691
chage encoding
author | nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 17 May 2011 12:45:07 +0900 |
parents | 805d39d28230 |
children | 86c0a38332fe |
line wrap: on
line diff
--- a/Bison-Flex/Compiler-StackBase/UTF8/vm.h Tue May 17 08:00:38 2011 +0900 +++ b/Bison-Flex/Compiler-StackBase/UTF8/vm.h Tue May 17 12:45:07 2011 +0900 @@ -1,5 +1,5 @@ // -// CPU +// 仮想CPU // // (c)2008 Chihiro.SAKAMOTO HyperWorks // @@ -11,9 +11,9 @@ #ifdef _MSC_VER // -// VS2008Ǥϡ奢饤֥ؿ*_sˤȤ褦ٹ𤬽Фޤ -// Ǥϡ̲gccбˤΤᡢ饤֥ѤƤΤǡ -// ٹߤƤޤ +// VS2008では、セキュアライブラリ関数(*_s)を使うよう警告が出ます。 +// ここでは、一般化(gcc等の対応)のため、旧ライブラリを使用しているので、 +// 警告を抑止しています。 // #pragma warning(disable: 4996) #endif @@ -44,16 +44,16 @@ } public: - unsigned char *command_; // ޥɥơ֥ - char *text_buffer_; // ƥȥǡ - int command_size_; // ޥɥ - int text_size_; // ƥȥ - int value_size_; // Хѿ - int entry_point_; // ϰ + unsigned char *command_; // コマンドテーブル + char *text_buffer_; // テキストデータ + int command_size_; // コマンドサイズ + int text_size_; // テキストサイズ + int value_size_; // グローバル変数サイズ + int entry_point_; // 開始位置 } ; - // 0㳰 + // 0除算例外 class devide_by_zero: public std::exception { public: const char *what() const throw() @@ -62,11 +62,11 @@ } } ; - // ۥޥ + // 仮想マシン class vcpu { public: - const static int STACK_SIZE = 1000; // å - const static int global_flag = 0x4000000; // ѿե饰 + const static int STACK_SIZE = 1000; // スタックサイズ + const static int global_flag = 0x4000000; // 外部変数フラグ const static int global_mask = 0x3ffffff; public: @@ -81,52 +81,52 @@ int run(); private: - // Push + // 定数Push void PushConst(int val) { push(val); } - // ʸPush + // 文字定数Push void PushString(int val) { push(std::string(text_buffer_ + val)); } - // ѿPush + // 変数Push void PushValue(int val) { push(global_value[val]); } - // ѿPush + // ローカル変数Push void PushLocal(int val) { push(stack[val + stack_base]); } - // Push + // 配列からPush void PushArray(int val) { int index = top().i_; pop(); push(global_value[val + index]); } - // Push + // ローカルの配列からPush void PushLocalArray(int val) { int index = top().i_; pop(); push(stack[val + stack_base + index]); } - // ѿ()Push + // ローカル変数(参照)Push void PushLocalRef(int val) { int addr = stack[val + stack_base].i_; push(ref_to_value(addr)); } - // ()Push + // ローカルの配列(参照)からPush void PushLocalArrayRef(int val) { int addr = stack[val + stack_base].i_; @@ -134,7 +134,7 @@ push(ref_to_value(addr + index)); } - // ɥ쥹Push + // アドレスをPush void PushAddr(int val) { if ((val & global_flag) == 0) // local @@ -142,7 +142,7 @@ push(val); } - // Υɥ쥹Push + // 配列のアドレスをPush void PushArrayAddr(int val) { if ((val & global_flag) == 0) // local @@ -151,40 +151,40 @@ push(val + index); } - // ѿPop + // 変数にPop void PopValue(int val) { global_value[val] = top(); pop(); } - // ѿPop + // ローカル変数にPop void PopLocal(int val) { stack[val + stack_base] = top(); pop(); } - // ѿPop + // 配列変数にPop void PopArray(int val) { int index = top().i_; pop(); global_value[val + index] = top(); pop(); } - // ѿPop + // ローカルの配列変数にPop void PopLocalArray(int val) { int index = top().i_; pop(); stack[val + stack_base + index] = top(); pop(); } - // ѿ()Pop + // ローカル変数(参照)にPop void PopLocalRef(int val) { int addr = stack[val + stack_base].i_; set_ref(addr, top()); pop(); } - // ѿ()Pop + // ローカルの配列変数(参照)にPop void PopLocalArrayRef(int val) { int addr = stack[val + stack_base].i_; @@ -192,19 +192,19 @@ set_ref(addr + index, top()); pop(); } - // ѿ + // ローカル変数を確保 void OpAllocStack(int val) { stack.resize(stack_base + val); } - // PopʥåȥåפΤƤ + // 空Pop(スタックトップを捨てる) void OpPop() { pop(); } - // ñޥʥ + // 単項マイナス void OpNeg() { top().i_ = -top().i_; @@ -350,7 +350,7 @@ push(lhs % rhs); } - // ʸ== + // 文字列の== void OpStrEq() { const std::string &rhs = text(top()); pop(); @@ -359,7 +359,7 @@ push(lhs == rhs); } - // ʸ!= + // 文字列の!= void OpStrNe() { const std::string &rhs = text(top()); pop(); @@ -368,7 +368,7 @@ push(lhs != rhs); } - // ʸ> + // 文字列の> void OpStrGt() { const std::string &rhs = text(top()); pop(); @@ -377,7 +377,7 @@ push(lhs > rhs); } - // ʸ>= + // 文字列の>= void OpStrGe() { const std::string &rhs = text(top()); pop(); @@ -386,7 +386,7 @@ push(lhs >= rhs); } - // ʸ< + // 文字列の< void OpStrLt() { const std::string &rhs = text(top()); pop(); @@ -395,7 +395,7 @@ push(lhs < rhs); } - // ʸ<= + // 文字列の<= void OpStrLe() { const std::string &rhs = text(top()); pop(); @@ -404,7 +404,7 @@ push(lhs <= rhs); } - // ʸ+ + // 文字列の+ void OpStrAdd() { const std::string &rhs = text(top()); pop(); @@ -413,13 +413,13 @@ push(lhs + rhs); } - // ̵兩 + // 無条件ジャンプ void OpJmp(int val) { jmp(val); } - // λ + // 真の時ジャンプ void OpJmpC(int val) { int cond = top().i_; pop(); @@ -427,7 +427,7 @@ jmp(val); } - // λ + // 偽の時ジャンプ void OpJmpNC(int val) { int cond = top().i_; pop(); @@ -435,7 +435,7 @@ jmp(val); } - // switchʸüȽ + // switch文用特殊判定 void OpTest(int val) { int value = top().i_; pop(); @@ -445,19 +445,19 @@ } } - // ؿ + // 関数コール void OpCall(int val) { push(stack_base); - push(addr()); // ɥ쥹Push - stack_base = stack.size(); // å١ + push(addr()); // リターンアドレスをPush + stack_base = stack.size(); // スタックベース更新 jmp(val); } - // ʤ + // 引数なしリターン void OpReturn() { - stack.resize(stack_base); // ѿӽ + stack.resize(stack_base); // ローカル変数排除 int addr = top().i_; pop(); stack_base = top().i_; pop(); int arg_count = top().i_; pop(); @@ -465,11 +465,11 @@ jmp(addr); } - // դ + // 引数付きリターン void OpReturnV() { vm::value result = top(); pop(); - stack.resize(stack_base); // ѿӽ + stack.resize(stack_base); // ローカル変数排除 int addr = top().i_; pop(); stack_base = top().i_; pop(); int arg_count = top().i_; pop(); @@ -478,12 +478,12 @@ jmp(addr); } - // CPUץ + // 仮想CPUプログラム停止 void OpHalt() { } - // ƥॳȤ߹ߴؿ + // システムコール(組み込み関数) void OpSysCall(int val) { pop(); // arg_count @@ -498,20 +498,20 @@ } } - // ƥॳprint + // システムコール(print) void sys_print() { std::cout << text(top()); pop(); } - // ƥॳ(ͤʸѴ) + // システムコール(数値を文字列に変換) void sys_tostr() { int v = top().i_; pop(); char str[16]; sprintf(str, "%d", v); - push(std::string(str)); // ͤϥå + push(std::string(str)); // 戻り値はスタックに入れる } private: