some cosmetic changes to fix warnings and forLoop

This commit is contained in:
Samuel D. Crow
2021-05-04 12:15:49 -05:00
parent e8a47bd3da
commit bf70fd087b
8 changed files with 102 additions and 50 deletions

View File

@@ -1,9 +1,9 @@
CC := g++ CC := g++
CFLAGS := -Wall CFLAGS := -Wall
CFLAGS += -std=c++11 CFLAGS += -std=c++11
CFLAGS += -fno-rtti #CFLAGS += -fno-rtti
CFLAGS += -fno-exceptions #CFLAGS += -fno-exceptions
CFLAGS += -Os #CFLAGS += -Os
LFLAGS := LFLAGS :=
ODIR := build ODIR := build

View File

@@ -1,9 +1,9 @@
CC := g++ CC := g++
CFLAGS := -Wall CFLAGS := -Wall
CFLAGS += -std=c++11 CFLAGS += -std=c++11
CFLAGS += -fno-rtti #CFLAGS += -fno-rtti
CFLAGS += -fno-exceptions #CFLAGS += -fno-exceptions
CFLAGS += -Os #CFLAGS += -Os
LFLAGS := LFLAGS :=
all: binaries all: binaries

View File

@@ -5,7 +5,7 @@
*/ */
#include "runtime.h" #include "runtime.h"
struct subroutine *callStack=nullptr; subroutine *callStack=nullptr;
subroutine::subroutine(unsigned int r) subroutine::subroutine(unsigned int r)
{ {
@@ -17,7 +17,7 @@ unsigned int subroutine::close()
{ {
if (callStack==nullptr) return STACK_UNDERFLOW_ERROR; if (callStack==nullptr) return STACK_UNDERFLOW_ERROR;
unsigned int r=callStack->ret; unsigned int r=callStack->ret;
struct subroutine *l=callStack->called; subroutine *l=callStack->called;
delete callStack; delete callStack;
callStack=l; callStack=l;
return r; return r;

View File

@@ -20,7 +20,7 @@ enum STATES:unsigned int
class subroutine class subroutine
{ {
struct subroutine *called; subroutine *called;
unsigned int ret; unsigned int ret;
public: public:
@@ -30,7 +30,7 @@ public:
{} {}
}; };
extern struct subroutine *callStack; extern subroutine *callStack;
/* function prototype */ /* function prototype */
unsigned int run(); unsigned int run();

View File

@@ -330,11 +330,8 @@ void testFunc()
{ {
logger("testFunc started"); logger("testFunc started");
string name=string("square"); string name=string("square");
logger("aloha");
o = operands::createOp(T_FLOATVAR); o = operands::createOp(T_FLOATVAR);
logger("mahalo");
func=fn::declare(name, T_FLOATFUNC, o); func=fn::declare(name, T_FLOATFUNC, o);
logger("funkBeat");
name=string("radius"); name=string("radius");
func->addParameter(name, T_FLOATVAR); func->addParameter(name, T_FLOATVAR);
logger("param added"); logger("param added");
@@ -358,6 +355,27 @@ void testFunc()
logger("testFunc cleared"); logger("testFunc cleared");
} }
void testForLoop()
{
logger("testForLoop started");
string name=string("counter");
logger("creating counter variable");
v=variableType::getOrCreateVar(name, T_INTVAR);
logger("initializing forLoop");
forLoop *f=new forLoop(v,new expression(new constOp("1", T_INT)),
new expression(new constOp("10", T_INT)),
new expression(new constOp("2", T_INT)));
logger("printing variable");
print=new printSegment(new expression(v), S_LINEFEED);
print->generate();
logger("closing testForLoop");
f->close();
delete f;
logger("disposing of counter variable");
v->dispose();
logger("testForLoop cleared");
}
/* open files and compile */ /* open files and compile */
void compile() void compile()
{ {
@@ -366,6 +384,7 @@ void compile()
testString(); testString();
testFloat(); testFloat();
testFunc(); testFunc();
testForLoop();
logger("generating end"); logger("generating end");
label::generateEnd(); label::generateEnd();
/*check for nesting error */ /*check for nesting error */

View File

@@ -24,6 +24,7 @@ using namespace std;
#define VER_RELEASE 1 #define VER_RELEASE 1
class variableType; class variableType;
class expression;
class fn; class fn;
extern ofstream output_cpp; extern ofstream output_cpp;
extern ofstream funcs_h; extern ofstream funcs_h;
@@ -180,6 +181,7 @@ public:
static enum TYPES getSimpleVarType(enum TYPES t); static enum TYPES getSimpleVarType(enum TYPES t);
void generateBox(enum SCOPES s); void generateBox(enum SCOPES s);
void assignment(expression *value);
static operands *createOp(enum TYPES t); static operands *createOp(enum TYPES t);
virtual void dispose(); virtual void dispose();
}; };
@@ -216,6 +218,7 @@ class constOp:public operands
void processConst(unsigned int i); void processConst(unsigned int i);
/* const that must be defined still */ /* const that must be defined still */
void processConst(const string &s); void processConst(const string &s);
void assignment(expression *v);
public: public:
virtual string boxName(){return box;} virtual string boxName(){return box;}
@@ -360,7 +363,6 @@ public:
static variableType *cloneAttributes(variableType *v); static variableType *cloneAttributes(variableType *v);
virtual string boxName(); virtual string boxName();
void assignment(expression *value);
/* always call generateBox() after new variableType() */ /* always call generateBox() after new variableType() */
variableType(enum SCOPES s, string &name, enum TYPES t, fn *fnHandle); variableType(enum SCOPES s, string &name, enum TYPES t, fn *fnHandle);
variableType(); variableType();
@@ -387,8 +389,8 @@ public:
class forLoop:public codeType class forLoop:public codeType
{ {
variableType *var; variableType *var;
variableType *startTemp; tempVar *startTemp;
variableType *stopTemp; tempVar *stopTemp;
whileLoop *infrastructure; whileLoop *infrastructure;
expression *step; expression *step;
public: public:

View File

@@ -117,12 +117,14 @@ void label::generate()
ifStatement::ifStatement(expression *e):codeType(T_IF) ifStatement::ifStatement(expression *e):codeType(T_IF)
{ {
logger("creating ifStatement");
this->redo=new label(); this->redo=new label();
redo->generate(); redo->generate();
this->done=new label(); this->done=new label();
expression *f=new expression(e,O_NOT); expression *f=new expression(e,O_NOT);
this->chain=new label(); this->chain=new label();
chain->generateCondJump(f); chain->generateCondJump(f);
logger("ifStatement created");
} }
void ifStatement::generateBreak() void ifStatement::generateBreak()
@@ -151,9 +153,11 @@ void ifStatement::alternative(expression *e)
void ifStatement::close() void ifStatement::close()
{ {
logger("closing ifStatement");
/* elsif ended without else in between */ /* elsif ended without else in between */
if(this->chain)error(E_BAD_SYNTAX); if(this->chain)error(E_BAD_SYNTAX);
this->done->generate(); this->done->generate();
logger("ifStatement closed");
} }
ifStatement::~ifStatement() ifStatement::~ifStatement()
@@ -214,12 +218,14 @@ doLoop::~doLoop()
whileLoop::whileLoop(expression *e):codeType(T_WHILELOOP) whileLoop::whileLoop(expression *e):codeType(T_WHILELOOP)
{ {
logger("creating whileLoop");
loopContinue=new label(); loopContinue=new label();
loopStart=new label(); loopStart=new label();
loopEnd=new label(); loopEnd=new label();
cond=e; cond=e;
loopStart->generateJumpTo(); loopStart->generateJumpTo();
loopContinue->generate(); loopContinue->generate();
logger("whileLoop created");
} }
void whileLoop::generateBreak() void whileLoop::generateBreak()
@@ -229,9 +235,11 @@ void whileLoop::generateBreak()
void whileLoop::close() void whileLoop::close()
{ {
logger("closing whileLoop");
loopStart->generate(); loopStart->generate();
loopContinue->generateCondJump(cond); loopContinue->generateCondJump(cond);
loopEnd->generate(); loopEnd->generate();
logger("whileLoop cleared");
} }
whileLoop::~whileLoop() whileLoop::~whileLoop()
@@ -245,40 +253,57 @@ whileLoop::~whileLoop()
forLoop::forLoop(variableType *v, expression *start, expression *stop, forLoop::forLoop(variableType *v, expression *start, expression *stop,
expression *stepVal):codeType(T_FORLOOP) expression *stepVal):codeType(T_FORLOOP)
{ {
logger("creating forLoop");
startTemp=tempVar::getOrCreateVar(v->getSimpleVarType());
stopTemp=tempVar::getOrCreateVar(v->getSimpleVarType());
logger("forLoop assignments");
/*v=start; /*v=start;
stopTemp=stop;*/ stopTemp=stop;*/
v->assignment(start); v->assignment(start);
logger("start evaluated");
stopTemp->assignment(stop); stopTemp->assignment(stop);
/* if (v<stopTemp) */ /* if (v<stopTemp) */
logger("creating embedded if statement in forLoop");
ifStatement *c=new ifStatement(new expression(new expression(v), O_LESS, ifStatement *c=new ifStatement(new expression(new expression(v), O_LESS,
new expression(stopTemp))); new expression(stopTemp)));
/* startTemp=v;*/ /* startTemp=v;*/
startTemp->assignment(new expression(v)); startTemp->assignment(new expression(v));
/* else */ /* else */
logger("ending then clause");
c->alternative(); c->alternative();
/* startTemp=stopTemp; /* startTemp=stopTemp;
stopTemp=v;*/ stopTemp=v;*/
startTemp->assignment(new expression(stopTemp)); startTemp->assignment(new expression(stopTemp));
stopTemp->assignment(new expression(v)); stopTemp->assignment(new expression(v));
/* endif */ /* endif */
logger("ending else clause");
c->close(); c->close();
delete c;
logger("embedded if statement cleared");
this->var=v;
/* while (v<=stopTemp && v>=startTemp) */ /* while (v<=stopTemp && v>=startTemp) */
logger("generating range check for forLoop");
expression *stopper1=new expression(new expression(v), O_LESS_EQUAL, expression *stopper1=new expression(new expression(v), O_LESS_EQUAL,
new expression(stopTemp)); new expression(stopTemp));
expression *stopper2=new expression(new expression(v), O_GREATER_EQUAL, expression *stopper2=new expression(new expression(v), O_GREATER_EQUAL,
new expression(startTemp)); new expression(startTemp));
expression *stopper=new expression(stopper1, O_AND, stopper2); expression *stopper=new expression(stopper1, O_AND, stopper2);
logger("generating while portion of forLoop");
infrastructure=new whileLoop(new expression(stopper, O_UNEQUAL, infrastructure=new whileLoop(new expression(stopper, O_UNEQUAL,
new expression(new constOp("0", T_INT)))); new expression(new constOp("0", T_INT))));
if (stepVal) if (stepVal)
{ {
logger("explicit step value");
step=stepVal; step=stepVal;
} }
else else
{ {
logger("implicit step value");
/* if not present "step" is assumed to be 1 */ /* if not present "step" is assumed to be 1 */
step=new expression(new constOp("1", T_INT)); step=new expression(new constOp("1", T_INT));
} }
logger("forLoop definition cleared");
} }
void forLoop::generateBreak() void forLoop::generateBreak()
@@ -288,15 +313,17 @@ void forLoop::generateBreak()
void forLoop::close() void forLoop::close()
{ {
logger("closing forLoop");
/* var=var+step; */ /* var=var+step; */
expression *stepper=new expression(new expression(var), O_PLUS, step); expression *stepper=new expression(new expression(var), O_PLUS, step);
var->assignment(stepper); var->assignment(stepper);
logger("step applied");
infrastructure->close(); infrastructure->close();
startTemp->dispose();
stopTemp->dispose();
delete infrastructure;
logger("forLoop closed");
} }
forLoop::~forLoop() forLoop::~forLoop()
{ {}
delete startTemp;
delete stopTemp;
delete infrastructure;
}

View File

@@ -121,6 +121,35 @@ string operands::boxName()
} }
} }
void operands::assignment(expression *value)
{
operands *op=value->evaluate();
enum TYPES t=op->getSimpleVarType();
switch (this->getType())
{
case T_FLOATVAR:
if (t==T_INTVAR)
{
output_cpp << this->boxName() << "="
<< "static_cast<double>("
<< op->boxName() << ");\n";
}
else
{
if (t!=T_FLOATVAR) error(E_TYPE_MISMATCH);
}
output_cpp << this->boxName() << "="
<< op->boxName() << ";\n";
break;
default:
if (t!=this->getType()) error(E_TYPE_MISMATCH);
output_cpp << this->boxName() << "="
<< op->boxName() << ";\n";
break;
}
delete value;
}
tempVar::tempVar(enum TYPES t):operands(t) tempVar::tempVar(enum TYPES t):operands(t)
{ {
generateBox(S_GLOBAL); generateBox(S_GLOBAL);
@@ -250,6 +279,10 @@ void constOp::processConst( const string &s)
consts_h << box << "=" << s << ";\n"; consts_h << box << "=" << s << ";\n";
} }
void constOp::assignment(expression *v)
{
error(E_BAD_SYNTAX);
}
/* constructor for constOp */ /* constructor for constOp */
constOp::constOp(const string &s, enum TYPES t):operands(t) constOp::constOp(const string &s, enum TYPES t):operands(t)
@@ -528,35 +561,6 @@ variableType *variableType::getOrCreateVar(string &name, enum TYPES t)
return v; return v;
} }
void variableType::assignment(expression *value)
{
operands *op=value->evaluate();
enum TYPES t=op->getSimpleVarType();
switch (this->getType())
{
case T_FLOATVAR:
if (t==T_INTVAR)
{
output_cpp << this->boxName() << "="
<< "static_cast<double>("
<< op->boxName() << ");\n";
}
else
{
if (t!=T_FLOATVAR) error(E_TYPE_MISMATCH);
}
output_cpp << this->boxName() << "="
<< op->boxName() << ";\n";
break;
default:
if (t!=this->getType()) error(E_TYPE_MISMATCH);
output_cpp << this->boxName() << "="
<< op->boxName() << ";\n";
break;
}
delete value;
}
string arrayType::boxName(list<operands *>indexes) string arrayType::boxName(list<operands *>indexes)
{ {
ostringstream out; ostringstream out;