macroprocessor: change type of function arguments

issue#70
Houtan Bastani 2018-07-11 15:57:51 +02:00
parent 73f71862ee
commit 8cf4fedac2
5 changed files with 17 additions and 18 deletions

View File

@ -50,7 +50,7 @@ class MacroDriver;
string *string_val; string *string_val;
int int_val; int int_val;
const MacroValue *mv; const MacroValue *mv;
vector<string *> *vector_string_p_val; vector<string> *vector_string_val;
}; };
%code { %code {
@ -90,7 +90,7 @@ class MacroDriver;
%left UMINUS UPLUS EXCLAMATION %left UMINUS UPLUS EXCLAMATION
%left LBRACKET %left LBRACKET
%type <vector_string_p_val> func_args %type <vector_string_val> func_args
%type <mv> expr array_expr %type <mv> expr array_expr
%% %%
@ -136,9 +136,9 @@ statement : expr
; ;
func_args : NAME func_args : NAME
{ $$ = new vector<string *>(); $$->push_back($1); } { $$ = new vector<string>(); $$->push_back(*$1); delete $1; }
| func_args COMMA NAME | func_args COMMA NAME
{ $$->push_back($3); } { $$->push_back(*$3); delete $3; }
; ;
expr : INTEGER expr : INTEGER

View File

@ -141,13 +141,13 @@ MacroDriver::replace_vars_in_str(const string &s) const
} }
void void
MacroDriver::set_string_function(const string &name, vector<string *> &args, const MacroValue *value) MacroDriver::set_string_function(const string &name, vector<string> &args, const MacroValue *value)
{ {
auto *smv = dynamic_cast<const StringMV *>(value); auto *smv = dynamic_cast<const StringMV *>(value);
if (!smv) if (!smv)
throw MacroValue::TypeError("The definition of a macro function must evaluate to a string"); throw MacroValue::TypeError("The definition of a macro function must evaluate to a string");
env[name] = new FuncMV(*this, args, *(const_cast<StringMV *>(smv))); env[name] = new FuncMV(*this, args, *(const_cast<StringMV *>(smv)));
} }
const StringMV * const StringMV *
@ -161,7 +161,7 @@ MacroDriver::eval_string_function(const string &name, const MacroValue *args)
if (!fmv) if (!fmv)
throw MacroValue::TypeError("You are using " + name + " as if it were a macro function"); throw MacroValue::TypeError("You are using " + name + " as if it were a macro function");
vector<string *> func_args = fmv->get_args(); vector<string> func_args = fmv->get_args();
if (func_args.size() != (size_t)dynamic_cast<const IntMV *>(args->length())->get_int_value()) if (func_args.size() != (size_t)dynamic_cast<const IntMV *>(args->length())->get_int_value())
{ {
cerr << "Macroprocessor: The evaluation of: " << name << " could not be completed" << endl cerr << "Macroprocessor: The evaluation of: " << name << " could not be completed" << endl
@ -173,7 +173,7 @@ MacroDriver::eval_string_function(const string &name, const MacroValue *args)
int i = 0; int i = 0;
env_t func_env_map; env_t func_env_map;
for (const auto it : func_args) for (const auto it : func_args)
func_env_map[*it] = args->at(i++); func_env_map[it] = args->at(i++);
func_env.push_back(func_env_map); func_env.push_back(func_env_map);
StringMV *smv = new StringMV(*this, replace_vars_in_str(fmv->toString())); StringMV *smv = new StringMV(*this, replace_vars_in_str(fmv->toString()));
@ -182,11 +182,11 @@ MacroDriver::eval_string_function(const string &name, const MacroValue *args)
} }
void void
MacroDriver::push_args_into_func_env(const vector<string *> &args) MacroDriver::push_args_into_func_env(const vector<string> &args)
{ {
env_t func_env_map; env_t func_env_map;
for (const auto it : args) for (const auto it : args)
func_env_map[*it] = NULL; func_env_map[it] = NULL;
func_env.push_back(func_env_map); func_env.push_back(func_env_map);
} }

View File

@ -221,10 +221,10 @@ public:
string replace_vars_in_str(const string &s) const; string replace_vars_in_str(const string &s) const;
//! Set a function with arguments //! Set a function with arguments
void set_string_function(const string &name, vector<string *> &args, const MacroValue *value); void set_string_function(const string &name, vector<string> &args, const MacroValue *value);
//! Push function arguments onto func_env stack setting equal to NULL //! Push function arguments onto func_env stack setting equal to NULL
void push_args_into_func_env(const vector<string *> &args); void push_args_into_func_env(const vector<string> &args);
//! Remove last entry in func_env vector //! Remove last entry in func_env vector
void pop_func_env(); void pop_func_env();

View File

@ -490,7 +490,7 @@ ArrayMV<string>::print() const
return ss.str(); return ss.str();
} }
FuncMV::FuncMV(MacroDriver &driver, vector<string *> &args_arg, StringMV &value_arg) : FuncMV::FuncMV(MacroDriver &driver, vector<string> &args_arg, StringMV &value_arg) :
MacroValue(driver), args(args_arg), value(value_arg) MacroValue(driver), args(args_arg), value(value_arg)
{ {
} }
@ -553,7 +553,7 @@ FuncMV::print() const
{ {
if (comma_flag) if (comma_flag)
retval += ", "; retval += ", ";
retval += *it; retval += it;
comma_flag = true; comma_flag = true;
} }
retval += ")"; retval += ")";
@ -563,7 +563,6 @@ FuncMV::print() const
const MacroValue * const MacroValue *
FuncMV::toArray() const FuncMV::toArray() const
{ {
// COMEBACK
vector<string> v; vector<string> v;
v.push_back(value.toString()); v.push_back(value.toString());
return new ArrayMV<string>(driver, v); return new ArrayMV<string>(driver, v);

View File

@ -209,10 +209,10 @@ class FuncMV : public MacroValue
friend class MacroDriver; friend class MacroDriver;
private: private:
//! Function args & body //! Function args & body
const vector<string *> args; const vector<string> args;
const StringMV &value; const StringMV &value;
public: public:
FuncMV(MacroDriver &driver, vector<string *> &args, StringMV &value_arg); FuncMV(MacroDriver &driver, vector<string> &args, StringMV &value_arg);
~FuncMV() override; ~FuncMV() override;
@ -223,7 +223,7 @@ public:
string toString() const override; string toString() const override;
string print() const override; string print() const override;
const MacroValue *toArray() const override; const MacroValue *toArray() const override;
inline const vector<string *> & inline const vector<string> &
get_args() const get_args() const
{ {
return args; return args;