PH Logo
Logo intepreter modeled after UCB Logo.
/Users/paul/Documents/phlogo/core/Verbs.h
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
 All Classes Functions