Lots of stuff done in AST. But still not close to finish.
parent
d40b7c2397
commit
d996b89678
|
@ -7,12 +7,13 @@
|
||||||
|
|
||||||
#include "ASTExpression.h"
|
#include "ASTExpression.h"
|
||||||
|
|
||||||
ASTExpression::ASTExpression() {
|
|
||||||
// TODO Auto-generated constructor stub
|
ASTExpression::ASTExpression(ASTNode * parent) {
|
||||||
|
this->parent = parent;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTExpression::~ASTExpression() {
|
ASTExpression::~ASTExpression() {
|
||||||
// TODO Auto-generated destructor stub
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,8 @@
|
||||||
class ASTExpression : public ASTNode {
|
class ASTExpression : public ASTNode {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
virtual int evaluate() = 0;
|
virtual SenchaObject evaluate() = 0;
|
||||||
|
ASTExpression(ASTNode * parent);
|
||||||
virtual ~ASTExpression();
|
virtual ~ASTExpression();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ public:
|
||||||
void add_children(ASTNode *);
|
void add_children(ASTNode *);
|
||||||
void remove_most_right_children();
|
void remove_most_right_children();
|
||||||
void set_parent(ASTNode *);
|
void set_parent(ASTNode *);
|
||||||
|
|
||||||
virtual std::string debug() = 0;
|
virtual std::string debug() = 0;
|
||||||
virtual void execute() = 0;
|
virtual void execute() = 0;
|
||||||
virtual ~ASTNode();
|
virtual ~ASTNode();
|
||||||
|
|
|
@ -12,7 +12,11 @@
|
||||||
#include "ProgramNode.h"
|
#include "ProgramNode.h"
|
||||||
#include "ASTStatement.h"
|
#include "ASTStatement.h"
|
||||||
#include "ASTExpression.h"
|
#include "ASTExpression.h"
|
||||||
#include "ASTPrimary.h"
|
|
||||||
|
#include "BasicStatement.h"
|
||||||
|
#include "BasicExpression.h"
|
||||||
|
#include "ConstantExpression.h"
|
||||||
|
#include "PostfixExpression.h"
|
||||||
|
|
||||||
//And probably more
|
//And probably more
|
||||||
//TODO actualize it
|
//TODO actualize it
|
||||||
|
|
|
@ -12,6 +12,9 @@
|
||||||
class BasicExpression : public ASTExpression {
|
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 * left;
|
||||||
ASTExpression * right;
|
ASTExpression * right;
|
||||||
|
@ -23,6 +26,9 @@ public:
|
||||||
|
|
||||||
virtual std::string debug();
|
virtual std::string debug();
|
||||||
|
|
||||||
|
std::string debug() { return "Basic expression:\n" + "left operand: \n" +
|
||||||
|
left->debug() + "\nright operand:\n" + right->debug +"\n###\n"; }
|
||||||
|
|
||||||
BasicExpression(ASTNode * parent);
|
BasicExpression(ASTNode * parent);
|
||||||
virtual ~BasicExpression();
|
virtual ~BasicExpression();
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* BasicStatement.cpp
|
||||||
|
*
|
||||||
|
* Created on: Dec 5, 2012
|
||||||
|
* Author: attero
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "BasicStatement.h"
|
||||||
|
|
||||||
|
BasicStatement::BasicStatement(ASTNode * parent) {
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
this->parent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicStatement::~BasicStatement() {
|
||||||
|
// TODO Auto-generated destructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
void BasicStatement::add_expression(ASTExpression * expr)
|
||||||
|
{
|
||||||
|
this->add_children(expr);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string BasicStatement::debug()
|
||||||
|
{
|
||||||
|
return "Basic statement with expression:\n" + children[0]->debug() + "\n;\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void BasicStatement::execute()
|
||||||
|
{
|
||||||
|
std::cout << children[0]->debug() << std::endl ;
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* BasicStatement.h
|
||||||
|
*
|
||||||
|
* Created on: Dec 5, 2012
|
||||||
|
* Author: attero
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BASICSTATEMENT_H_
|
||||||
|
#define BASICSTATEMENT_H_
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
class BasicStatement : public ASTStatement{
|
||||||
|
public:
|
||||||
|
BasicStatement(ASTNode * parent);
|
||||||
|
virtual std::string debug();
|
||||||
|
void add_expression(ASTExpression * expr);
|
||||||
|
virtual void execute();
|
||||||
|
virtual ~BasicStatement();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* BASICSTATEMENT_H_ */
|
|
@ -7,8 +7,9 @@
|
||||||
|
|
||||||
#include "ConstantExpression.h"
|
#include "ConstantExpression.h"
|
||||||
|
|
||||||
ConstantExpression::ConstantExpression() {
|
ConstantExpression::ConstantExpression(ASTNode * parent) {
|
||||||
// TODO Auto-generated constructor stub
|
// TODO Auto-generated constructor stub
|
||||||
|
this->parent = parent;
|
||||||
value = SenchaObject();
|
value = SenchaObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,12 +11,15 @@
|
||||||
|
|
||||||
class ConstantExpression : public ASTExpression {
|
class ConstantExpression : public ASTExpression {
|
||||||
public:
|
public:
|
||||||
ConstantExpression();
|
ConstantExpression(ASTNode * parent);
|
||||||
ConstantExpression(int number) { value = SenchaObject(number);};
|
ConstantExpression(ASTNode * parent, int number) { this->parent = parent; value = SenchaObject(number);};
|
||||||
ConstantExpression(double number) { value = SenchaObject(number); };
|
ConstantExpression(ASTNode * parent, double number) {this->parent = parent; value = SenchaObject(number); };
|
||||||
ConstantExpression(std::string text){ value = SenchaObject(text);};
|
ConstantExpression(std::string text){ this->parent = parent; value = SenchaObject(text);};
|
||||||
|
|
||||||
SenchaObject value;
|
SenchaObject value;
|
||||||
|
|
||||||
|
std::string debug() { return "Constant expression:\n" + value.repr() + "\n"; }
|
||||||
|
|
||||||
virtual ~ConstantExpression();
|
virtual ~ConstantExpression();
|
||||||
virtual SenchaObject evaluate();
|
virtual SenchaObject evaluate();
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,4 +18,25 @@ ProgramNode::~ProgramNode() {
|
||||||
|
|
||||||
void ProgramNode::execute() {
|
void ProgramNode::execute() {
|
||||||
std::cout << "Program started!\n";
|
std::cout << "Program started!\n";
|
||||||
|
for (std::vector<ASTNode *>::iterator it = children.begin(); it!=children.end(); ++it) {
|
||||||
|
(*it)->execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::cout << "END\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string ProgramNode::debug()
|
||||||
|
{
|
||||||
|
std::string debug_note = "Program started debugging\n";
|
||||||
|
|
||||||
|
for (std::vector<ASTNode *>::iterator it = children.begin(); it!=children.end(); ++it) {
|
||||||
|
debug_note += (*it)->debug() + "\n";
|
||||||
|
}
|
||||||
|
debug_note += "END\n";
|
||||||
|
return debug_note;
|
||||||
|
}
|
||||||
|
void ProgramNode::add_statement(ASTStatement * statement)
|
||||||
|
{
|
||||||
|
children.push_back(statement);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,8 @@
|
||||||
class ProgramNode : public ASTNode {
|
class ProgramNode : public ASTNode {
|
||||||
public:
|
public:
|
||||||
ProgramNode();
|
ProgramNode();
|
||||||
ASTStatement * add_child(ASTStatement * node);
|
std::string debug();
|
||||||
|
void add_statement(ASTStatement * statement);
|
||||||
virtual ~ProgramNode();
|
virtual ~ProgramNode();
|
||||||
virtual void execute();
|
virtual void execute();
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,6 +18,35 @@ SenchaObject::~SenchaObject() {
|
||||||
// TODO Auto-generated destructor stub
|
// TODO Auto-generated destructor stub
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string SenchaObject::repr()
|
||||||
|
{
|
||||||
|
std::string representation = "";
|
||||||
|
switch(type){
|
||||||
|
case string_literal:
|
||||||
|
representation = "type: string\n";
|
||||||
|
representation += this->text;
|
||||||
|
break;
|
||||||
|
case integer_number:
|
||||||
|
representation = "type: integer\n";
|
||||||
|
representation += to_string(this->integer);
|
||||||
|
break;
|
||||||
|
case float_number:
|
||||||
|
representation = "type: float\n";
|
||||||
|
representation += to_string(this->number);
|
||||||
|
break;
|
||||||
|
case null:
|
||||||
|
representation = "type: null\n";
|
||||||
|
representation += "null";
|
||||||
|
break;
|
||||||
|
case invalid:
|
||||||
|
representation = "type: invalid\n";
|
||||||
|
representation += "some crap";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return representation;
|
||||||
|
}
|
||||||
|
|
||||||
SenchaObject SenchaObject::operator+(const SenchaObject& right)const
|
SenchaObject SenchaObject::operator+(const SenchaObject& right)const
|
||||||
{
|
{
|
||||||
SenchaObject result;
|
SenchaObject result;
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#ifndef SENCHAOBJECT_H_
|
#ifndef SENCHAOBJECT_H_
|
||||||
#define SENCHAOBJECT_H_
|
#define SENCHAOBJECT_H_
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include "to_string.h"
|
||||||
class SenchaObject {
|
class SenchaObject {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -21,6 +22,7 @@ public:
|
||||||
|
|
||||||
Type type;
|
Type type;
|
||||||
|
|
||||||
|
virtual std::string repr();
|
||||||
|
|
||||||
std::string text;
|
std::string text;
|
||||||
int integer;
|
int integer;
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* to_string.h
|
||||||
|
*
|
||||||
|
* Created on: Dec 5, 2012
|
||||||
|
* Author: attero
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TO_STRING_H_
|
||||||
|
#define TO_STRING_H_
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
inline std::string to_string (const T& t)
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << t;
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* TO_STRING_H_ */
|
|
@ -7,6 +7,7 @@ Parser::Parser()
|
||||||
report_message = "***PARSER REPORT***\n";
|
report_message = "***PARSER REPORT***\n";
|
||||||
position_in_stream = 0;
|
position_in_stream = 0;
|
||||||
in_statement = false;
|
in_statement = false;
|
||||||
|
program = static_cast<ProgramNode *>(tree.root);
|
||||||
}
|
}
|
||||||
|
|
||||||
Parser::~Parser()
|
Parser::~Parser()
|
||||||
|
@ -64,7 +65,7 @@ void Parser::interpret()
|
||||||
read_next();
|
read_next();
|
||||||
while(tok_value!= "")
|
while(tok_value!= "")
|
||||||
{
|
{
|
||||||
statement();
|
program->add_statement(statement(program));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -114,13 +115,15 @@ bool Parser::is_type()
|
||||||
else return false;
|
else return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTNode * Parser::statement(ASTNode * statement)
|
ASTStatement * Parser::statement(ASTNode * parent)
|
||||||
{
|
{
|
||||||
|
BasicStatement * stat(parent);
|
||||||
|
|
||||||
if(accept("{"))
|
if(accept("{"))
|
||||||
{
|
{
|
||||||
while(!accept("}"))
|
while(!accept("}"))
|
||||||
{
|
{
|
||||||
statement();
|
stat = statement(parent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,7 +139,8 @@ ASTNode * Parser::statement(ASTNode * statement)
|
||||||
{
|
{
|
||||||
report("Identifier: " + tok_value + "\n");
|
report("Identifier: " + tok_value + "\n");
|
||||||
read_next();
|
read_next();
|
||||||
expr();
|
stat->add_expression(expr(stat));
|
||||||
|
;
|
||||||
report(" := \n");
|
report(" := \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,7 +148,7 @@ ASTNode * Parser::statement(ASTNode * statement)
|
||||||
if(accept(";"))
|
if(accept(";"))
|
||||||
{
|
{
|
||||||
report("Variable definition\n");
|
report("Variable definition\n");
|
||||||
return;
|
return stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(expect("("))
|
if(expect("("))
|
||||||
|
@ -167,7 +171,7 @@ ASTNode * Parser::statement(ASTNode * statement)
|
||||||
if(!accept(";"))
|
if(!accept(";"))
|
||||||
{
|
{
|
||||||
report("function body:\n");
|
report("function body:\n");
|
||||||
statement();
|
statement(stat);
|
||||||
report("function definition\n");
|
report("function definition\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -185,31 +189,37 @@ ASTNode * Parser::statement(ASTNode * statement)
|
||||||
{
|
{
|
||||||
//stuff
|
//stuff
|
||||||
//TODO implement that
|
//TODO implement that
|
||||||
|
return stat;
|
||||||
}
|
}
|
||||||
else if(accept("while"))
|
else if(accept("while"))
|
||||||
{
|
{
|
||||||
//similar stuff
|
//similar stuff
|
||||||
|
return stat;
|
||||||
}
|
}
|
||||||
else if(accept("return"))
|
else if(accept("return"))
|
||||||
{
|
{
|
||||||
|
|
||||||
if(!peek(";"))
|
if(!peek(";"))
|
||||||
{
|
{
|
||||||
expr();
|
stat->add_expression(expr(stat));
|
||||||
}
|
}
|
||||||
expect(";");
|
expect(";");
|
||||||
report("RETURN\n");
|
report("RETURN\n");
|
||||||
|
return stat;
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
expr();
|
stat->add_expression(expr(stat));
|
||||||
while(!expect(";") && tok_value != "") read_next();
|
while(!expect(";") && tok_value != "") read_next();
|
||||||
|
return stat;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTNode * Parser::prim_expr(ASTNode * expression)
|
ASTExpression * Parser::prim_expr(ASTNode * expression)
|
||||||
{
|
{
|
||||||
if(current_token.get_type() == t_integer)
|
if(current_token.get_type() == t_integer)
|
||||||
{
|
{
|
||||||
|
@ -242,7 +252,7 @@ ASTNode * Parser::prim_expr(ASTNode * expression)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTNode * Parser::postfix_expr(ASTNode * expression)
|
ASTExpression * Parser::postfix_expr(ASTNode * expression)
|
||||||
{
|
{
|
||||||
prim_expr();
|
prim_expr();
|
||||||
if(accept("["))
|
if(accept("["))
|
||||||
|
@ -270,7 +280,7 @@ ASTNode * Parser::postfix_expr(ASTNode * expression)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTNode * Parser::mul_expr(ASTNode * expression)
|
ASTExpression * Parser::mul_expr(ASTNode * expression)
|
||||||
{
|
{
|
||||||
postfix_expr();
|
postfix_expr();
|
||||||
while(peek("*") || peek("/"))
|
while(peek("*") || peek("/"))
|
||||||
|
@ -287,7 +297,7 @@ ASTNode * Parser::mul_expr(ASTNode * expression)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTNode * Parser::add_expr(ASTNode * expression)
|
ASTExpression * Parser::add_expr(ASTNode * expression)
|
||||||
{
|
{
|
||||||
mul_expr();
|
mul_expr();
|
||||||
while(peek("+") || peek("-"))
|
while(peek("+") || peek("-"))
|
||||||
|
@ -304,7 +314,7 @@ ASTNode * Parser::add_expr(ASTNode * expression)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTNode * Parser::rel_expr(ASTNode * expression)
|
ASTExpression * Parser::rel_expr(ASTNode * expression)
|
||||||
{
|
{
|
||||||
add_expr();
|
add_expr();
|
||||||
while(peek("<"))
|
while(peek("<"))
|
||||||
|
@ -315,7 +325,7 @@ ASTNode * Parser::rel_expr(ASTNode * expression)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTNode * Parser::eq_expr(ASTNode * expression)
|
ASTExpression * Parser::eq_expr(ASTNode * expression)
|
||||||
{
|
{
|
||||||
rel_expr();
|
rel_expr();
|
||||||
while(peek("==") || peek("!="))
|
while(peek("==") || peek("!="))
|
||||||
|
@ -333,7 +343,7 @@ ASTNode * Parser::eq_expr(ASTNode * expression)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTNode * Parser::expr(ASTNode * expression)
|
ASTExpression * Parser::expr(ASTNode * expression)
|
||||||
{
|
{
|
||||||
eq_expr(expression);
|
eq_expr(expression);
|
||||||
if(accept("="))
|
if(accept("="))
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "Token.h"
|
#include "Token.h"
|
||||||
|
#include "AST.h"
|
||||||
#include "../AST/AllTypesOfASTNodes.h"
|
#include "../AST/AllTypesOfASTNodes.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
@ -25,6 +26,8 @@ class Parser
|
||||||
string tok_value;
|
string tok_value;
|
||||||
vector<Token> token_stream;
|
vector<Token> token_stream;
|
||||||
int position_in_stream;
|
int position_in_stream;
|
||||||
|
AST tree;
|
||||||
|
ProgramNode * program;
|
||||||
|
|
||||||
bool in_statement;
|
bool in_statement;
|
||||||
bool read_next();
|
bool read_next();
|
||||||
|
@ -37,15 +40,15 @@ class Parser
|
||||||
void report(string s);
|
void report(string s);
|
||||||
|
|
||||||
//TODO change functions below to use AST nodes
|
//TODO change functions below to use AST nodes
|
||||||
ASTNode * statement(ASTNode * node);
|
ASTStatement * statement(ASTNode * node);
|
||||||
|
|
||||||
ASTNode * mul_expr(ASTNode * node);
|
ASTExpression * mul_expr(ASTNode * node);
|
||||||
ASTNode * add_expr(ASTNode * node);
|
ASTExpression * add_expr(ASTNode * node);
|
||||||
ASTNode * prim_expr(ASTNode * node);
|
ASTExpression * prim_expr(ASTNode * node);
|
||||||
ASTNode * postfix_expr(ASTNode * node);
|
ASTExpression * postfix_expr(ASTNode * node);
|
||||||
ASTNode * rel_expr(ASTNode * node);
|
ASTExpression * rel_expr(ASTNode * node);
|
||||||
ASTNode * eq_expr(ASTNode * node);
|
ASTExpression * eq_expr(ASTNode * node);
|
||||||
ASTNode * expr(ASTNode * node);
|
ASTExpression * expr(ASTNode * node);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PARSER_H
|
#endif // PARSER_H
|
||||||
|
|
Loading…
Reference in New Issue