|
PH Logo
Logo intepreter modeled after UCB Logo.
|
00001 /* 00002 * Verbs.h 00003 * 00004 * Author: Paul Hamilton 00005 * Date: 6 Jun 2011 00006 * 00007 */ 00008 #ifndef _VERBS_H 00009 #define _VERBS_H 00010 00011 #include "Types.h" 00012 00013 #include <string> 00014 #include <iterator> 00015 #include <vector> 00016 #include <map> 00017 #include <boost/function.hpp> 00018 00019 namespace phlogo { 00020 00021 class Interpreter; 00022 class World; 00023 class Func; 00024 class Iterators; 00025 00030 class Verbs { 00031 00032 private: 00033 Interpreter *_itp; 00034 World *_world; 00035 00036 public: 00037 Verbs(Interpreter *itp, World *world); 00038 00042 void run(TokenStream *ts); 00043 00047 Func *createFunction(const std::string &name, const std::string &args); 00048 00049 static bool isVariable(const std::string &s) { 00050 return s[0] == ':'; 00051 } 00052 00053 static std::string getVariable(const std::string &s) { 00054 return s.substr(1, s.length()-1); 00055 } 00056 00057 const std::map<std::string, std::string> &getVerbTokenMap() { return _verbtokenmap; } 00058 const std::map<std::string, std::string> &getFuncTokenMap() { return _functokenmap; } 00059 00060 static size_t safeNext(size_t i, size_t end) { 00061 return i == end || i == std::string::npos ? end : i+1; 00062 } 00063 00064 void removeFunction(const std::string &name); 00065 void removeFunctions(); 00066 00067 private: 00068 00069 std::map<std::string, std::string> _verbtokenmap; 00070 std::map<std::string, pVerb> _map; 00071 std::map<std::string, std::string> _functokenmap; 00072 std::map<std::string, boost::shared_ptr<Func> > _funcs; 00073 00074 Func *getFunction(const std::string &name); 00075 void addMap(const std::string &verb, const std::string &token, pVerb func); 00076 long getLong(TokenStream *ts); 00077 double getDouble(TokenStream *ts); 00078 double getNum(TokenStream *ts, bool *isdouble); 00079 std::string getWord(TokenStream *ts); 00080 pThing getThing(TokenStream *ts); 00081 void setBooleanResult(bool flag); 00082 void setLongResult(long n); 00083 void setDoubleResult(double n); 00084 void setStringResult(const std::string &s); 00085 bool equal(pThing thing1, pThing thing2); 00086 00087 // Basic Verbs 00091 void print(TokenStream *ts); 00092 00096 void clearscreen(TokenStream *ts); 00097 00101 void add(TokenStream *ts); 00102 void mul(TokenStream *ts); 00103 void div(TokenStream *ts); 00104 void sub(TokenStream *ts); 00105 00109 void make(TokenStream *ts); 00110 00114 void thing(TokenStream *ts); 00115 00119 void output(TokenStream *ts); 00120 00121 // File verbs 00125 void load(TokenStream *ts); 00126 00127 // Unit verbs 00131 void test(TokenStream *ts); 00132 00136 void testsuite(TokenStream *ts); 00137 00138 // Constructor verbs 00139 void catenateWords(TokenStream *ts, const char *sep); 00140 00145 void word(TokenStream *ts); 00146 00151 void sentence(TokenStream *ts); 00152 00157 void list(TokenStream *ts); 00158 00159 // used by lput and fput 00160 void listput(TokenStream *ts, bool front); 00161 00165 void fput(TokenStream *ts); 00166 00170 void lput(TokenStream *ts); 00171 00175 void array(TokenStream *ts); 00176 00180 void mdarray(TokenStream *ts); 00181 00185 void listtoarray(TokenStream *ts); 00186 00190 void arraytolist(TokenStream *ts); 00191 00195 void combine(TokenStream *ts); 00196 00200 void reverse(TokenStream *ts); 00201 00202 // the next symbol. 00203 static int gSymbol; 00204 00208 void gensym(TokenStream *ts); 00209 00210 // Data Selector Verbs 00214 void first(TokenStream *ts); 00215 00219 void firsts(TokenStream *ts); 00220 00224 void last(TokenStream *ts); 00225 00229 void butfirst(TokenStream *ts); 00230 00234 void butfirsts(TokenStream *ts); 00235 00239 void butlast(TokenStream *ts); 00240 00244 void item(TokenStream *ts); 00245 00249 void mditem(TokenStream *ts); 00250 00254 void pick(TokenStream *ts); 00255 00259 void remove(TokenStream *ts); 00260 00264 void remdup(TokenStream *ts); 00265 00269 void quoted(TokenStream *ts); 00270 00271 // data mutator verbs 00275 void setitem(TokenStream *ts); 00276 00280 void mdsetitem(TokenStream *ts); 00281 00285 void setfirst(TokenStream *ts); 00286 00290 void setbf(TokenStream *ts); 00291 00295 void push(TokenStream *ts); 00296 00300 void pop(TokenStream *ts); 00301 00305 void queue(TokenStream *ts); 00306 00310 void dequeue(TokenStream *ts); 00311 00312 // predicate verbs 00313 void wordp(TokenStream *ts); 00314 void listp(TokenStream *ts); 00315 void arrayp(TokenStream *ts); 00316 void emptyp(TokenStream *ts); 00317 void equalp(TokenStream *ts); 00318 void notequalp(TokenStream *ts); 00319 void beforep(TokenStream *ts); 00320 void eq(TokenStream *ts); 00321 void memberp(TokenStream *ts); 00322 void substringp(TokenStream *ts); 00323 void numberp(TokenStream *ts); 00324 00325 // query verbs 00326 void count(TokenStream *ts); 00327 void ascii(TokenStream *ts); 00328 void ch(TokenStream *ts); 00329 void member(TokenStream *ts); 00330 void lowercase(TokenStream *ts); 00331 void uppercase(TokenStream *ts); 00332 00333 // arithmetic verbs 00334 void sum(TokenStream *ts); 00335 void difference(TokenStream *ts); 00336 void minus(TokenStream *ts); 00337 void product(TokenStream *ts); 00338 void quotient(TokenStream *ts); 00339 void remainder(TokenStream *ts); 00340 void integer(TokenStream *ts); 00341 void round(TokenStream *ts); 00342 void sqrt(TokenStream *ts); 00343 void power(TokenStream *ts); 00344 void exp(TokenStream *ts); 00345 void log10(TokenStream *ts); 00346 void ln(TokenStream *ts); 00347 void sin(TokenStream *ts); 00348 void radsin(TokenStream *ts); 00349 void cos(TokenStream *ts); 00350 void radcos(TokenStream *ts); 00351 void arctan(TokenStream *ts); 00352 void radarctan(TokenStream *ts); 00353 void iseq(TokenStream *ts); 00354 void rseq(TokenStream *ts); 00355 00356 void lessp(TokenStream *ts); 00357 void greaterp(TokenStream *ts); 00358 void lessequalp(TokenStream *ts); 00359 void greaterequalp(TokenStream *ts); 00360 00361 // random verbs 00362 void random(TokenStream *ts); 00363 void rerandom(TokenStream *ts); 00364 00365 // format verbs 00366 void form(TokenStream *ts); 00367 00368 // bit verbs 00369 void bitAnd(TokenStream *ts); 00370 void bitOr(TokenStream *ts); 00371 void bitxor(TokenStream *ts); 00372 void bitnot(TokenStream *ts); 00373 void lshift(TokenStream *ts); 00374 00375 // logical verbs 00376 void And(TokenStream *ts); 00377 void Or(TokenStream *ts); 00378 void Not(TokenStream *ts); 00379 00380 // turtle graphics 00384 void fd(TokenStream *ts); 00385 void bk(TokenStream *ts); 00386 00390 void lt(TokenStream *ts); 00391 void rt(TokenStream *ts); 00392 00393 void setpos(TokenStream *ts); 00394 void setxy(TokenStream *ts); 00395 void setx(TokenStream *ts); 00396 void sety(TokenStream *ts); 00397 void setheading(TokenStream *ts); 00398 void home(TokenStream *ts); 00399 00400 void pos(TokenStream *ts); 00401 void xcor(TokenStream *ts); 00402 void ycor(TokenStream *ts); 00403 void heading(TokenStream *ts); 00404 void towards(TokenStream *ts); 00405 00406 // workspace 00407 void contents(TokenStream *ts); 00408 void procedures(TokenStream *ts); 00409 void primitives(TokenStream *ts); 00410 void names(TokenStream *ts); 00411 00412 void erase(TokenStream *ts); 00413 void erall(TokenStream *ts); 00414 void erps(TokenStream *ts); 00415 void erns(TokenStream *ts); 00416 void ern(TokenStream *ts); 00417 00418 void procedurep(TokenStream *ts); 00419 void primitivep(TokenStream *ts); 00420 void namep(TokenStream *ts); 00421 00425 void repeat(TokenStream *ts); 00426 00430 void penup(TokenStream *ts); 00431 00435 void pendown(TokenStream *ts); 00436 }; 00437 00438 } 00439 00440 #endif // _VERBS_H
1.7.4