annotate Bison-Flex/BasicCompiler-StackBase/EUC/node.cpp @ 0:db40c85cad7a default tip

upload sample source
author nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
date Mon, 09 May 2011 03:11:59 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 #include <functional>
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 #include <iostream>
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 #include <iomanip>
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 #include "node.h"
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 #include "compiler.h"
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 #include "script-parser.hh"
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 // ノード生成
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 // ただし、定数同士の計算は、leftノードに結果を代入し、それを返す
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 CNode *CNode::MakeNode(compiler &c, const yy::location& l, int op, CNode *left, CNode *right)
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 if (right == 0) {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 switch (op) {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 case OP_NEG:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 if (left->op_ == OP_CONST) { // 定数演算を計算する
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 left->value_ = -left->value_;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 return left;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 return new CNode(l, op, left);
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 // 定数演算を計算する
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 if (left->op_ == OP_CONST && right->op_ == OP_CONST) {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 switch (op) {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 case OP_EQ:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 left->value_ = (left->value_ == right->value_)? 1: 0;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 case OP_NE:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 left->value_ = (left->value_ != right->value_)? 1: 0;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 case OP_GT:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 left->value_ = (left->value_ > right->value_)? 1: 0;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 case OP_GE:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 left->value_ = (left->value_ >= right->value_)? 1: 0;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 case OP_LT:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 left->value_ = (left->value_ < right->value_)? 1: 0;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 case OP_LE:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 left->value_ = (left->value_ <= right->value_)? 1: 0;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 case OP_MINUS:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 left->value_ -= right->value_;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 case OP_PLUS:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 left->value_ += right->value_;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 case OP_TIMES:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 left->value_ *= right->value_;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 case OP_DIVIDE:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 if (right->value_ == 0) {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 c.error(l, "定数計算を0で除算しました。");
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 else {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 left->value_ /= right->value_;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 case OP_MOD:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 if (right->value_ == 0) {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 c.error(l, "定数計算を0で除算しました。");
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 else {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 left->value_ %= right->value_;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 default:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 return new CNode(l, op, left, right);
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 delete right;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 return left;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 return new CNode(l, op, left, right);
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 void CNode::push(compiler *c) const
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 switch (op_) {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 case OP_NEG:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 left_->push(c);
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 c->OpNeg();
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 return;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 case OP_RANDFUNC:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 left_->push(c);
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 c->OpRand();
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 return;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 case OP_CONST:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 c->PushConst(value_);
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 return;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 left_->push(c);
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 right_->push(c);
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 // 整数計算ノードの処理
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 switch (op_) {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 case OP_EQ:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 c->OpEq();
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 case OP_NE:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 c->OpNe();
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 case OP_GT:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 c->OpGt();
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 case OP_GE:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 c->OpGe();
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 case OP_LT:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 c->OpLt();
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 case OP_LE:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 c->OpLe();
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 case OP_MINUS:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 c->OpSub();
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 case OP_PLUS:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 c->OpAdd();
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 case OP_TIMES:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 c->OpMul();
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 case OP_DIVIDE:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 c->OpDiv();
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 case OP_MOD:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 c->OpMod();
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 default:
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 c->error(l_, "内部エラー:処理できない計算ノードがありました。");
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 break;
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 void CNode::pop(compiler *c) const
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 c->error(l_, "内部エラー:計算ノードをpopしています。");
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 void CValueNode::push(compiler *c) const
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 if (op_ != OP_VALUE) {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 c->error(l_, "内部エラー:変数ノードに変数以外が登録されています。");
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 else {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 const CValueTag *tag = c->GetValueTag(*string_);
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 if (tag == 0) {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 c->error(l_, "変数 " + *string_ + " は定義されていません。");
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 else {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 c->PushValue(tag->addr_);
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 void CValueNode::pop(compiler *c) const
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 if (op_ != OP_VALUE) {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 c->error(l_, "内部エラー:変数ノードに変数以外が登録されています。");
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 else {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 const CValueTag *tag = c->GetValueTag(*string_);
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 if (tag == 0) {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 tag = c->AddValue(*string_);
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 if (tag == 0) {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 c->error(l_, "変数 " + *string_ + " が定義できません。");
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 else {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 c->PopValue(tag->addr_);
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 }
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 // 代入命令を生成
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 //
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 // > push b
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 // > pop a
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 //
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 void CAssign::analyze(compiler *c)
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 {
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 expr_->push(c);
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 value_->pop(c);
db40c85cad7a upload sample source
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 }