Better assigning and usage in functions.

functions
Justyna Att Ilczuk 2012-12-09 21:17:13 +01:00
parent fc7f656bc2
commit 2042c35d85
8 changed files with 125 additions and 9 deletions

View File

@ -12,17 +12,22 @@ SenchaObject Assignment::evaluate()
return static_cast<ASTExpression *>(children[1])->evaluate(); return static_cast<ASTExpression *>(children[1])->evaluate();
} }
void Assignment::set_name(std::string name)
{
this->name = name;
}
void Assignment::execute() void Assignment::execute()
{ {
auto left_value = static_cast<ASTExpression *>(children[0])->evaluate(); auto left_value = static_cast<ASTExpression *>(children[0])->evaluate();
auto right_value = static_cast<ASTExpression *>(children[1])->evaluate(); auto right_value = static_cast<ASTExpression *>(children[1])->evaluate();
static_cast<ASTExpression *>(children[1])->execute_quietly(); static_cast<ASTExpression *>(children[1])->execute_quietly();
if(left_value.name != "")
if(name != "")
{ {
right_value.name = left_value.name; right_value.name = left_value.name;
context->set(left_value.name, right_value); context->set(name, right_value);
} }
std::cout << right_value.repr() << std::endl;
} }
void Assignment::execute_quietly() void Assignment::execute_quietly()

View File

