2018 c 6, Mini-C C++ 6211 611, 61, print,,, (run ),,, (int ), 7, x, x "a" 3 "b" 4 "x" 10 (, ), x STL map 1 + 2, 1 2,, x = ;, 1, 2 x { 1 ; 2 ; ; m, if ( ) { 1 else { 2, 1,, 2 0, 1, 3 0, 2,,, main 6 1
,, Mini-C 62 621 (Exp constant) 61 7 x Exp constant::run 1 run, Expression run virtual int run( std::map<std::string,function*>& func, std::map<std::string,int>& gvar, std::map<std::string,int>& lvar ) const = 0; // (1) // // (2) // // (3) //, asth Expression class ( virtual void print ), run 3, ( ) (1), ( ) (2), ( ) (3), ( ) 2, Exp constant run, (value() 1 ),, asth (void print ) int run( std::map<std::string,function*>& func, std::map<std::string,int>& gvar, std::map<std::string,int>& lvar ) const { return value(); 3 map,asth <map>, std::map<std::string,function*> class Function, Function*, #include<map> class Function; 4, Exp function run 2 asth class Exp function int run( std::map<std::string,function*>& func, std::map<std::string,int>& gvar, std::map<std::string,int>& lvar ) const; 1 value 2 St function Exp function, Exp function run, 6 2
, astcpp, int Exp function::run( std::map<std::string,function*>& func, std::map<std::string,int>& gvar, std::map<std::string,int>& lvar ) const { return 0; //, ( 65 ) 5, // 51 Expression* c1 = new Exp constant(type INT, 7); Expression* c2 = new Exp constant(type CHAR, x ); // std::cout << c1->run(func, gvar, lvar); std::cout<<std::endl; std::cout << c2->run(func, gvar, lvar); std::cout<<std::endl; 7 120 x OK (, ) 622 (Exp variable) 62 a x, Exp variable::run 1 asth class Exp variable, run 2 astcpp Exp variable::run, (1),, (2),, (3),, (1) std::map<std::string,int>::const iterator p; if ((p=lvarfind(name()))!=lvarend()) { return p->second; 3 6 3
, Expression* v a = new Exp variable("a"); Expression* v n = new Exp variable("n"); Expression* v x = new Exp variable("x"); Expression* v p = new Exp variable("p"); // 3 // lvar["a"] = 4; lvar["x"] = 2000; gvar["x"] = -95; gvar["n"] = 10; // std::cout << v a->run(func,gvar,lvar); std::cout<<std::endl; std::cout << v n->run(func,gvar,lvar); std::cout<<std::endl; std::cout << v x->run(func,gvar,lvar); std::cout<<std::endl; std::cout << v p->run(func,gvar,lvar); std::cout<<std::endl; 4 a ( ) 10 n ( ) 2000 x ( ) undefined variable p OK 623 (Exp operation1) 63 + - Exp operation1::run 1, (operand()) run, (operation()),, 3, Operator MINUS, -3, operand() NULL (, assert ) 2 // 503 Expression* v = new Exp variable("n"); Expression* o = new Exp operation1(operator MINUS, v); // lvar["n"] = 31; std::cout << o->run(func, gvar, lvar); std::cout<<std::endl; n=31 -n, -31 OK 6 4
624 (Exp operation2) 64 1 + 2 Exp operation2::run 1 2 // 504 Expression* v = new Exp variable("n"); Expression* c1 = new Exp constant(type INT, 1); Expression* o1 = new Exp operation2(operator PLUS, v, c1); Expression* c2 = new Exp constant(type INT, 2); Expression* o2 = new Exp operation2(operator MUL, o1, c2); // lvar["n"] = 31; std::cout << o1->run(func, gvar, lvar); std::cout<<std::endl; std::cout << o2->run(func, gvar, lvar); std::cout<<std::endl; n=31, o1=n+1 o2=o1*2, 32 64 OK 625 (Exp function) 65 gcd(a,b+5) getint() Exp function::run 1 astcpp Exp function::run (1), ; (2) if ( "getint") { getint ; (3) else if ( "getchar") { getchar ; (4) else if ( "putint") { putint ; (5) else if ( "putchar") { putchar ; (6) else { ; (1) aaa(a+1, b*2, 5), (a+1, b*2, 5), a=3, b=5,, (4, 10, 5) ( ) args() run, std::list<int> i args (2) getint, (name()) "getint", std::cin, 6 5
int i; std::cin >> i; return i; (2) getchar getint, (3) putint putint, Exp function, St function Exp function,, i args 1 std::cout int i = i argsfront(); // std::cout << i; return 0; (4) putchar putint (5) func, f ( ), f run run, func, gvar, i args std::map<std::string,function*>::const iterator p; else { if ((p=funcfind(name()))!=funcend()) { Function* f = p->second; return f->run(func,gvar,i args); else { Function::run 612,, asth class Function, int run( std::map<std::string,function*>& func, std::map<std::string,int>& gvar, std::list<int>& i args ) const;, astcpp 1 6 6
int Function::run( std::map<std::string,function*>& func, std::map<std::string,int>& gvar, std::list<int>& i args ) const { return i argsfront(); // 2 6 05cpp, &, getint(); getchar(); putint(5); putchar( U ); asum(n);, n = 7 626 (St assgin), 66 St assgin::run 1 run, Statement run virtual Return t run( std::map<std::string,function*>& func, std::map<std::string,int>& gvar, std::map<std::string,int>& lvar ) const = 0; run, func, gvar, lvar run, a=b+3;, return, while(i<n) { if (n%r==0) return r; i++;, return, return,, run, return, return, run int, 2 Return t, (asth #include ) 6 7
struct Return t { ; bool val is returned; // return (true/false) int return val; // return, Return t() : val is returned(false), return val(0) { Return t(bool r, int v) : val is returned(r), return val(v) { C++, struct class,, private, class, public, struct, return Return t(false,0), return 7 Return t(true,7) Return t rd, return, rdval is returned true rdreturn val 2 asth St assign run Statement 3 3 astcpp St assign::run (1), NULL assert(lhs()); assert(rhs()); (2) (rhs()) run, (i rhs ) (3) (lhs()), i rhs Exp variable,,, (4), return return Return t(false,0); 4 // i = 0; (506 ) Exp variable* v1 = new Exp variable("i"); Expression* c1 = new Exp constant(type INT, 0); Statement* s1 = new St assign(v1,c1); // std::cout << "before" <<std::endl; // i 5 lvar["i"] = 5; Return t rd = s1->run(func, gvar, lvar); std::cout << "i = " << lvar["i"] <<std::endl; i = 5 i = 0;, i = 0 OK 3 = 0 6 8
627 (St list) 67 St list::run 1, iterator run, return,, return, Return t(false,0) for (std::list<statement*>::const iterator it = statements()begin(); it!= statements()end(); it++) { assert(*it); // NULL Return t rd = (*it)->run(func, gvar, lvar); // if (rdval is returned) return rd; // return, rd return Return t(false,0); // return 2 // 507 // s = 0; Exp variable* v1 = new Exp variable("s"); Expression* c1 = new Exp constant(type INT, 0); Statement* s1 = new St assign(v1,c1); // i = -n; Exp variable* v2 = new Exp variable("i"); Exp variable* v3 = new Exp variable("n"); Expression* e1 = new Exp operation1(operator MINUS, v3); Statement* s2 = new St assign(v2,e1); std::list<statement*> slist; slistpush back(s1); slistpush back(s2); Statement* s3 = new St list(slist); // lvar["s"] = 123; lvar["i"] = 456; lvar["n"] = 5; Return t rd = s3->run(func, gvar, lvar); std::cout << "s = " << lvar["s"] <<std::endl; std::cout << "i = " << lvar["i"] <<std::endl; std::cout << "n = " << lvar["n"] <<std::endl;, s=123, i=456, n=5, s = 0; i = -n;, OK 6 9
s = 0 i = -5 n = 5 628 if (St if) 68 if St if::run 1, condition(), (0 ) then part(), else part(), else part() (, then part() ) 4, then part() run rd rdval is returned true then part() return, rd else part(), Return t(false,0) ( St list, ) 2, Statement* s = make if(); // // lvar["i"] = -5; lvar["s"] = 10; Return t rd1 = s->run(func, gvar, lvar); std::cout << "s = " << lvar["s"] <<std::endl; // lvar["i"] = 7; lvar["s"] = 10; Return t rd0 = s->run(func, gvar, lvar); std::cout << "s = " << lvar["s"] <<std::endl; if (i<0) s = s - i; else s = s + i; s=10, i=-5 s=10, i=7, OK s = 15 s = 17 629 while (St while) 69 while St while::run 4 condition() NULL, then part() else part() NULL 6 10
1 if 2 Statement* s = make while(); // lvar["i"] = -3; lvar["n"] = 3; lvar["s"] = 0; Return t rd = s->run(func, gvar, lvar); std::cout << "i = " << lvar["i"] <<std::endl; std::cout << "n = " << lvar["n"] <<std::endl; std::cout << "s = " << lvar["s"] <<std::endl; while(i<=n) { if (i<0) s = s - i; else s = s + i; i = i + 1; i=-3, n=3, s=0, OK i = 4 n = 3 s = 12 6210 return (St return) 610 return St return::run 1 assert(value()); int rv = value()->run(func,gvar,lvar); return Return t(true,rv); 2 6 10cpp, &, while(i<=n) { if (i<0) s = s - i; else return s; i = i + 1;, i 0, OK 6 11
i = -3 n = 3 s = 0 rdval is returned = 1 rdreturn val = 6 6211 (St function) 611 St function::run 1 function run, Return t(false,0) 2 std::list<expression*> arglist; arglistpush back(new Exp variable("a")); Statement* s = new St function("putint", arglist); lvar["a"] = -3249; Return t rd = s->run(func, gvar, lvar); a=-3249 putint(a), -3249 OK 6212 (Function) Function::run, func gvar i args (std::list<int>&), lvar, body(func,gvar,lvar), (int ), 612 Function::run return i argsfront(); 1 lvar 6 12
2 (a,b,c), (10,7,23), lvar["a"] = 10; lvar["b"] = 7; lvar["c"] = 23;, lvar args(), i args, 3 x, y, z, lvar["x"] = 0; lvar["y"] = 0; lvar["z"] = 0;, lvar["x"]; lvar["y"]; lvar["z"]; lvar 4 Return t rd = body()->run(func, gvar, lvar); 5, return rdreturn val; 6 Function* function asum = make function asum(); // std::list<int> i arglist; i arglistpush back(3); int r = function asum->run(func, gvar, i arglist); std::cout << r << std::endl; 6 13
int asum(int n) { int s; int i; s = 0; i = -n; while(i<=n) { if (i<0) s = s - i; else s = s + i; i = i + 1; return s; n = 3,, 12 OK 7, std::list<expression*> arglist; arglistpush back(new Exp constant(type INT, 5)); Expression* exp function asum = new Exp function("asum", arglist); func["asum"] = make function asum(); int asum5 = exp function asum->run(func, gvar, lvar); std::cout << "asum(5) = " << asum5 <<std::endl; asum(5);, = 30 OK 6213 (Program) Program::run, Program::run, gvar, func, main, 613 Program::run 1 gvar, vars() gvar Function::run 2 func, funcs() func 3 main std::list<int> iargs; int v = main()->run(func, gvar, iargs); return v; 4 6 14
// std::list<variable*> gvar; std::list<function*> func; gvarpush back(new Variable(Type INT, "g")); funcpush back(make function asum()); Program* p = new Program(gvar, func, make function main()); // p->run();, make function main, main int main() { int a; g = 3; a = asum(g); putint(a);, 12 614 factorcpp prog->print(std::cout);, prog->run(); &, asth astcpp, C++,,,,,, Nagisa ISHIURA 6 15