From caee16904b985501cff521557c9ab487d2d96a91 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Tue, 11 Oct 2016 16:04:59 +0300 Subject: [PATCH] hurray the parser works --- src/main.cc | 2 +- src/mparser.cc | 35 ++++++++++++++++++++++++++--------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/main.cc b/src/main.cc index 2aec0a0..6a296b9 100644 --- a/src/main.cc +++ b/src/main.cc @@ -127,7 +127,7 @@ static bool init() subgear->color = Vec3(0.8, 0.7, 0.5); */ - machine->add_motor(0, 1.0); + //machine->add_motor(0, 1.0); // shadows init_shadow(2048); diff --git a/src/mparser.cc b/src/mparser.cc index 91b1b80..3bfe8ce 100644 --- a/src/mparser.cc +++ b/src/mparser.cc @@ -37,7 +37,7 @@ struct ParserState { std::map func; std::map gears; - std::stack cur_gear; + std::vector cur_gear; Motor *cur_motor; }; @@ -73,6 +73,7 @@ static int get_func_arity(ParserState *ps, const char *name); static Gear *begin_gear(ParserState *ps); static bool end_gear(ParserState *ps); static Gear *this_gear(ParserState *ps); +static Gear *find_gear(ParserState *ps, const char *name); static void update_gear_vars(ParserState *ps, Gear *gear); static bool set_gear_var(Gear *gear, const char *name, const Value &val); @@ -325,7 +326,7 @@ static bool vector(ParserState *ps) expected(ps, "numbers as vector elements"); return false; } - vec.v[i] = tmp.v[0]; + vec.v[nelem - i - 1] = tmp.v[0]; ps->val.pop(); } @@ -581,7 +582,7 @@ static void print_value(const Value &val, FILE *fp) static Gear *begin_gear(ParserState *ps) { Gear *res = new Gear; - ps->cur_gear.push(res); + ps->cur_gear.push_back(res); return res; } @@ -591,8 +592,8 @@ static bool end_gear(ParserState *ps) errmsg(ps, "parser error: unbalanced end_gear"); return false; } - Gear *gear = ps->cur_gear.top(); - ps->cur_gear.pop(); + Gear *gear = ps->cur_gear.back(); + ps->cur_gear.pop_back(); printf("DBG: end_gear: %s\n", gear->name.c_str()); @@ -606,14 +607,28 @@ static bool end_gear(ParserState *ps) ps->mcn->add_gear(gear); if(!ps->cur_gear.empty()) { - ps->cur_gear.top()->attach(gear); + ps->cur_gear.back()->attach(gear); } return true; } static Gear *this_gear(ParserState *ps) { - return ps->cur_gear.empty() ? 0 : ps->cur_gear.top(); + return ps->cur_gear.empty() ? 0 : ps->cur_gear.back(); +} + +static Gear *find_gear(ParserState *ps, const char *name) +{ + // search progressively wider lexical scopes + std::vector::const_reverse_iterator it = ps->cur_gear.rbegin(); + while(it != ps->cur_gear.rend()) { + Gear *g = *it++; + if(g->name == std::string(name)) { + return g; + } + } + + return ps->gears[name]; } static void update_gear_vars(ParserState *ps, Gear *gear) @@ -652,6 +667,7 @@ static bool set_gear_var(Gear *gear, const char *name, const Value &val) ASSERT_TYPE(val, VAL_VEC); gear->axis = VVEC3(val); gear->pdist = val.v[3]; + printf("setting plane eqn: %f %f %f %f\n", val.v[0], val.v[1], val.v[2], val.v[3]); } else if(strcmp(name, "thickness") == 0) { ASSERT_TYPE(val, VAL_NUM); @@ -784,13 +800,14 @@ static bool func_coaxial(ParserState *ps) return false; } - Gear *gother = ps->gears[val_gear_name.s]; + Gear *gother = find_gear(ps, val_gear_name.s.c_str()); if(!gother) { errmsg(ps, "coaxial: gear \"%s\" not found", val_gear_name.s.c_str()); return false; } - Vec3 pos = gother->pos + gother->axis * val_dist.v[0]; + float avg_thickness = (gthis->thickness + gother->thickness) * 0.5; + Vec3 pos = gother->pos + gother->axis * val_dist.v[0] * avg_thickness; Value res; res.type = VAL_VEC; -- 1.7.10.4