@ -15,7 +15,10 @@ class Assignment : public ASTExpression {
public: public:
Context * context; Context * context;
std::string name;
SenchaObject evaluate(); SenchaObject evaluate();
void set_name(std::string name);
void execute(); void execute();
void execute_quietly(); void execute_quietly();
void add_lvalue(ASTExpression *); void add_lvalue(ASTExpression *);

View File

@ -27,5 +27,6 @@ std::string BasicStatement::debug()
void BasicStatement::execute() void BasicStatement::execute()
{ {
children[0]->execute() ; for(auto child: children)
child->execute() ;
} }

View File

@ -10,6 +10,7 @@
ConstantExpression::ConstantExpression(ASTNode * parent) { ConstantExpression::ConstantExpression(ASTNode * parent) {
this->parent = parent; this->parent = parent;
value = SenchaObject(); value = SenchaObject();
this->context = NULL;
} }
ConstantExpression::~ConstantExpression() { ConstantExpression::~ConstantExpression() {
@ -21,16 +22,29 @@ ConstantExpression::ConstantExpression(ASTNode * parent, SenchaObject value, std
this->parent = parent; this->parent = parent;
this->value = value; this->value = value;
this->value.name = name; this->value.name = name;
this->context = NULL;
}
ConstantExpression::ConstantExpression(ASTNode * parent, SenchaObject value, Context * context)
{
this->context = context;
this->parent = parent;
this->value = value;
} }
ConstantExpression::ConstantExpression(ASTNode * parent, SenchaObject value) ConstantExpression::ConstantExpression(ASTNode * parent, SenchaObject value)
{ {
this->parent = parent; this->parent = parent;
this->value = value; this->value = value;
this->context = NULL;
} }
SenchaObject ConstantExpression::evaluate() SenchaObject ConstantExpression::evaluate()
{ {
if(value.name != "" && context != NULL)
{
value = context->get(value.name);
}
return value; return value;
} }
@ -48,17 +62,20 @@ void ConstantExpression::execute_quietly()
ConstantExpression::ConstantExpression(ASTNode * parent, int number) ConstantExpression::ConstantExpression(ASTNode * parent, int number)
{ {
this->parent = parent; value = SenchaObject(number); this->parent = parent; value = SenchaObject(number);
this->context = NULL;
} }
ConstantExpression::ConstantExpression(ASTNode * parent, double number) ConstantExpression::ConstantExpression(ASTNode * parent, double number)
{ {
this->parent = parent; this->parent = parent;
value = SenchaObject(number); value = SenchaObject(number);
this->context = NULL;
} }
ConstantExpression::ConstantExpression(ASTNode * parent, std::string text) ConstantExpression::ConstantExpression(ASTNode * parent, std::string text)
{ {
this->parent = parent; value = SenchaObject(text); this->parent = parent; value = SenchaObject(text);
this->context = NULL;
} }
std::string ConstantExpression::debug() { return "Constant expression:\n" + value.repr() + "\n"; } std::string ConstantExpression::debug() { return "Constant expression:\n" + value.repr() + "\n"; }

View File

@ -9,6 +9,7 @@
#define CONSTANTEXPRESSION_H_ #define CONSTANTEXPRESSION_H_
#include "ASTExpression.h" #include "ASTExpression.h"
#include <iostream> #include <iostream>
#include "../Context.h"
class ConstantExpression : public ASTExpression { class ConstantExpression : public ASTExpression {
public: public:
@ -17,10 +18,11 @@ public:
ConstantExpression(ASTNode * parent, double number) ; ConstantExpression(ASTNode * parent, double number) ;
ConstantExpression(ASTNode * parent, std::string text); ConstantExpression(ASTNode * parent, std::string text);
ConstantExpression(ASTNode * parent, SenchaObject value, std::string name); ConstantExpression(ASTNode * parent, SenchaObject value, std::string name);
ConstantExpression(ASTNode * parent, SenchaObject value, Context * context);
ConstantExpression(ASTNode * parent, SenchaObject value); ConstantExpression(ASTNode * parent, SenchaObject value);
SenchaObject value; SenchaObject value;
Context * context;
std::string debug(); std::string debug();

View File

@ -0,0 +1,58 @@
/*
* RepeatStatement.cpp
*
* Created on: Dec 9, 2012
* Author: attero
*/
#include "RepeatStatement.h"
RepeatStatement::RepeatStatement(ASTNode * parent)
{
this->parent = parent;
how_many_times = 0;
body = NULL;
}
RepeatStatement::~RepeatStatement()
{
}
void RepeatStatement::execute()
{
execute_quietly();
}
void RepeatStatement::add_body(ASTStatement * statement)
{
body = statement;
}
void RepeatStatement::execute_quietly()
{
for(int i = 0; i < how_many_times; i++)
{
body->execute();
}
}
std::string RepeatStatement::debug()
{
return "Repeats!";
}
void RepeatStatement::add_iteration_number(SenchaObject so)
{
/*if(so.type == SenchaObject::integer_number)
{
how_many_times = so.integer;
}
else
{
how_many_times = 0;
}*/
how_many_times = 3;
}

View File

@ -0,0 +1,28 @@
/*
* RepeatStatement.h
*
* Created on: Dec 9, 2012
* Author: attero
*/
#ifndef REPEATSTATEMENT_H_
#define REPEATSTATEMENT_H_
#include "ASTStatement.h"
class RepeatStatement: public ASTStatement {
public:
RepeatStatement(ASTNode * parent);
int how_many_times;
ASTStatement * body;
void add_iteration_number(SenchaObject so);
virtual void execute();
virtual void execute_quietly();
void add_body(ASTStatement * statement);
virtual std::string debug() ;
virtual ~RepeatStatement();
};
#endif /* REPEATSTATEMENT_H_ */

View File

@ -149,7 +149,7 @@ ASTStatement * Parser::statement(ASTNode * parent)
{ {
while(!accept("}")) while(!accept("}"))
{ {
stat = static_cast<BasicStatement * >(statement(parent)); stat->children.push_back( statement(parent));
} }
} }
@ -290,9 +290,10 @@ ASTExpression * Parser::prim_expr(ASTNode * expression)
//TODO is it right? //TODO is it right?
string name = current_token.value; string name = current_token.value;
variable = context->get(name); //variable = context->get(name);
variable.name = name; variable.name = name;
ce = new ConstantExpression(expression, variable, name);
ce = new ConstantExpression(expression, variable, context);
read_next(); read_next();
} }
else if(accept("(")) else if(accept("("))
@ -471,6 +472,7 @@ ASTExpression * Parser::eq_expr(ASTNode * expression)
ASTExpression * Parser::expr(ASTNode * expression) ASTExpression * Parser::expr(ASTNode * expression)
{ {
Assignment * assignment = new Assignment(expression, context); Assignment * assignment = new Assignment(expression, context);
auto name = tok_value;
ASTExpression * left = eq_expr(assignment); ASTExpression * left = eq_expr(assignment);
if(accept("=")) if(accept("="))
@ -479,7 +481,7 @@ ASTExpression * Parser::expr(ASTNode * expression)
assignment->add_lvalue(left); assignment->add_lvalue(left);
assignment->add_rvalue(right); assignment->add_rvalue(right);
assignment->set_name(name);
report(" :=\n"); report(" :=\n");
return assignment; return assignment;
} }