annotate Bison-Flex/Compiler-StackBase/UTF8/compiler.cpp @ 6:86c0a38332fe

update
author nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
date Tue, 17 May 2011 18:26:00 +0900
parents caede627f691
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
2 // コンパイラドライバ
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 //
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 // (c)2008 Chihiro.SAKAMOTO HyperWorks
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 //
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 #include <iostream>
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 #include <iomanip>
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 #include <memory>
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 #include "compiler.h"
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 #include "script-parser.hh"
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
12 // コンストラクタ
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 compiler::compiler()
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 : break_index(-1), error_count(0)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
19 // デストラクタ
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 compiler::~compiler()
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
25 // コンパイル
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 bool compiler::compile(const std::string &f, vm::data &data)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 {
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
29 // システムコールの設定
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 add_function(vm::SYS_PRINT, TYPE_VOID, "print", "s");
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 add_function(vm::SYS_TOSTR, TYPE_STRING, "str", "i");
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
33 // グローバル変数用、変数テーブルをセット
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 variables.push_back(CValueTable());
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 variables[0].set_global();
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
37 // 先頭はHALT命令にしておく
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 OpHalt();
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 file = f;
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
41 scan_begin(); // スキャナー初期化
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
42 yy::script_parser parser(*this); // パーサー構築
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
43 int result = parser.parse(); // 構文解析
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
44 scan_end(); // スキャナー終了
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 if (result != 0)
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
47 return false; // パーサーエラー
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
49 int code_size = LabelSetting(); // ラベルにアドレスを設定
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
50 CraeteData(data, code_size); // バイナリ生成
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 return error_count == 0;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
54 // エラーメッセージを出力
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 void compiler::error(const yy::location& l, const std::string& m)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 std::cerr << l << ": " << m << std::endl;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 error_count++;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
62 // エラーメッセージを出力
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 void compiler::error(const std::string& m)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 std::cerr << m << std::endl;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 error_count++;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
70 // 内部関数の定義
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 bool compiler::add_function(int index, int type, const char *name, const char *args)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 CFunctionTag func(type);
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
75 if (!func.SetArgs(args)) // 引数を設定
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 return false;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
78 func.SetDeclaration(); // 宣言済み
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
79 func.SetSystem(); // Systemフラグセット
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
80 func.SetIndex(index); // システムコール番号を設定
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 if (functions.add(name, func) == 0) {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 return false;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 return true;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
87 // 外部変数の定義
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 struct define_value {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 compiler *comp_;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 int type_;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 define_value(compiler *comp, int type): comp_(comp), type_(type)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 void operator()(CValueNode *node) const
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 comp_->AddValue(node->location(), type_, node->string(), node->left());
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 } ;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 void compiler::DefineValue(const yy::location& l, int type, CValueList *value_list)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 std::auto_ptr<CValueList> value_list_(value_list);
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 value_list->for_each(define_value(this, type));
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
109 // 関数宣言
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 void compiler::DefineFunction(const yy::location& l, int type, const std::string *name, CArgList *args)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 std::auto_ptr<const std::string> name_(name);
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 std::auto_ptr<CArgList> args_(args);
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 const CFunctionTag *tag = functions.find(*name);
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
117 if (tag) { // 既に宣言済み
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 if (!tag->ChkArgList(args)) {
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
119 error(l, "関数 " + *name + " に異なる型の引数が指定されています");
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 return;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 else {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 CFunctionTag func(type);
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
125 func.SetArgs(args); // 引数を設定
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
126 func.SetDeclaration(); // 宣言済み
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
127 func.SetIndex(MakeLabel()); // ラベル登録
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 if (functions.add(*name, func) == 0) {
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
129 error(l, "内部エラー:関数テーブルに登録できません");
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
134 // 関数定義
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 //
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
136 // 関数が呼ばれた時点のスタック
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 //
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 // +--------------+
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 // | arg2 | -5
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 // +--------------+
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 // | arg1 | -4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 // +--------------+
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 // | arg count | -3
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 // +--------------+
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 // | base_pointer | -2
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 // +--------------+
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 // | return addr | -1
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 // +--------------+
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 //
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
150 // したがって、引数の開始アドレスは-4となり、デクリメントしていく。
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
152 // 引数の変数名を登録
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 struct add_value {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 compiler *comp_;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 CValueTable &values_;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 mutable int addr_;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 add_value(compiler *comp, CValueTable &values): comp_(comp), values_(values), addr_(-4)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 void operator()(CArgDef *arg) const
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 if (!values_.add_arg(arg->type(), arg->name(), addr_)) {
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
165 comp_->error(arg->location(), "引数 " + arg->name() + " は既に登録されています。");
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 addr_--;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 } ;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 void compiler::AddFunction(const yy::location& l, int type, const std::string *name, CArgList *args, CStateBlock *block)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 std::auto_ptr<const std::string> name_(name);
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 std::auto_ptr<CArgList> args_(args);
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 std::auto_ptr<CStateBlock> block_(block);
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 CFunctionTag *tag = functions.find(*name);
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 if (tag) {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 if (tag->IsDefinition()) {
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
180 error(l, "関数 " + *name + " は既に定義されています");
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 return;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 if (tag->IsDeclaration() && !tag->ChkArgList(args)) {
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
184 error(l, "関数 " + *name + " に異なる型の引数が指定されています");
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 return;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 }
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
187 tag->SetDefinition(); // 定義済みに設定
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 else {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 CFunctionTag func(type);
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
191 func.SetArgs(args); // 引数を設定
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
192 func.SetDefinition(); // 定義済み
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
193 func.SetIndex(MakeLabel()); // ラベル登録
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 tag = functions.add(*name, func);
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 if (tag == 0)
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
196 error(l, "内部エラー:関数テーブルに登録できません");
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
199 current_function_name = *name; // 処理中の関数名を登録しておく
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
200 current_function_type = type; // 処理中の関数型を登録しておく
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
201 // 関数内関数(入れ子構造)は無いので、
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
202 // グローバル変数1つでよい
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
204 // 関数のエントリーポイントにラベルを置く
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 SetLabel(tag->GetIndex());
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
208 BlockIn(); // 変数スタックを増やす
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
210 // 引数があれば、引数リストを登録
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 if (args) {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 args->for_each_rev(add_value(this, variables.back()));
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
215 // 文があれば、文を登録
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 if (block) {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 block->analyze(this);
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 const CVMCode &code = statement.back();
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
221 if (type == TYPE_VOID) { // 戻り値無し
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
222 if (code.op_ != VM_RETURN) // returnが無いならば
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
223 OpReturn(); // returnを追加
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 else {
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
226 if (code.op_ != VM_RETURNV) { // returnが無いならば
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
227 error(l, "関数 " + *name + " の最後にreturn文が有りません。");
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
230
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
231 BlockOut(); // 変数スタックを減らす
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
232
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
233 current_function_name.clear(); // 処理中の関数名を消去
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
236 void compiler::AddGotoFunction(const yy::location& l, int type, const std::string *name, CArgList *args, CStateBlock *block)
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
237 {
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
238 std::auto_ptr<const std::string> name_(name);
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
239 std::auto_ptr<CArgList> args_(args);
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
240 std::auto_ptr<CStateBlock> block_(block);
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
241
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
242 CFunctionTag *tag = functions.find(*name);
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
243 if (tag) {
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
244 if (tag->IsDefinition()) {
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
245 error(l, "関数 " + *name + " は既に定義されています");
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
246 return;
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
247 }
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
248 if (tag->IsDeclaration() && !tag->ChkArgList(args)) {
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
249 error(l, "関数 " + *name + " に異なる型の引数が指定されています");
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
250 return;
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
251 }
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
252 tag->SetDefinition(); // 定義済みに設定
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
253 }
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
254 else {
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
255 CFunctionTag func(type);
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
256 func.SetArgs(args); // 引数を設定
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
257 func.SetDefinition(); // 定義済み
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
258 func.SetIndex(MakeLabel()); // ラベル登録
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
259 tag = functions.add(*name, func);
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
260 if (tag == 0)
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
261 error(l, "内部エラー:関数テーブルに登録できません");
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
262 }
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
263 current_function_name = *name; // 処理中の関数名を登録しておく
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
264 current_function_type = type; // 処理中の関数型を登録しておく
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
265 // 関数内関数(入れ子構造)は無いので、
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
266 // グローバル変数1つでよい
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
267
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
268 // 関数のエントリーポイントにラベルを置く
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
269
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
270 SetLabel(tag->GetIndex());
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
271
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
272 // 引数があれば、引数リストを登録
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
273 if (args) {
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
274 args->for_each_rev(add_value(this, variables.back()));
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
275 }
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
276
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
277 // 文があれば、文を登録
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
278 if (block) {
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
279 block->analyze(this);
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
280 }
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
281
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
282 const CVMCode &code = statement.back();
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
283
6
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
284 current_function_name.clear(); // 処理中の関数名を消去
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
285
6
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
286 OpHalt();
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
287
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
288 }
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
289
6
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
290 void compiler::AddExit(const yy::location& l, int type)
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
291 {
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
292 // OpExit();
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
293 OpHalt();
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
294 }
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
295
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
296
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
297
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
298 // 変数の登録
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
299
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 void compiler::AddValue(const yy::location& l, int type, const std::string &name, const CNode *node)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
301 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
302 int size = 1;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
303 if (node) {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 if (node->op() != OP_CONST) {
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
305 error(l, "配列のサイズは定数で指定してください。");
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
307 else if (node->value() <= 0) {
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
308 error(l, "配列のサイズは1以上の定数が必要です。");
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
309 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
310 size = node->value();
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
311 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
312
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
313 CValueTable &values = variables.back();
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
314 if (!values.add(type, name, size)) {
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
315 error(l, "変数 " + name + " は既に登録されています。");
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
317 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
318
6
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
319
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
320
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
321
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
322 // ラベル生成
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
323
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
324 int compiler::MakeLabel()
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
325 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
326 int index = (int)labels.size();
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
327 labels.push_back(CLabel(index));
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
328 return index;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
329 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
330
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
331 // ラベルのダミーコマンドをステートメントリストに登録する
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
332
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
333 void compiler::SetLabel(int label)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
334 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
335 statement.push_back(CVMCode(VM_MAXCOMMAND, label));
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
336 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
337
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
338 // 文字列定数をpush
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
339
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
340 void compiler::PushString(const std::string &str)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
341 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
342 PushString((int)text_table.size());
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
343 text_table.insert(text_table.end(), str.begin(), str.end());
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
344 text_table.push_back('\0');
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
345 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
346
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
347 // break文に対応したJmpコマンド生成
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
348
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
349 bool compiler::JmpBreakLabel()
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
350 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
351 if (break_index < 0)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
352 return false;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
353 OpJmp(break_index);
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
354 return true;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
355 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
356
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
357 // ブロック内では、新しい変数セットに変数を登録する
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
358
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
359 void compiler::BlockIn()
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
360 {
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
361 int start_addr = 0; // 変数アドレスの開始位置
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
362 if (variables.size() > 1) { // ブロックの入れ子は、開始アドレスを続きからにする。
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
363 start_addr = variables.back().size();
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
364 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
365 variables.push_back(CValueTable(start_addr));
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
366 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
367
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
368 // ブロックの終了で、変数スコープが消える(変数セットを削除する)
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
369
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
370 void compiler::BlockOut()
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
371 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
372 variables.pop_back();
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
373 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
374
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
375 // ローカル変数用にスタックを確保
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
376
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
377 void compiler::AllocStack()
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
378 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
379 OpAllocStack(variables.back().size());
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
380 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
381
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
382 // ラベル解決
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
383 //
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
384 // 1.アドレスを生成する
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
385 // 2.ダミーのラベルコマンドが有ったアドレスを、ラベルテーブルに登録する
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
386 // 3.Jmpコマンドの飛び先をラベルテーブルに登録されたアドレスにする
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
387
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
388 // アドレス計算
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
389 struct calc_addr {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
390 std::vector<CLabel> &labels_;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
391 int &pos_;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
392 calc_addr(std::vector<CLabel> &labels, int &pos): labels_(labels), pos_(pos)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
393 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
394 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
395 void operator()(const CVMCode &code)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
396 {
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
397 if (code.op_ == VM_MAXCOMMAND) { // ラベルのダミーコマンド
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
398 labels_[code.arg1_].pos_ = pos_;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
399 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
400 else {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
401 pos_ += code.size_;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
402 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
403 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
404 } ;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
405
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
406 // ジャンプアドレス設定
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
407
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
408 struct set_addr {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
409 std::vector<CLabel> &labels_;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
410 set_addr(std::vector<CLabel> &labels): labels_(labels)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
411 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
412 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
413 void operator()(CVMCode &code)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
414 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
415 switch (code.op_) {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
416 case VM_JMP:
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
417 case VM_JMPC:
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
418 case VM_JMPNC:
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
419 case VM_TEST:
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
420 case VM_CALL:
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
421 code.arg1_ = labels_[code.arg1_].pos_;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
422 break;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
423 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
424 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
425 } ;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
426
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
427 int compiler::LabelSetting()
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
428 {
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
429 // アドレス計算
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
430 int pos = 0;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
431 std::for_each(statement.begin(), statement.end(), calc_addr(labels, pos));
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
432 // ジャンプアドレス設定
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
433 std::for_each(statement.begin(), statement.end(), set_addr(labels));
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
434
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
435 return pos;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
436 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
437
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
438 // バイナリデータ生成
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
439
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
440 struct copy_code {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
441 unsigned char *p;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
442 copy_code(unsigned char *code): p(code)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
443 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
444 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
445 void operator()(const CVMCode &code)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
446 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
447 p = code.Get(p);
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
448 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
449 } ;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
450
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
451 bool compiler::CraeteData(vm::data &data, int code_size)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
452 {
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
453 const CFunctionTag *tag = GetFunctionTag("main"); // 開始位置
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
454 if (tag == 0) {
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
455 error("関数 \"main\" が見つかりません。");
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
456 return false;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
457 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
458
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
459 data.command_ = new unsigned char[code_size];
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
460 data.text_buffer_ = new char[text_table.size()];
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
461 data.command_size_ = code_size;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
462 data.text_size_ = (int)text_table.size();
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
463 data.value_size_ = (int)variables[0].size();
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
464 data.entry_point_ = labels[tag->index_].pos_;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
465
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
466 if (data.text_size_ != 0)
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
467 memcpy(data.text_buffer_, &text_table[0], data.text_size_);
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
468
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
469 std::for_each(statement.begin(), statement.end(), copy_code(data.command_));
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
470
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
471 return true;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
472 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
473
5
caede627f691 chage encoding
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
474 // デバッグダンプ
4
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
475 #ifdef _DEBUG
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
476 void compiler::debug_dump()
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
477 {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
478 std::cout << "---variables---" << std::endl;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
479 size_t vsize = variables.size();
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
480 std::cout << "value stack = " << vsize << std::endl;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
481 for (size_t i=0; i<vsize; i++) {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
482 variables[i].dump();
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
483 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
484 std::cout << "---code---" << std::endl;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
485
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
486 static const char *op_name[] = {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
487 #define VM_NAMETABLE
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
488 #include "vm_code.h"
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
489 #undef VM_NAMETABLE
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
490 "LABEL",
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
491 } ;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
492
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
493 int pos = 0;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
494 size_t size = statement.size();
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
495 for (size_t i=0; i < size; i++) {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
496 std::cout << std::setw(6) << pos << ": " << op_name[statement[i].op_];
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
497 if (statement[i].size_ > 1) {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
498 std::cout << ", " << statement[i].arg1_;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
499 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
500 std::cout << std::endl;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
501
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
502 if (statement[i].op_ != VM_MAXCOMMAND) {
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
503 pos += statement[i].size_;
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
504 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
505 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
506 }
805d39d28230 add Compiler-stackbase
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
507 #endif