macroprocessor: change type of function arguments
parent
73f71862ee
commit
8cf4fedac2
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue