more array support

This commit is contained in:
Samuel D. Crow
2021-03-24 10:17:01 -05:00
parent a96f1345ae
commit f0ad605119
2 changed files with 50 additions and 5 deletions

View File

@@ -376,9 +376,12 @@ class arrayType:public variable
list<unsigned int> dimensions; list<unsigned int> dimensions;
public: public:
string generateBox(enum SCOPES s); string generateBox(enum SCOPES s);
virtual string boxName(list<unsigned int>indexes); virtual string boxName(list<shared_ptr<operands> >indexes);
virtual string boxName(){error(E_UNDIMENSIONED_ARRAY);} virtual string boxName(){error(E_UNDIMENSIONED_ARRAY);}
void assignment(list<shared_ptr<expression> >indexes,
shared_ptr<expression>value);
explicit arrayType(string &name, enum TYPES t, list<unsigned int>dim); explicit arrayType(string &name, enum TYPES t, list<unsigned int>dim);
/*:variable(scope, name, t);*/ /*:variable(scope, name, t);*/
virtual ~arrayType() virtual ~arrayType()

View File

@@ -398,7 +398,7 @@ void variable::assignment(shared_ptr<expression>value)
} }
} }
string arrayType::boxName(list<unsigned int>indexes) string arrayType::boxName(list<shared_ptr<operands> >indexes)
{ {
ostringstream out; ostringstream out;
string buf; string buf;
@@ -406,7 +406,8 @@ string arrayType::boxName(list<unsigned int>indexes)
out << 'v' << this->getID(); out << 'v' << this->getID();
while (i!=indexes.end()) while (i!=indexes.end())
{ {
out << '[' << *i << ']'; out << '[' << (*i)->boxName() << ']';
++i;
} }
out.str(buf); out.str(buf);
out.clear(); out.clear();
@@ -431,7 +432,12 @@ string arrayType::generateBox(enum SCOPES s)
default: default:
error(E_INTERNAL); error(E_INTERNAL);
} }
out << boxName(this->dimensions) << ";\n"; out << 'v' << this->getID();
for (auto i=dimensions.begin();i!=dimensions.end();++i)
{
out << '[' << *i << ']';
}
out << ";\n";
out.str(buf); out.str(buf);
out.clear(); out.clear();
return buf; return buf;
@@ -442,3 +448,39 @@ arrayType::arrayType(string &name, enum TYPES t, list<unsigned int>dim):
{ {
this->dimensions=dim; this->dimensions=dim;
} }
void arrayType::assignment(list<shared_ptr<expression> >indexes,
shared_ptr<expression>value)
{
list<shared_ptr<operands>>x;
shared_ptr<operands>op=value->evaluate();
enum TYPES t=op->getSimpleVarType();
auto i=indexes.begin();
while(i!=indexes.end())
{
x.push_back((*i)->evaluate());
++i;
}
switch (this->getType())
{
case T_FLOATCALL_ARRAY:
if (t==T_INTVAR)
{
output_cpp << this->boxName(x)
<< "=static_cast<double>("
<< op->boxName() << ");\n";
return;
}
if (t!=T_FLOATVAR) error(E_TYPE_MISMATCH);
break;
case T_INTCALL_ARRAY:
if (t!=T_INTVAR) error(E_TYPE_MISMATCH);
break;
case T_STRINGCALL_ARRAY:
if (t!=T_STRINGVAR) error(E_TYPE_MISMATCH);
break;
default:
error(E_INTERNAL);
}
output_cpp << this->boxName(x) << '=' << op->boxName() <<";\n";
}