int evaluateWord(int code){ //(code is correct syntax)?return>0:return<0 logPutOut("evaluateWord(%d)",code); if(code>NUMOFTOKEN&&code<=NUMOFTOKEN+NUMOFSYNTAX){ logPutOut("-evaluateSyntax\n"); return(evaluateSyntax(code)); //return>0 is correct }else if(code>0&&code<=NUMOFTOKEN){ logPutOut("-evaluateToken\n"); return(evaluateToken(code)); //return>0 is correct }else{ logPutOut("-ERR\n"); return -1; } }
Obj_ptr evaluate(const ParseTree_ptr &root, env_ptr & env) { if (root == nullptr) return nullptr; std::string token = root->getToken(); Obj_ptr obj; bool numberFlag = true, rationalFlag = false, realFlag = false, idenFlag = true; checkToken(token, numberFlag, rationalFlag, realFlag, idenFlag); //----number----- if (numberFlag) { //----integer----- if (!rationalFlag && !realFlag) obj = Obj_ptr( new IntegerObj( bigInteger(token) ) ); //----rational---- else if (rationalFlag) obj = Obj_ptr( new RationalObj( bigRational(token) ) ); //----real-------- else obj = Obj_ptr( new RealObj( bigReal(token) ) ); return descend(obj); } //----comma-------- else if (token[0]==',') throw syntaxError("unexpected comma here"); //----identifier---- else if (idenFlag) { obj = findIden(env, token); if (obj.get() == nullptr) { if (builtInProcedure.find(token) == builtInProcedure.end()) throw syntaxError("Undefined identifier: " + token); Arg_ptr nullArg(nullptr); ParseTree_ptr nullTree(nullptr); env_ptr nullEnv(nullptr); obj = Obj_ptr(new ProcedureObj(nullArg, nullTree, nullEnv, true, token)); } return descend(obj); } //----char&bool----- else if (token[0]=='#') { //----char----- if (token[1]=='\\') { if (token=="#\\newline") obj = Obj_ptr( new CharObj('\n') ); else if (token=="#\\space") obj = Obj_ptr( new CharObj(' ') ); else if (token=="#\\tab") obj = Obj_ptr( new CharObj('\t') ); else obj = Obj_ptr( new CharObj(token[2]) ); return descend(obj); } //----bool----- else { if (token[1]=='t') obj = Obj_ptr( new BoolObj(true) ); else obj = Obj_ptr( new BoolObj(false) ); return descend(obj); } } //----string------- else if (token[0]=='\"') { obj = Obj_ptr( new StringObj(token.substr(1, token.size()-2)) ); return descend(obj); } //----quote------- else if (token=="\'") { obj = Quote(root); return descend(obj); } else if (token=="`") { obj = Quasiquote(root, env); return descend(obj); } //----syntax&procedure---- else if (token=="()") { ParseTree_ptr name = root->getSon(); if (name == nullptr) throw syntaxError("missing expression"); std::string iden = name->getToken(); //--------syntax------------ if (builtInSyntax.find(iden) != builtInSyntax.end()) { return descend(evaluateSyntax(iden, name->getBrother(), env)); } //--------procedure--------- Obj_ptr obj = findIden(env, iden); //--------procedure object---- if (iden == "()") { obj = evaluate(name, env); if (obj->Type != Procedure) throw syntaxError("not a procedure"); } if (obj==nullptr) { if (builtInProcedure.find(iden) == builtInProcedure.end()) throw syntaxError("Undefined identifier: " + iden); } else if (obj->Type != Procedure) throw syntaxError("\'" + iden + "\' is not a procedure"); ParseTree_ptr para = name->getBrother(); Para_ptr head=nullptr, tail=nullptr; while (para!=nullptr) { if (head==nullptr) { head = Para_ptr( new Parameters(evaluate(para, env)) ); tail = head; } else { tail->next = Para_ptr( new Parameters(evaluate(para, env)) ); tail = tail->next; } para = para->getBrother(); } if (obj) //define by user { return descend(evaluateUserDefined(obj, head, env)); } else // built-in { return descend(evaluateBuiltInProcedure(iden, head, env)); } } //----else---------- else { throw syntaxError("Illegal expression or the function you use is not available now."); } }