diff options
author | 2009-08-31 18:04:51 +0000 | |
---|---|---|
committer | 2009-08-31 18:04:51 +0000 | |
commit | 289e4fca4394ca0964b9b76a834e61bcdec821c9 (patch) | |
tree | da8ec0e78883b623aaabb4389f884fa508e57f36 /forth | |
parent | 19a89f287f3af6fd34470a7aab92a989109d513f (diff) |
add missing files
git-svn-id: http://skia.googlecode.com/svn/trunk@345 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'forth')
-rw-r--r-- | forth/ForthParser.h | 35 | ||||
-rw-r--r-- | forth/StdWords.cpp | 353 |
2 files changed, 388 insertions, 0 deletions
diff --git a/forth/ForthParser.h b/forth/ForthParser.h new file mode 100644 index 0000000000..9c939f83db --- /dev/null +++ b/forth/ForthParser.h @@ -0,0 +1,35 @@ +#ifndef ForthParser_DEFINED +#define ForthParser_DEFINED + +#include "SkTDict.h" + +class ForthWord; +class FCode; + +class ForthParser { +public: + ForthParser(); + ~ForthParser(); + + const char* parse(const char text[], FCode*); + + void addWord(const char name[], ForthWord* word) { + this->add(name, strlen(name), word); + } + + void add(const char name[], size_t len, ForthWord* word) { + (void)fDict.set(name, len, word); + } + + ForthWord* find(const char name[], size_t len) const { + ForthWord* word; + return fDict.find(name, len, &word) ? word : NULL; + } + +private: + void addStdWords(); + + SkTDict<ForthWord*> fDict; +}; + +#endif diff --git a/forth/StdWords.cpp b/forth/StdWords.cpp new file mode 100644 index 0000000000..4216e610ce --- /dev/null +++ b/forth/StdWords.cpp @@ -0,0 +1,353 @@ +#include "Forth.h" +#include "ForthParser.h" +#include "SkString.h" + +class drop_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + (void)fe->pop(); + } +}; + +class clearStack_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + fe->clearStack(); + } +}; + +class dup_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + fe->push(fe->top()); + } +}; + +class swap_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + int32_t a = fe->pop(); + int32_t b = fe->top(); + fe->setTop(a); + fe->push(b); + } +}; + +class rot_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + fe->push(fe->peek(1)); + } +}; + +///////////////// ints + +class add_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + intptr_t tmp = fe->pop(); + fe->setTop(fe->top() + tmp); + } +}; + +class sub_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + intptr_t tmp = fe->pop(); + fe->setTop(fe->top() - tmp); + } +}; + +class mul_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + intptr_t tmp = fe->pop(); + fe->setTop(fe->top() * tmp); + } +}; + +class div_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + intptr_t tmp = fe->pop(); + fe->setTop(fe->top() / tmp); + } +}; + +class dot_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + SkString str; + str.printf("%d ", fe->pop()); + fe->sendOutput(str.c_str()); + } +}; + +class abs_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + int32_t value = fe->top(); + if (value < 0) { + fe->setTop(-value); + } + } +}; + +class min_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + int32_t value = fe->pop(); + if (value < fe->top()) { + fe->setTop(value); + } + } +}; + +class max_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + int32_t value = fe->pop(); + if (value > fe->top()) { + fe->setTop(value); + } + } +}; + +///////////////// floats + +class fadd_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + float tmp = fe->fpop(); + fe->fsetTop(fe->ftop() + tmp); + } +}; + +class fsub_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + float tmp = fe->fpop(); + fe->fsetTop(fe->ftop() - tmp); + } +}; + +class fmul_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + float tmp = fe->fpop(); + fe->fsetTop(fe->ftop() * tmp); + } +}; + +class fdiv_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + float tmp = fe->fpop(); + fe->fsetTop(fe->ftop() / tmp); + } +}; + +class fdot_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + SkString str; + str.printf("%g ", fe->fpop()); + fe->sendOutput(str.c_str()); + } +}; + +class fabs_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + float value = fe->ftop(); + if (value < 0) { + fe->fsetTop(-value); + } + } +}; + +class fmin_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + float value = fe->fpop(); + if (value < fe->ftop()) { + fe->fsetTop(value); + } + } +}; + +class fmax_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + float value = fe->fpop(); + if (value > fe->ftop()) { + fe->fsetTop(value); + } + } +}; + +class floor_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + fe->fsetTop(floorf(fe->ftop())); + } +}; + +class ceil_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + fe->fsetTop(ceilf(fe->ftop())); + } +}; + +class round_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + fe->fsetTop(floorf(fe->ftop() + 0.5f)); + } +}; + +class f2i_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + fe->setTop((int)fe->ftop()); + } +}; + +class i2f_ForthWord : public ForthWord { +public: + virtual void exec(ForthEngine* fe) { + fe->fsetTop((float)fe->top()); + } +}; + +/////////////////////////////////////////////////////////////////////////////// + +class eq_ForthWord : public ForthWord { public: + virtual void exec(ForthEngine* fe) { + fe->push(fe->pop() == fe->pop()); + } +}; + +class neq_ForthWord : public ForthWord { public: + virtual void exec(ForthEngine* fe) { + fe->push(fe->pop() != fe->pop()); + } +}; + +class lt_ForthWord : public ForthWord { public: + virtual void exec(ForthEngine* fe) { + intptr_t tmp = fe->pop(); + fe->setTop(fe->top() < tmp); + } +}; + +class le_ForthWord : public ForthWord { public: + virtual void exec(ForthEngine* fe) { + intptr_t tmp = fe->pop(); + fe->setTop(fe->top() <= tmp); + } +}; + +class gt_ForthWord : public ForthWord { public: + virtual void exec(ForthEngine* fe) { + intptr_t tmp = fe->pop(); + fe->setTop(fe->top() > tmp); + } +}; + +class ge_ForthWord : public ForthWord { public: + virtual void exec(ForthEngine* fe) { + intptr_t tmp = fe->pop(); + fe->setTop(fe->top() >= tmp); + } +}; + +class feq_ForthWord : public ForthWord { public: + virtual void exec(ForthEngine* fe) { + fe->push(fe->fpop() == fe->fpop()); + } +}; + +class fneq_ForthWord : public ForthWord { public: + virtual void exec(ForthEngine* fe) { + fe->push(fe->fpop() != fe->fpop()); + } +}; + +class flt_ForthWord : public ForthWord { public: + virtual void exec(ForthEngine* fe) { + float tmp = fe->fpop(); + fe->setTop(fe->ftop() < tmp); + } +}; + +class fle_ForthWord : public ForthWord { public: + virtual void exec(ForthEngine* fe) { + float tmp = fe->fpop(); + fe->setTop(fe->ftop() <= tmp); + } +}; + +class fgt_ForthWord : public ForthWord { public: + virtual void exec(ForthEngine* fe) { + float tmp = fe->fpop(); + fe->setTop(fe->ftop() > tmp); + } +}; + +class fge_ForthWord : public ForthWord { public: + virtual void exec(ForthEngine* fe) { + float tmp = fe->fpop(); + fe->setTop(fe->ftop() >= tmp); + } +}; + +/////////////////////////////////////////////////////////////////////////////// + +void ForthParser::addStdWords() { + this->add("clr", 3, new clearStack_ForthWord); + this->add("drop", 4, new drop_ForthWord); + this->add("dup", 3, new dup_ForthWord); + this->add("swap", 4, new swap_ForthWord); + this->add("rot", 3, new rot_ForthWord); + + this->add("+", 1, new add_ForthWord); + this->add("-", 1, new sub_ForthWord); + this->add("*", 1, new mul_ForthWord); + this->add("/", 1, new div_ForthWord); + this->add(".", 1, new dot_ForthWord); + this->add("abs", 3, new abs_ForthWord); + this->add("min", 3, new min_ForthWord); + this->add("max", 3, new max_ForthWord); + + this->add("f+", 2, new fadd_ForthWord); + this->add("f-", 2, new fsub_ForthWord); + this->add("f*", 2, new fmul_ForthWord); + this->add("f/", 2, new fdiv_ForthWord); + this->add("f.", 2, new fdot_ForthWord); + this->add("fabs", 4, new fabs_ForthWord); + this->add("fmin", 4, new fmin_ForthWord); + this->add("fmax", 4, new fmax_ForthWord); + this->add("fmax", 4, new fmax_ForthWord); + this->add("floor", 5, new floor_ForthWord); + this->add("ceil", 4, new ceil_ForthWord); + this->add("round", 5, new round_ForthWord); + this->add("f>i", 3, new f2i_ForthWord); + this->add("i>f", 3, new i2f_ForthWord); + + this->add("=", 1, new eq_ForthWord); + this->add("<>", 2, new neq_ForthWord); + this->add("<", 1, new lt_ForthWord); + this->add("<=", 2, new le_ForthWord); + this->add(">", 1, new gt_ForthWord); + this->add(">=", 2, new ge_ForthWord); + + this->add("f=", 2, new feq_ForthWord); + this->add("f<>", 3, new fneq_ForthWord); + this->add("f<", 2, new flt_ForthWord); + this->add("f<=", 3, new fle_ForthWord); + this->add("f>", 2, new fgt_ForthWord); + this->add("f>=", 3, new fge_ForthWord); +} + |