some cosmetic changes to fix warnings and forLoop
This commit is contained in:
6
Makefile
6
Makefile
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
25
tester.cpp
25
tester.cpp
@@ -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 */
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user