diff --git a/CMakeLists.txt b/CMakeLists.txt index 291c54f..c9a7d3f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,6 +60,9 @@ SET(SCULLY_SOURCE src/AST/ASTElement.cpp src/AST/ASTVisitor.cpp + src/AST/Statement.cpp + src/AST/VariableDefinition.cpp + src/AST/Type.cpp ${CMAKE_CURRENT_BINARY_DIR}/grammar.cpp ) diff --git a/grammar/grammar.y b/grammar/grammar.y index 7432053..efe35e1 100644 --- a/grammar/grammar.y +++ b/grammar/grammar.y @@ -8,6 +8,9 @@ #include "Token.h" #include "AST/ASTElement.h" +#include "AST/Statement.h" +#include "AST/VariableDefinition.h" +#include "AST/Type.h" } @@ -41,18 +44,18 @@ fundefs(A) ::= . { A = 0; } fundefs(A) ::= fundefs fundef(B). { A = A + B; } %type fundef {int} -fundef(A) ::= type(T) T_IDENTIFIER(ID) params(P) T_BEGIN statements(S) T_END. { A = T + 1 + P + S; /* ID */ } +fundef(A) ::= type(T) T_IDENTIFIER(ID) params(P) T_BEGIN statements(S) T_END. { A = 1 + 1 + P + S; /* T ID */ } -%type type {int} -type(A) ::= T_BOOL. { A = 1; } -type(A) ::= T_INT. { A = 1; } -type(A) ::= T_STRING. { A = 1; } -type(A) ::= T_VOID. { A = 1; } +%type type {Type*} +type(A) ::= T_BOOL. { A = new Type("bool"); } +type(A) ::= T_INT. { A = new Type("int"); } +type(A) ::= T_STRING. { A = new Type("string"); } +type(A) ::= T_VOID. { A = new Type("void"); } %type params {int} params(A) ::= . { A = 0; } -params(A) ::= type(T) T_IDENTIFIER(ID). { A = T + 1; /* ID */ } -params(A) ::= params(B) T_COMMA type(T) T_IDENTIFIER(ID). { A = B + T + 1; /* ID */ } +params(A) ::= type(T) T_IDENTIFIER(ID). { A = 1 + 1; /* T ID */ } +params(A) ::= params(B) T_COMMA type(T) T_IDENTIFIER(ID). { A = B + 1 + 1; /* T ID */ } %type statement {int} statement(A) ::= T_IF T_LPAREN expr(E) T_RPAREN statement(S). { A = E + S; } @@ -84,7 +87,7 @@ expr(A) ::= T_FALSE. { A = 1; } expr(A) ::= T_IDENTIFIER(ID) T_LPAREN values(V) T_RPAREN. { A = 1 + V; /* ID */ } %type vardef {int} -vardef(A) ::= type(T) T_IDENTIFIER(ID). { A = T + 1; /* ID */ } +vardef(A) ::= type(T) T_IDENTIFIER(ID). { A = 1 + 1; /* T ID */ } %type values {int} values(A) ::= . { A = 0; } diff --git a/inc/AST/ASTElement.h b/inc/AST/ASTElement.h index f88b627..6e945e4 100644 --- a/inc/AST/ASTElement.h +++ b/inc/AST/ASTElement.h @@ -1,7 +1,7 @@ #ifndef ASTELEMENT_H #define ASTELEMENT_H -#include "AST/ASTVisitor.h" +class ASTVisitor; class ASTElement { public: diff --git a/inc/AST/ASTVisitor.h b/inc/AST/ASTVisitor.h index 6bb3b17..35ebec0 100644 --- a/inc/AST/ASTVisitor.h +++ b/inc/AST/ASTVisitor.h @@ -1,10 +1,14 @@ #ifndef ASTVISITOR_H #define ASTVISITOR_H +#include "VariableDefinition.h" + class ASTVisitor { public: ASTVisitor(); virtual ~ASTVisitor(); + + virtual void visit(VariableDefinition* e) = 0; }; #endif // ASTVISITOR_H diff --git a/inc/AST/Statement.h b/inc/AST/Statement.h new file mode 100644 index 0000000..9fa49fd --- /dev/null +++ b/inc/AST/Statement.h @@ -0,0 +1,14 @@ +#ifndef STATEMENT_H +#define STATEMENT_H + +#include "AST/ASTElement.h" + +class Statement : public ASTElement { +public: + Statement(); + virtual ~Statement(); + + virtual void accept(ASTVisitor* visitor) = 0; +}; + +#endif // STATEMENT_H diff --git a/inc/AST/Type.h b/inc/AST/Type.h new file mode 100644 index 0000000..b897ee6 --- /dev/null +++ b/inc/AST/Type.h @@ -0,0 +1,16 @@ +#ifndef TYPE_H +#define TYPE_H + +#include + +class Type { +public: + Type(std::string name); + ~Type(); + + std::string getName(); +private: + std::string name_; +}; + +#endif // TYPE_H diff --git a/inc/AST/VariableDefinition.h b/inc/AST/VariableDefinition.h new file mode 100644 index 0000000..5c3041b --- /dev/null +++ b/inc/AST/VariableDefinition.h @@ -0,0 +1,25 @@ +#ifndef VARIABLEDEFINITION_H +#define VARIABLEDEFINITION_H + +#include + +#include "AST/Statement.h" + +class VariableDefinition : public Statement +{ +public: + VariableDefinition(int type, std::string name); + virtual ~VariableDefinition(); + + virtual void accept(ASTVisitor* visitor); + + // Type* getType(); + int getType(); + std::string getName(); +private: + // Type* type_ + int type_; + std::string name_; +}; + +#endif // VARIABLEDEFINITION_H diff --git a/src/AST/ASTVisitor.cpp b/src/AST/ASTVisitor.cpp index 347ffc8..fe31aa0 100644 --- a/src/AST/ASTVisitor.cpp +++ b/src/AST/ASTVisitor.cpp @@ -7,4 +7,3 @@ ASTVisitor::ASTVisitor() { ASTVisitor::~ASTVisitor() { // } - diff --git a/src/AST/Statement.cpp b/src/AST/Statement.cpp new file mode 100644 index 0000000..5d56da5 --- /dev/null +++ b/src/AST/Statement.cpp @@ -0,0 +1,9 @@ +#include "AST/Statement.h" + +Statement::Statement() { + // +} + +Statement::~Statement() { + // +} diff --git a/src/AST/Type.cpp b/src/AST/Type.cpp new file mode 100644 index 0000000..5504402 --- /dev/null +++ b/src/AST/Type.cpp @@ -0,0 +1,5 @@ +#include "AST/Type.h" + +Type::Type(std::string name) : name_(name) { + // +} diff --git a/src/AST/VariableDefinition.cpp b/src/AST/VariableDefinition.cpp new file mode 100644 index 0000000..b47e85b --- /dev/null +++ b/src/AST/VariableDefinition.cpp @@ -0,0 +1,22 @@ +#include "AST/VariableDefinition.h" +#include "AST/ASTVisitor.h" + +VariableDefinition::VariableDefinition(int type, std::string name) : type_(type), name_(name) { + // +} + +VariableDefinition::~VariableDefinition() { + // +} + +void VariableDefinition::accept(ASTVisitor* visitor) { + visitor->visit(this); +} + +int VariableDefinition::getType() { + return type_; +} + +std::string VariableDefinition::getName() { + return name_; +}