It's alive!
parent
d996b89678
commit
02d96d9891
|
@ -8,7 +8,7 @@
|
||||||
#include "ASTExpression.h"
|
#include "ASTExpression.h"
|
||||||
|
|
||||||
|
|
||||||
ASTExpression::ASTExpression(ASTNode * parent) {
|
ASTExpression::ASTExpression() {
|
||||||
this->parent = parent;
|
this->parent = parent;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ class ASTExpression : public ASTNode {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
virtual SenchaObject evaluate() = 0;
|
virtual SenchaObject evaluate() = 0;
|
||||||
ASTExpression(ASTNode * parent);
|
ASTExpression();
|
||||||
virtual ~ASTExpression();
|
virtual ~ASTExpression();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
class ASTStatement : public ASTNode {
|
class ASTStatement : public ASTNode {
|
||||||
public:
|
public:
|
||||||
ASTStatement();
|
ASTStatement();
|
||||||
|
virtual void execute() = 0;
|
||||||
virtual ~ASTStatement();
|
virtual ~ASTStatement();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "BasicExpression.h"
|
#include "BasicExpression.h"
|
||||||
#include "ConstantExpression.h"
|
#include "ConstantExpression.h"
|
||||||
#include "PostfixExpression.h"
|
#include "PostfixExpression.h"
|
||||||
|
#include "IncorrectExpression.h"
|
||||||
|
|
||||||
//And probably more
|
//And probably more
|
||||||
//TODO actualize it
|
//TODO actualize it
|
||||||
|
|
|
@ -14,33 +14,49 @@ void BasicExpression::set_operator(std::string op)
|
||||||
|
|
||||||
void BasicExpression::set_left_operand(ASTNode * left)
|
void BasicExpression::set_left_operand(ASTNode * left)
|
||||||
{
|
{
|
||||||
|
if(!this->children_set)
|
||||||
|
{
|
||||||
|
children.push_back(left);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
this->children[0] = left;
|
this->children[0] = left;
|
||||||
this->left = static_cast<ASTExpression *>(children[0]);
|
}
|
||||||
|
|
||||||
|
if(children.size() == 2)
|
||||||
|
children_set = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BasicExpression::set_right_operand(ASTNode * right)
|
void BasicExpression::set_right_operand(ASTNode * right)
|
||||||
{
|
{
|
||||||
this->children[1] = right;
|
if(!this->children_set)
|
||||||
this->right = static_cast<ASTExpression *>(children[1]);
|
{
|
||||||
|
children.push_back(right);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->children[1] = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(children.size() == 2)
|
||||||
|
children_set = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual SenchaObject BasicExpression::evaluate()
|
SenchaObject BasicExpression::evaluate()
|
||||||
{
|
{
|
||||||
|
|
||||||
if(oper == "+")
|
if(oper == "+")
|
||||||
{
|
{
|
||||||
return left->evaluate() + right->evaluate();
|
return SenchaObject(static_cast<ASTExpression *>(children[0])->evaluate() + static_cast<ASTExpression *>(children[1])->evaluate());
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return SenchaObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
BasicExpression::BasicExpression(ASTNode * parent) {
|
BasicExpression::BasicExpression(ASTNode * parent) {
|
||||||
this->parent = parent;
|
this->parent = parent;
|
||||||
// initialize pointers
|
children_set = false;
|
||||||
this->add_children(0);
|
|
||||||
this->add_children(0);
|
|
||||||
left = static_cast<ASTExpression *>(children[0]);
|
|
||||||
right = static_cast<ASTExpression *>(children[1]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BasicExpression::~BasicExpression() {
|
BasicExpression::~BasicExpression() {
|
||||||
|
@ -48,3 +64,12 @@ BasicExpression::~BasicExpression() {
|
||||||
// TODO free children memory
|
// TODO free children memory
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string BasicExpression::debug()
|
||||||
|
{
|
||||||
|
std::string debug_note = "Basic expression:\n";
|
||||||
|
debug_note += "left operand: \n";
|
||||||
|
debug_note += this->children[0]->debug();
|
||||||
|
debug_note += "\nright operand:\n" + this->children[1]->debug() +"\n###\n";
|
||||||
|
return debug_note;
|
||||||
|
}
|
||||||
|
|
|
@ -13,21 +13,19 @@ class BasicExpression : public ASTExpression {
|
||||||
public:
|
public:
|
||||||
//TODO change oper to enum
|
//TODO change oper to enum
|
||||||
|
|
||||||
std::string all_operators[] = {"<", ">", "+", "-", "/", "*", "%", "&", "|", "=", ":", "==", "+=", "-=", "<=", ">=", "!=", "&&", "||"};
|
|
||||||
|
|
||||||
std::string oper;
|
std::string oper;
|
||||||
ASTExpression * left;
|
|
||||||
ASTExpression * right;
|
|
||||||
|
|
||||||
|
bool children_set;
|
||||||
void set_operator(std::string op);
|
void set_operator(std::string op);
|
||||||
void set_left_operand(ASTNode * left);
|
void set_left_operand(ASTNode * left);
|
||||||
void set_right_operand(ASTNode * right);
|
void set_right_operand(ASTNode * right);
|
||||||
virtual SenchaObject evaluate();
|
virtual SenchaObject evaluate();
|
||||||
|
virtual void execute() { evaluate(); };
|
||||||
|
|
||||||
virtual std::string debug();
|
|
||||||
|
|
||||||
std::string debug() { return "Basic expression:\n" + "left operand: \n" +
|
std::string debug() ;
|
||||||
left->debug() + "\nright operand:\n" + right->debug +"\n###\n"; }
|
|
||||||
|
|
||||||
BasicExpression(ASTNode * parent);
|
BasicExpression(ASTNode * parent);
|
||||||
virtual ~BasicExpression();
|
virtual ~BasicExpression();
|
||||||
|
|
|
@ -18,7 +18,7 @@ BasicStatement::~BasicStatement() {
|
||||||
|
|
||||||
void BasicStatement::add_expression(ASTExpression * expr)
|
void BasicStatement::add_expression(ASTExpression * expr)
|
||||||
{
|
{
|
||||||
this->add_children(expr);
|
children.push_back(expr);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string BasicStatement::debug()
|
std::string BasicStatement::debug()
|
||||||
|
|
|
@ -8,8 +8,10 @@
|
||||||
#ifndef BASICSTATEMENT_H_
|
#ifndef BASICSTATEMENT_H_
|
||||||
#define BASICSTATEMENT_H_
|
#define BASICSTATEMENT_H_
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include "ASTExpression.h"
|
||||||
|
#include "ASTStatement.h"
|
||||||
|
|
||||||
class BasicStatement : public ASTStatement{
|
class BasicStatement : public ASTStatement {
|
||||||
public:
|
public:
|
||||||
BasicStatement(ASTNode * parent);
|
BasicStatement(ASTNode * parent);
|
||||||
virtual std::string debug();
|
virtual std::string debug();
|
||||||
|
|
|
@ -17,7 +17,25 @@ ConstantExpression::~ConstantExpression() {
|
||||||
// TODO Auto-generated destructor stub
|
// TODO Auto-generated destructor stub
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual SenchaObject ConstantExpression::evaluate()
|
SenchaObject ConstantExpression::evaluate()
|
||||||
{
|
{
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ConstantExpression::ConstantExpression(ASTNode * parent, int number)
|
||||||
|
{
|
||||||
|
this->parent = parent; value = SenchaObject(number);
|
||||||
|
}
|
||||||
|
|
||||||
|
ConstantExpression::ConstantExpression(ASTNode * parent, double number)
|
||||||
|
{
|
||||||
|
this->parent = parent;
|
||||||
|
value = SenchaObject(number);
|
||||||
|
}
|
||||||
|
|
||||||
|
ConstantExpression::ConstantExpression(ASTNode * parent, std::string text)
|
||||||
|
{
|
||||||
|
this->parent = parent; value = SenchaObject(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string ConstantExpression::debug() { return "Constant expression:\n" + value.repr() + "\n"; }
|
||||||
|
|
|
@ -12,13 +12,16 @@
|
||||||
class ConstantExpression : public ASTExpression {
|
class ConstantExpression : public ASTExpression {
|
||||||
public:
|
public:
|
||||||
ConstantExpression(ASTNode * parent);
|
ConstantExpression(ASTNode * parent);
|
||||||
ConstantExpression(ASTNode * parent, int number) { this->parent = parent; value = SenchaObject(number);};
|
ConstantExpression(ASTNode * parent, int number) ;
|
||||||
ConstantExpression(ASTNode * parent, double number) {this->parent = parent; value = SenchaObject(number); };
|
ConstantExpression(ASTNode * parent, double number) ;
|
||||||
ConstantExpression(std::string text){ this->parent = parent; value = SenchaObject(text);};
|
ConstantExpression(ASTNode * parent, std::string text);
|
||||||
|
|
||||||
SenchaObject value;
|
SenchaObject value;
|
||||||
|
|
||||||
std::string debug() { return "Constant expression:\n" + value.repr() + "\n"; }
|
std::string debug();
|
||||||
|
|
||||||
|
virtual void execute() { //Do nothing
|
||||||
|
};
|
||||||
|
|
||||||
virtual ~ConstantExpression();
|
virtual ~ConstantExpression();
|
||||||
virtual SenchaObject evaluate();
|
virtual SenchaObject evaluate();
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* IncorrectExpression.cpp
|
||||||
|
*
|
||||||
|
* Created on: Dec 6, 2012
|
||||||
|
* Author: attero
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "IncorrectExpression.h"
|
||||||
|
|
||||||
|
IncorrectExpression::IncorrectExpression(ASTNode * parent, std::string error_message)
|
||||||
|
{
|
||||||
|
this->parent = parent;
|
||||||
|
this->error_message = error_message;
|
||||||
|
}
|
||||||
|
|
||||||
|
IncorrectExpression::~IncorrectExpression() {
|
||||||
|
// TODO Auto-generated destructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
SenchaObject IncorrectExpression::evaluate()
|
||||||
|
{
|
||||||
|
SenchaObject null_object;
|
||||||
|
return null_object;
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
* IncorrectExpression.h
|
||||||
|
*
|
||||||
|
* Created on: Dec 6, 2012
|
||||||
|
* Author: attero
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INCORRECTEXPRESSION_H_
|
||||||
|
#define INCORRECTEXPRESSION_H_
|
||||||
|
|
||||||
|
#include "ASTExpression.h"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
class IncorrectExpression: public ASTExpression {
|
||||||
|
public:
|
||||||
|
|
||||||
|
std::string error_message;
|
||||||
|
|
||||||
|
virtual SenchaObject evaluate() ;
|
||||||
|
|
||||||
|
void execute() { std::cout << debug(); }
|
||||||
|
|
||||||
|
std::string debug() { return "Incorrect Expression:\n" + error_message; }
|
||||||
|
|
||||||
|
IncorrectExpression(ASTNode * parent, std::string error_message);
|
||||||
|
virtual ~IncorrectExpression();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* INCORRECTEXPRESSION_H_ */
|
|
@ -56,7 +56,7 @@ public:
|
||||||
|
|
||||||
SenchaObject();
|
SenchaObject();
|
||||||
SenchaObject(int integer) { set_value(integer); }
|
SenchaObject(int integer) { set_value(integer); }
|
||||||
SenchaObject(float number) { set_value(number); }
|
SenchaObject(double number) { set_value(number); }
|
||||||
SenchaObject(std::string text) { set_value(text); }
|
SenchaObject(std::string text) { set_value(text); }
|
||||||
|
|
||||||
//TODO overload operators as it should be done
|
//TODO overload operators as it should be done
|
||||||
|
|
|
@ -1,11 +1,18 @@
|
||||||
AST/AST.d: ../AST/AST.cpp ../AST/AST.h ../AST/ASTNode.h \
|
AST/AST.d: ../AST/AST.cpp ../AST/AST.h ../AST/ASTNode.h \
|
||||||
../AST/AllTypesOfASTNodes.h ../AST/ProgramNode.h ../AST/ASTStatement.h \
|
../AST/SenchaObject.h ../AST/to_string.h ../AST/AllTypesOfASTNodes.h \
|
||||||
../AST/ASTExpression.h ../AST/ASTPrimary.h
|
../AST/ProgramNode.h ../AST/ASTStatement.h ../AST/ASTExpression.h \
|
||||||
|
../AST/BasicStatement.h ../AST/BasicExpression.h \
|
||||||
|
../AST/ConstantExpression.h ../AST/PostfixExpression.h \
|
||||||
|
../AST/IncorrectExpression.h
|
||||||
|
|
||||||
../AST/AST.h:
|
../AST/AST.h:
|
||||||
|
|
||||||
../AST/ASTNode.h:
|
../AST/ASTNode.h:
|
||||||
|
|
||||||
|
../AST/SenchaObject.h:
|
||||||
|
|
||||||
|
../AST/to_string.h:
|
||||||
|
|
||||||
../AST/AllTypesOfASTNodes.h:
|
../AST/AllTypesOfASTNodes.h:
|
||||||
|
|
||||||
../AST/ProgramNode.h:
|
../AST/ProgramNode.h:
|
||||||
|
@ -14,4 +21,12 @@ AST/AST.d: ../AST/AST.cpp ../AST/AST.h ../AST/ASTNode.h \
|
||||||
|
|
||||||
../AST/ASTExpression.h:
|
../AST/ASTExpression.h:
|
||||||
|
|
||||||
../AST/ASTPrimary.h:
|
../AST/BasicStatement.h:
|
||||||
|
|
||||||
|
../AST/BasicExpression.h:
|
||||||
|
|
||||||
|
../AST/ConstantExpression.h:
|
||||||
|
|
||||||
|
../AST/PostfixExpression.h:
|
||||||
|
|
||||||
|
../AST/IncorrectExpression.h:
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
AST/ASTExpression.d: ../AST/ASTExpression.cpp ../AST/ASTExpression.h \
|
AST/ASTExpression.d: ../AST/ASTExpression.cpp ../AST/ASTExpression.h \
|
||||||
../AST/ASTNode.h
|
../AST/ASTNode.h ../AST/SenchaObject.h ../AST/to_string.h
|
||||||
|
|
||||||
../AST/ASTExpression.h:
|
../AST/ASTExpression.h:
|
||||||
|
|
||||||
../AST/ASTNode.h:
|
../AST/ASTNode.h:
|
||||||
|
|
||||||
|
../AST/SenchaObject.h:
|
||||||
|
|
||||||
|
../AST/to_string.h:
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
AST/ASTNode.d: ../AST/ASTNode.cpp ../AST/ASTNode.h
|
AST/ASTNode.d: ../AST/ASTNode.cpp ../AST/ASTNode.h ../AST/SenchaObject.h \
|
||||||
|
../AST/to_string.h
|
||||||
|
|
||||||
../AST/ASTNode.h:
|
../AST/ASTNode.h:
|
||||||
|
|
||||||
|
../AST/SenchaObject.h:
|
||||||
|
|
||||||
|
../AST/to_string.h:
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
AST/ASTStatement.d: ../AST/ASTStatement.cpp ../AST/ASTStatement.h \
|
AST/ASTStatement.d: ../AST/ASTStatement.cpp ../AST/ASTStatement.h \
|
||||||
../AST/ASTNode.h
|
../AST/ASTNode.h ../AST/SenchaObject.h ../AST/to_string.h
|
||||||
|
|
||||||
../AST/ASTStatement.h:
|
../AST/ASTStatement.h:
|
||||||
|
|
||||||
../AST/ASTNode.h:
|
../AST/ASTNode.h:
|
||||||
|
|
||||||
|
../AST/SenchaObject.h:
|
||||||
|
|
||||||
|
../AST/to_string.h:
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
AST/BasicExpression.d: ../AST/BasicExpression.cpp \
|
||||||
|
../AST/BasicExpression.h ../AST/ASTExpression.h ../AST/ASTNode.h \
|
||||||
|
../AST/SenchaObject.h ../AST/to_string.h
|
||||||
|
|
||||||
|
../AST/BasicExpression.h:
|
||||||
|
|
||||||
|
../AST/ASTExpression.h:
|
||||||
|
|
||||||
|
../AST/ASTNode.h:
|
||||||
|
|
||||||
|
../AST/SenchaObject.h:
|
||||||
|
|
||||||
|
../AST/to_string.h:
|
|
@ -0,0 +1,15 @@
|
||||||
|
AST/BasicStatement.d: ../AST/BasicStatement.cpp ../AST/BasicStatement.h \
|
||||||
|
../AST/ASTExpression.h ../AST/ASTNode.h ../AST/SenchaObject.h \
|
||||||
|
../AST/to_string.h ../AST/ASTStatement.h
|
||||||
|
|
||||||
|
../AST/BasicStatement.h:
|
||||||
|
|
||||||
|
../AST/ASTExpression.h:
|
||||||
|
|
||||||
|
../AST/ASTNode.h:
|
||||||
|
|
||||||
|
../AST/SenchaObject.h:
|
||||||
|
|
||||||
|
../AST/to_string.h:
|
||||||
|
|
||||||
|
../AST/ASTStatement.h:
|
|
@ -0,0 +1,13 @@
|
||||||
|
AST/ConstantExpression.d: ../AST/ConstantExpression.cpp \
|
||||||
|
../AST/ConstantExpression.h ../AST/ASTExpression.h ../AST/ASTNode.h \
|
||||||
|
../AST/SenchaObject.h ../AST/to_string.h
|
||||||
|
|
||||||
|
../AST/ConstantExpression.h:
|
||||||
|
|
||||||
|
../AST/ASTExpression.h:
|
||||||
|
|
||||||
|
../AST/ASTNode.h:
|
||||||
|
|
||||||
|
../AST/SenchaObject.h:
|
||||||
|
|
||||||
|
../AST/to_string.h:
|
|
@ -1,5 +1,6 @@
|
||||||
AST/IfNode.d: ../AST/IfNode.cpp ../AST/IfNode.h ../AST/ASTStatement.h \
|
AST/IfNode.d: ../AST/IfNode.cpp ../AST/IfNode.h ../AST/ASTStatement.h \
|
||||||
../AST/ASTNode.h ../AST/ASTExpression.h
|
../AST/ASTNode.h ../AST/SenchaObject.h ../AST/to_string.h \
|
||||||
|
../AST/ASTExpression.h
|
||||||
|
|
||||||
../AST/IfNode.h:
|
../AST/IfNode.h:
|
||||||
|
|
||||||
|
@ -7,4 +8,8 @@ AST/IfNode.d: ../AST/IfNode.cpp ../AST/IfNode.h ../AST/ASTStatement.h \
|
||||||
|
|
||||||
../AST/ASTNode.h:
|
../AST/ASTNode.h:
|
||||||
|
|
||||||
|
../AST/SenchaObject.h:
|
||||||
|
|
||||||
|
../AST/to_string.h:
|
||||||
|
|
||||||
../AST/ASTExpression.h:
|
../AST/ASTExpression.h:
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
AST/IncorrectExpression.d: ../AST/IncorrectExpression.cpp \
|
||||||
|
../AST/IncorrectExpression.h ../AST/ASTExpression.h ../AST/ASTNode.h \
|
||||||
|
../AST/SenchaObject.h ../AST/to_string.h
|
||||||
|
|
||||||
|
../AST/IncorrectExpression.h:
|
||||||
|
|
||||||
|
../AST/ASTExpression.h:
|
||||||
|
|
||||||
|
../AST/ASTNode.h:
|
||||||
|
|
||||||
|
../AST/SenchaObject.h:
|
||||||
|
|
||||||
|
../AST/to_string.h:
|
|
@ -0,0 +1,13 @@
|
||||||
|
AST/PostfixExpression.d: ../AST/PostfixExpression.cpp \
|
||||||
|
../AST/PostfixExpression.h ../AST/ASTExpression.h ../AST/ASTNode.h \
|
||||||
|
../AST/SenchaObject.h ../AST/to_string.h
|
||||||
|
|
||||||
|
../AST/PostfixExpression.h:
|
||||||
|
|
||||||
|
../AST/ASTExpression.h:
|
||||||
|
|
||||||
|
../AST/ASTNode.h:
|
||||||
|
|
||||||
|
../AST/SenchaObject.h:
|
||||||
|
|
||||||
|
../AST/to_string.h:
|
|
@ -1,8 +1,13 @@
|
||||||
AST/ProgramNode.d: ../AST/ProgramNode.cpp ../AST/ProgramNode.h \
|
AST/ProgramNode.d: ../AST/ProgramNode.cpp ../AST/ProgramNode.h \
|
||||||
../AST/ASTNode.h ../AST/ASTStatement.h
|
../AST/ASTNode.h ../AST/SenchaObject.h ../AST/to_string.h \
|
||||||
|
../AST/ASTStatement.h
|
||||||
|
|
||||||
../AST/ProgramNode.h:
|
../AST/ProgramNode.h:
|
||||||
|
|
||||||
../AST/ASTNode.h:
|
../AST/ASTNode.h:
|
||||||
|
|
||||||
|
../AST/SenchaObject.h:
|
||||||
|
|
||||||
|
../AST/to_string.h:
|
||||||
|
|
||||||
../AST/ASTStatement.h:
|
../AST/ASTStatement.h:
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
AST/SenchaObject.d: ../AST/SenchaObject.cpp ../AST/SenchaObject.h \
|
||||||
|
../AST/to_string.h
|
||||||
|
|
||||||
|
../AST/SenchaObject.h:
|
||||||
|
|
||||||
|
../AST/to_string.h:
|
|
@ -7,28 +7,43 @@ CPP_SRCS += \
|
||||||
../AST/AST.cpp \
|
../AST/AST.cpp \
|
||||||
../AST/ASTExpression.cpp \
|
../AST/ASTExpression.cpp \
|
||||||
../AST/ASTNode.cpp \
|
../AST/ASTNode.cpp \
|
||||||
../AST/ASTPrimary.cpp \
|
|
||||||
../AST/ASTStatement.cpp \
|
../AST/ASTStatement.cpp \
|
||||||
|
../AST/BasicExpression.cpp \
|
||||||
|
../AST/BasicStatement.cpp \
|
||||||
|
../AST/ConstantExpression.cpp \
|
||||||
../AST/IfNode.cpp \
|
../AST/IfNode.cpp \
|
||||||
../AST/ProgramNode.cpp
|
../AST/IncorrectExpression.cpp \
|
||||||
|
../AST/PostfixExpression.cpp \
|
||||||
|
../AST/ProgramNode.cpp \
|
||||||
|
../AST/SenchaObject.cpp
|
||||||
|
|
||||||
OBJS += \
|
OBJS += \
|
||||||
./AST/AST.o \
|
./AST/AST.o \
|
||||||
./AST/ASTExpression.o \
|
./AST/ASTExpression.o \
|
||||||
./AST/ASTNode.o \
|
./AST/ASTNode.o \
|
||||||
./AST/ASTPrimary.o \
|
|
||||||
./AST/ASTStatement.o \
|
./AST/ASTStatement.o \
|
||||||
|
./AST/BasicExpression.o \
|
||||||
|
./AST/BasicStatement.o \
|
||||||
|
./AST/ConstantExpression.o \
|
||||||
./AST/IfNode.o \
|
./AST/IfNode.o \
|
||||||
./AST/ProgramNode.o
|
./AST/IncorrectExpression.o \
|
||||||
|
./AST/PostfixExpression.o \
|
||||||
|
./AST/ProgramNode.o \
|
||||||
|
./AST/SenchaObject.o
|
||||||
|
|
||||||
CPP_DEPS += \
|
CPP_DEPS += \
|
||||||
./AST/AST.d \
|
./AST/AST.d \
|
||||||
./AST/ASTExpression.d \
|
./AST/ASTExpression.d \
|
||||||
./AST/ASTNode.d \
|
./AST/ASTNode.d \
|
||||||
./AST/ASTPrimary.d \
|
|
||||||
./AST/ASTStatement.d \
|
./AST/ASTStatement.d \
|
||||||
|
./AST/BasicExpression.d \
|
||||||
|
./AST/BasicStatement.d \
|
||||||
|
./AST/ConstantExpression.d \
|
||||||
./AST/IfNode.d \
|
./AST/IfNode.d \
|
||||||
./AST/ProgramNode.d
|
./AST/IncorrectExpression.d \
|
||||||
|
./AST/PostfixExpression.d \
|
||||||
|
./AST/ProgramNode.d \
|
||||||
|
./AST/SenchaObject.d
|
||||||
|
|
||||||
|
|
||||||
# Each subdirectory must supply rules for building sources it contributes
|
# Each subdirectory must supply rules for building sources it contributes
|
||||||
|
|
|
@ -1,5 +1,36 @@
|
||||||
Parser.d: ../Parser.cpp ../Parser.h ../Token.h
|
Parser.d: ../Parser.cpp ../Parser.h ../Token.h \
|
||||||
|
../AST/AllTypesOfASTNodes.h ../AST/ASTNode.h ../AST/SenchaObject.h \
|
||||||
|
../AST/to_string.h ../AST/ProgramNode.h ../AST/ASTStatement.h \
|
||||||
|
../AST/ASTExpression.h ../AST/BasicStatement.h ../AST/BasicExpression.h \
|
||||||
|
../AST/ConstantExpression.h ../AST/PostfixExpression.h \
|
||||||
|
../AST/IncorrectExpression.h ../AST/AST.h
|
||||||
|
|
||||||
../Parser.h:
|
../Parser.h:
|
||||||
|
|
||||||
../Token.h:
|
../Token.h:
|
||||||
|
|
||||||
|
../AST/AllTypesOfASTNodes.h:
|
||||||
|
|
||||||
|
../AST/ASTNode.h:
|
||||||
|
|
||||||
|
../AST/SenchaObject.h:
|
||||||
|
|
||||||
|
../AST/to_string.h:
|
||||||
|
|
||||||
|
../AST/ProgramNode.h:
|
||||||
|
|
||||||
|
../AST/ASTStatement.h:
|
||||||
|
|
||||||
|
../AST/ASTExpression.h:
|
||||||
|
|
||||||
|
../AST/BasicStatement.h:
|
||||||
|
|
||||||
|
../AST/BasicExpression.h:
|
||||||
|
|
||||||
|
../AST/ConstantExpression.h:
|
||||||
|
|
||||||
|
../AST/PostfixExpression.h:
|
||||||
|
|
||||||
|
../AST/IncorrectExpression.h:
|
||||||
|
|
||||||
|
../AST/AST.h:
|
||||||
|
|
Binary file not shown.
|
@ -1,6 +1,10 @@
|
||||||
main.d: ../main.cpp ../Token.h ../Lexer.h ../Parser.h \
|
main.d: ../main.cpp ../Token.h ../Lexer.h ../Parser.h \
|
||||||
../Tests/TestLexer.h ../Tests/TestSuite.h ../Tests/minunit.h \
|
../AST/AllTypesOfASTNodes.h ../AST/ASTNode.h ../AST/SenchaObject.h \
|
||||||
../Tests/../Lexer.h
|
../AST/to_string.h ../AST/ProgramNode.h ../AST/ASTStatement.h \
|
||||||
|
../AST/ASTExpression.h ../AST/BasicStatement.h ../AST/BasicExpression.h \
|
||||||
|
../AST/ConstantExpression.h ../AST/PostfixExpression.h \
|
||||||
|
../AST/IncorrectExpression.h ../AST/AST.h ../Tests/TestLexer.h \
|
||||||
|
../Tests/TestSuite.h ../Tests/minunit.h ../Tests/../Lexer.h
|
||||||
|
|
||||||
../Token.h:
|
../Token.h:
|
||||||
|
|
||||||
|
@ -8,6 +12,32 @@ main.d: ../main.cpp ../Token.h ../Lexer.h ../Parser.h \
|
||||||
|
|
||||||
../Parser.h:
|
../Parser.h:
|
||||||
|
|
||||||
|
../AST/AllTypesOfASTNodes.h:
|
||||||
|
|
||||||
|
../AST/ASTNode.h:
|
||||||
|
|
||||||
|
../AST/SenchaObject.h:
|
||||||
|
|
||||||
|
../AST/to_string.h:
|
||||||
|
|
||||||
|
../AST/ProgramNode.h:
|
||||||
|
|
||||||
|
../AST/ASTStatement.h:
|
||||||
|
|
||||||
|
../AST/ASTExpression.h:
|
||||||
|
|
||||||
|
../AST/BasicStatement.h:
|
||||||
|
|
||||||
|
../AST/BasicExpression.h:
|
||||||
|
|
||||||
|
../AST/ConstantExpression.h:
|
||||||
|
|
||||||
|
../AST/PostfixExpression.h:
|
||||||
|
|
||||||
|
../AST/IncorrectExpression.h:
|
||||||
|
|
||||||
|
../AST/AST.h:
|
||||||
|
|
||||||
../Tests/TestLexer.h:
|
../Tests/TestLexer.h:
|
||||||
|
|
||||||
../Tests/TestSuite.h:
|
../Tests/TestSuite.h:
|
||||||
|
|
|
@ -117,13 +117,13 @@ bool Parser::is_type()
|
||||||
|
|
||||||
ASTStatement * Parser::statement(ASTNode * parent)
|
ASTStatement * Parser::statement(ASTNode * parent)
|
||||||
{
|
{
|
||||||
BasicStatement * stat(parent);
|
BasicStatement * stat = new BasicStatement(parent);
|
||||||
|
|
||||||
if(accept("{"))
|
if(accept("{"))
|
||||||
{
|
{
|
||||||
while(!accept("}"))
|
while(!accept("}"))
|
||||||
{
|
{
|
||||||
stat = statement(parent);
|
stat = static_cast<BasicStatement * >(statement(parent));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,44 +220,56 @@ ASTStatement * Parser::statement(ASTNode * parent)
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTExpression * Parser::prim_expr(ASTNode * expression)
|
ASTExpression * Parser::prim_expr(ASTNode * expression)
|
||||||
{
|
{
|
||||||
|
ConstantExpression * ce;
|
||||||
|
BasicExpression * be;
|
||||||
|
//TODO add reference type to prims, syblol is now just a literal... and floats
|
||||||
if(current_token.get_type() == t_integer)
|
if(current_token.get_type() == t_integer)
|
||||||
{
|
{
|
||||||
report("Number: " + tok_value + "\n");
|
report("Number: " + tok_value + "\n");
|
||||||
|
|
||||||
|
ce = new ConstantExpression(expression, std::atoi(tok_value.c_str()));
|
||||||
read_next();
|
read_next();
|
||||||
}
|
}
|
||||||
else if(current_token.get_type() == t_symbol)
|
else if(current_token.get_type() == t_symbol)
|
||||||
{
|
{
|
||||||
report("Variable: " + tok_value + "\n");
|
report("Variable: " + tok_value + "\n");
|
||||||
|
ce = new ConstantExpression(expression, tok_value);
|
||||||
read_next();
|
read_next();
|
||||||
}
|
}
|
||||||
else if(current_token.get_type() == t_literal)
|
else if(current_token.get_type() == t_literal)
|
||||||
{
|
{
|
||||||
|
|
||||||
report("Character literal: " + tok_value + "\n");
|
report("Character literal: " + tok_value + "\n");
|
||||||
|
ce = new ConstantExpression(expression, tok_value);
|
||||||
read_next();
|
read_next();
|
||||||
}
|
}
|
||||||
else if(accept("("))
|
else if(accept("("))
|
||||||
{
|
{
|
||||||
report("( ");
|
report("( ");
|
||||||
expr();
|
be = static_cast<BasicExpression *>(expr(expression));
|
||||||
report(" ) ");
|
report(" ) ");
|
||||||
expect(")");
|
expect(")");
|
||||||
|
return be;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
error("ERROR: unexpected primary expression " + tok_value + "\n");
|
string error_message = "ERROR: unexpected primary expression " + tok_value + "\n";
|
||||||
read_next();
|
error(error_message);
|
||||||
|
read_next();
|
||||||
|
return new IncorrectExpression(expression, error_message);
|
||||||
}
|
}
|
||||||
|
return ce;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTExpression * Parser::postfix_expr(ASTNode * expression)
|
ASTExpression * Parser::postfix_expr(ASTNode * expression)
|
||||||
{
|
{
|
||||||
prim_expr();
|
//TODO implement postfix expression ASAP
|
||||||
|
BasicExpression * be = new BasicExpression(expression);
|
||||||
|
prim_expr(be);
|
||||||
if(accept("["))
|
if(accept("["))
|
||||||
{
|
{
|
||||||
expr();
|
expr(be);
|
||||||
expect("]");
|
expect("]");
|
||||||
report(" [] ");
|
report(" [] ");
|
||||||
|
|
||||||
|
@ -266,89 +278,115 @@ ASTExpression * Parser::postfix_expr(ASTNode * expression)
|
||||||
{
|
{
|
||||||
if(!accept(")"))
|
if(!accept(")"))
|
||||||
{
|
{
|
||||||
expr();
|
expr(be);
|
||||||
report("function argument\n");
|
report("function argument\n");
|
||||||
while(accept(","))
|
while(accept(","))
|
||||||
{
|
{
|
||||||
expr();
|
expr(be);
|
||||||
report("function argument\n");
|
report("function argument\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
expect(")");
|
expect(")");
|
||||||
}
|
}
|
||||||
report("FUNC_CALL\n");
|
report("FUNC_CALL\n");
|
||||||
}
|
}
|
||||||
|
//TODO implement postfix_expression
|
||||||
|
return be;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTExpression * Parser::mul_expr(ASTNode * expression)
|
ASTExpression * Parser::mul_expr(ASTNode * expression)
|
||||||
{
|
{
|
||||||
postfix_expr();
|
BasicExpression * be = new BasicExpression(expression);
|
||||||
|
be->set_left_operand(postfix_expr(be));
|
||||||
while(peek("*") || peek("/"))
|
while(peek("*") || peek("/"))
|
||||||
{
|
{
|
||||||
if(accept("*"))
|
if(accept("*"))
|
||||||
{
|
{
|
||||||
postfix_expr();
|
be->set_operator("*");
|
||||||
report(" *\n");
|
report(" *\n");
|
||||||
} else if(accept("/"))
|
} else if(accept("/"))
|
||||||
{
|
{
|
||||||
postfix_expr();
|
be->set_operator("/");
|
||||||
report(" /\n");
|
report(" /\n");
|
||||||
}
|
}
|
||||||
|
be->set_right_operand(postfix_expr(be));
|
||||||
}
|
}
|
||||||
|
return be;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTExpression * Parser::add_expr(ASTNode * expression)
|
ASTExpression * Parser::add_expr(ASTNode * expression)
|
||||||
{
|
{
|
||||||
mul_expr();
|
BasicExpression * be = new BasicExpression(expression);
|
||||||
|
be->set_left_operand(mul_expr(be));
|
||||||
while(peek("+") || peek("-"))
|
while(peek("+") || peek("-"))
|
||||||
{
|
{
|
||||||
if(accept("+"))
|
if(accept("+"))
|
||||||
{
|
{
|
||||||
mul_expr();
|
report(" +\n");
|
||||||
report(" +\n");
|
be->set_operator("+");
|
||||||
} else if(accept("-"))
|
}
|
||||||
|
else if(accept("-"))
|
||||||
{
|
{
|
||||||
mul_expr();
|
report(" -\n");
|
||||||
report(" -\n");
|
be->set_operator("-");
|
||||||
}
|
}
|
||||||
}
|
be->set_right_operand(mul_expr(be));
|
||||||
|
}
|
||||||
|
return be;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTExpression * Parser::rel_expr(ASTNode * expression)
|
ASTExpression * Parser::rel_expr(ASTNode * expression)
|
||||||
{
|
{
|
||||||
add_expr();
|
BasicExpression * be = new BasicExpression(expression);
|
||||||
while(peek("<"))
|
be->set_left_operand(add_expr(be));
|
||||||
|
while(peek("<") || peek(">"))
|
||||||
{
|
{
|
||||||
accept("<");
|
if(accept("<"))
|
||||||
add_expr();
|
{
|
||||||
report(" <\n");
|
be->set_operator("<");
|
||||||
}
|
report(" <\n");
|
||||||
|
}
|
||||||
|
else if (accept(">"))
|
||||||
|
{
|
||||||
|
be->set_operator(">");
|
||||||
|
report(" >\n");
|
||||||
|
}
|
||||||
|
be->set_right_operand(add_expr(be));
|
||||||
|
}
|
||||||
|
return be;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTExpression * Parser::eq_expr(ASTNode * expression)
|
ASTExpression * Parser::eq_expr(ASTNode * expression)
|
||||||
{
|
{
|
||||||
rel_expr();
|
BasicExpression * be = new BasicExpression(expression);
|
||||||
|
be->set_left_operand(rel_expr(be));
|
||||||
while(peek("==") || peek("!="))
|
while(peek("==") || peek("!="))
|
||||||
{
|
{
|
||||||
if(accept("=="))
|
if(accept("=="))
|
||||||
{
|
{
|
||||||
rel_expr();
|
be->set_operator("==");
|
||||||
report("==\n");
|
report("==\n");
|
||||||
}
|
}
|
||||||
else if(accept("!="))
|
else if(accept("!="))
|
||||||
{
|
{
|
||||||
rel_expr();
|
be->set_operator("!=");
|
||||||
report("!=\n");
|
report("!=\n");
|
||||||
}
|
}
|
||||||
}
|
be->set_right_operand(rel_expr(be));
|
||||||
|
}
|
||||||
|
return be;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTExpression * Parser::expr(ASTNode * expression)
|
ASTExpression * Parser::expr(ASTNode * expression)
|
||||||
{
|
{
|
||||||
eq_expr(expression);
|
BasicExpression * be = new BasicExpression(expression);
|
||||||
|
be->set_left_operand(eq_expr(be));
|
||||||
if(accept("="))
|
if(accept("="))
|
||||||
{
|
{
|
||||||
expr();
|
be->set_operator("=");
|
||||||
|
be->set_right_operand(expr(be));
|
||||||
report(" :=\n");
|
report(" :=\n");
|
||||||
}
|
}
|
||||||
|
//return be;
|
||||||
|
return new ConstantExpression(expression, 3);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
#ifndef PARSER_H
|
#ifndef PARSER_H
|
||||||
#define PARSER_H
|
#define PARSER_H
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <cstdlib>
|
||||||
#include "Token.h"
|
#include "Token.h"
|
||||||
#include "AST.h"
|
|
||||||
#include "../AST/AllTypesOfASTNodes.h"
|
#include "AST/AllTypesOfASTNodes.h"
|
||||||
|
#include "AST/AST.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue