aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/src
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-03-06 17:37:51 +0000
committerYann Herklotz <ymherklotz@gmail.com>2017-03-06 17:37:51 +0000
commitfdd6ff07cee824078c5315bf07926ee15bbdde85 (patch)
tree25ae7097f5f1ee88b7e9d0f27297f38c08a29009 /c_compiler/src
parent3cef694323c53a19c8c7c0fab19432eb74f8792a (diff)
downloadCompiler-fdd6ff07cee824078c5315bf07926ee15bbdde85.tar.gz
Compiler-fdd6ff07cee824078c5315bf07926ee15bbdde85.zip
making changes to type in lexer now
Diffstat (limited to 'c_compiler/src')
-rw-r--r--c_compiler/src/c_lexer.flex8
-rw-r--r--c_compiler/src/c_parser.y4
-rw-r--r--c_compiler/src/compiler_main.cpp4
-rw-r--r--c_compiler/src/declaration.cpp17
-rw-r--r--c_compiler/src/expression.cpp14
-rw-r--r--c_compiler/src/function.cpp8
-rw-r--r--c_compiler/src/initializer.cpp18
-rw-r--r--c_compiler/src/statement.cpp95
-rw-r--r--c_compiler/src/translation_unit.cpp15
-rw-r--r--c_compiler/src/type.cpp70
10 files changed, 199 insertions, 54 deletions
diff --git a/c_compiler/src/c_lexer.flex b/c_compiler/src/c_lexer.flex
index c8ca90a..38ee946 100644
--- a/c_compiler/src/c_lexer.flex
+++ b/c_compiler/src/c_lexer.flex
@@ -8,18 +8,10 @@ extern "C" int fileno(FILE *stream);
%}
-KEYWORD auto|double|int|struct|break|else|long|switch|case|enum|register|typedef|char|extern|return|union|const|float|short|unsigned|continue|for|signed|void|default|goto|sizeof|volatile|do|if|static|while
-
IDENTIFIER [_a-zA-Z][_a-zA-Z0-9]*
-OPERATOR [.][.][.]|[<>][<>][=]|[-][-]|[+][+]|[|][|]|[#][#]|[&][&]|[+\-*\/<>=!%^|&][=]|[<][<]|[->][>]|[<>&=+\/\-*(){}\[\]\.,%~!?:|^;]
-
ASSIGNMENT_OPERATOR (([<>][<>]|[*\/%+\-&^|])[=]|[=])
-FRACTIONALCONSTANT (([0-9]*\.[0-9]+)|([0-9]+\.))
-EXPONENTPART ([eE][+-]?[0-9]+)
-
-FLOATINGSUFFI X ([flFL])
INTEGERSUFFIX ([uU][lL]|[lL][uU]|[uUlL])
DECIMALCONSTANT ([1-9][0-9]*)
diff --git a/c_compiler/src/c_parser.y b/c_compiler/src/c_parser.y
index 2864907..4a78ec5 100644
--- a/c_compiler/src/c_parser.y
+++ b/c_compiler/src/c_parser.y
@@ -73,14 +73,14 @@ void yyerror(const char *);
%%
ROOT:
- TranslationUnit { g_root = $1; }
+ TranslationUnit { g_root = $1; }
;
// EXTERNAL DEFINITION
TranslationUnit:
ExternalDeclaration { $$ = new TranslationUnit($1); }
-| TranslationUnit ExternalDeclaration { $$->push($2); }
+ | TranslationUnit ExternalDeclaration { $$->push($2); }
;
ExternalDeclaration:
diff --git a/c_compiler/src/compiler_main.cpp b/c_compiler/src/compiler_main.cpp
index a4df8a7..b550eba 100644
--- a/c_compiler/src/compiler_main.cpp
+++ b/c_compiler/src/compiler_main.cpp
@@ -4,9 +4,11 @@
int main(int argc, char *argv[])
{
- TranslationUnit* ast = parseAST();
+ Node* ast = parseAST();
ast->printxml();
+
+ ast->printasm();
return 0;
}
diff --git a/c_compiler/src/declaration.cpp b/c_compiler/src/declaration.cpp
index 5341b5b..2fba9f9 100644
--- a/c_compiler/src/declaration.cpp
+++ b/c_compiler/src/declaration.cpp
@@ -4,7 +4,8 @@
// Declaration definition
Declaration::Declaration(const std::string& _id)
- : id(_id) {}
+ : id(_id)
+{}
void Declaration::print() const
{
@@ -20,15 +21,16 @@ void Declaration::printxml() const
if(next_decl != nullptr)
next_decl->printxml();
- if(decl_list != nullptr) {
- decl_list->printxml();
+ if(list_next_decl != nullptr) {
+ list_next_decl->printxml();
}
if(id != "")
std::cout << "<Variable id=\""<< id << "\" />" << std::endl;
}
-void Declaration::printasm() const {}
+void Declaration::printasm() const
+{}
void Declaration::addDeclaration(Declaration* _next_decl)
{
@@ -37,7 +39,7 @@ void Declaration::addDeclaration(Declaration* _next_decl)
void Declaration::addList(Declaration* _next_decl)
{
- decl_list = _next_decl;
+ list_next_decl = _next_decl;
}
Declaration* Declaration::getNext() const
@@ -45,6 +47,11 @@ Declaration* Declaration::getNext() const
return next_decl;
}
+Declaration* Declaration::getNextListItem() const
+{
+ return list_next_decl;
+}
+
std::string Declaration::getId() const
{
return id;
diff --git a/c_compiler/src/expression.cpp b/c_compiler/src/expression.cpp
index 5eab857..4b09581 100644
--- a/c_compiler/src/expression.cpp
+++ b/c_compiler/src/expression.cpp
@@ -3,8 +3,14 @@
// Expression definition
-Expression::Expression(const Node* expr) {}
+Expression::Expression(const Node* expr)
+{}
-void Expression::print() const {}
-void Expression::printxml() const {}
-void Expression::printasm() const {}
+void Expression::print() const
+{}
+
+void Expression::printxml() const
+{}
+
+void Expression::printasm() const
+{}
diff --git a/c_compiler/src/function.cpp b/c_compiler/src/function.cpp
index a132280..acd5547 100644
--- a/c_compiler/src/function.cpp
+++ b/c_compiler/src/function.cpp
@@ -44,4 +44,10 @@ void Function::printxml() const
}
void Function::printasm() const
-{}
+{
+ int32_t count = 0;
+ if(statement != nullptr)
+ statement->count_variables(count);
+
+ std::cout << id << ": " << count << " variables defined" << std::endl;
+}
diff --git a/c_compiler/src/initializer.cpp b/c_compiler/src/initializer.cpp
index 61a0413..580d81f 100644
--- a/c_compiler/src/initializer.cpp
+++ b/c_compiler/src/initializer.cpp
@@ -3,20 +3,26 @@
// Initializer definition
-Initializer::Initializer() {}
+Initializer::Initializer()
+{}
-void Initializer::print() const {}
+void Initializer::print() const
+{}
-void Initializer::printxml() const {}
+void Initializer::printxml() const
+{}
-void Initializer::printasm() const {}
+void Initializer::printasm() const
+{}
// Integer definition
-Integer::Integer() : Initializer() {}
+Integer::Integer() : Initializer()
+{}
// String Literal definition
-StringLiteral::StringLiteral() : Initializer() {}
+StringLiteral::StringLiteral() : Initializer()
+{}
diff --git a/c_compiler/src/statement.cpp b/c_compiler/src/statement.cpp
index 28bd981..14d5808 100644
--- a/c_compiler/src/statement.cpp
+++ b/c_compiler/src/statement.cpp
@@ -4,34 +4,24 @@
// General base Statement definition
Statement::Statement(Statement* statement)
- : next_statement(statement) {}
-
-void Statement::print() const
-{
- if(next_statement != nullptr)
- next_statement->print();
-}
-
-void Statement::printxml() const
-{
- if(next_statement != nullptr)
- next_statement->printxml();
-}
+ : next_statement(statement)
+{}
-void Statement::printasm() const
+void Statement::addStatement(Statement* _next)
{
- if(next_statement != nullptr)
- next_statement->printasm();
+ next_statement = _next;
}
// Compound Statement definition
CompoundStatement::CompoundStatement(Declaration* decl, Statement* statement)
- : Statement(), m_decl(decl), m_statement(statement) {}
+ : Statement(), m_decl(decl), m_statement(statement)
+{}
CompoundStatement::CompoundStatement(Statement* statement)
- : m_statement(statement) {}
+ : m_statement(statement)
+{}
void CompoundStatement::print() const
{
@@ -61,6 +51,31 @@ void CompoundStatement::printxml() const
void CompoundStatement::printasm() const
{}
+void CompoundStatement::count_variables(int32_t& var_count) const
+{
+ Declaration* declaration = m_decl;
+
+ if(next_statement != nullptr)
+ next_statement->count_variables(var_count);
+
+ if(m_statement != nullptr)
+ m_statement->count_variables(var_count);
+
+ while(declaration != nullptr) {
+ Declaration* declaration_list = declaration->getNextListItem();
+
+ while(declaration_list != nullptr) {
+ var_count++;
+
+ declaration_list = declaration_list->getNextListItem();
+ }
+
+ var_count++;
+
+ declaration = declaration->getNext();
+ }
+}
+
// Selection Statement definition
@@ -86,11 +101,24 @@ void SelectionStatement::printxml() const
void SelectionStatement::printasm() const
{}
+void SelectionStatement::count_variables(int32_t& var_count) const
+{
+ if(next_statement != nullptr)
+ next_statement->count_variables(var_count);
+
+ if(m_if != nullptr)
+ m_if->count_variables(var_count);
+
+ if(m_else != nullptr)
+ m_else->count_variables(var_count);
+}
+
// Expression Statement definition
ExpressionStatement::ExpressionStatement(Expression* expr)
- : Statement(), m_expr(expr) {}
+ : Statement(), m_expr(expr)
+{}
void ExpressionStatement::print() const
{}
@@ -99,13 +127,20 @@ void ExpressionStatement::printxml() const
{}
void ExpressionStatement::printasm() const
-{}
+{}
+
+void ExpressionStatement::count_variables(int32_t& var_count) const
+{
+ if(next_statement != nullptr)
+ next_statement->count_variables(var_count);
+}
// Jump Statement definition
JumpStatement::JumpStatement(Expression* expr)
- : m_expr(expr) {}
+ : m_expr(expr)
+{}
void JumpStatement::print() const
{}
@@ -122,11 +157,18 @@ void JumpStatement::printasm() const
std::cout << "\tlw\t$2,8($fp)" << std::endl;
}
+void JumpStatement::count_variables(int32_t& var_count) const
+{
+ if(next_statement != nullptr)
+ next_statement->count_variables(var_count);
+}
+
// Iteration Statement definition
IterationStatement::IterationStatement(Statement* statement)
- : m_statement(statement) {}
+ : m_statement(statement)
+{}
void IterationStatement::print() const
{}
@@ -141,3 +183,12 @@ void IterationStatement::printxml() const
void IterationStatement::printasm() const
{}
+
+void IterationStatement::count_variables(int32_t& var_count) const
+{
+ if(next_statement != nullptr)
+ next_statement->count_variables(var_count);
+
+ if(m_statement != nullptr)
+ m_statement->count_variables(var_count);
+}
diff --git a/c_compiler/src/translation_unit.cpp b/c_compiler/src/translation_unit.cpp
index c1e4c13..a3566d7 100644
--- a/c_compiler/src/translation_unit.cpp
+++ b/c_compiler/src/translation_unit.cpp
@@ -3,17 +3,20 @@
// Translation Unit definition
-TranslationUnit::TranslationUnit(Node* decl) {
+TranslationUnit::TranslationUnit(Node* decl)
+{
push(decl);
}
-void TranslationUnit::print() const {
+void TranslationUnit::print() const
+{
for(auto& node : translation_unit) {
node->print();
}
}
-void TranslationUnit::printxml() const {
+void TranslationUnit::printxml() const
+{
std::cout << "<?xml version=\"1.0\"?>\n<Program>" << std::endl;
for(auto& node : translation_unit) {
node->printxml();
@@ -21,12 +24,14 @@ void TranslationUnit::printxml() const {
std::cout << "</Program>" << std::endl;
}
-void TranslationUnit::printasm() const {
+void TranslationUnit::printasm() const
+{
for(auto& node : translation_unit) {
node->printasm();
}
}
-void TranslationUnit::push(Node* decl) {
+void TranslationUnit::push(Node* decl)
+{
translation_unit.push_back(decl);
}
diff --git a/c_compiler/src/type.cpp b/c_compiler/src/type.cpp
new file mode 100644
index 0000000..b7c3fec
--- /dev/null
+++ b/c_compiler/src/type.cpp
@@ -0,0 +1,70 @@
+#include "ast.hpp"
+
+
+// Type definition
+
+void Type::print() const
+{
+ std::cout << getType() << " " << std::endl;
+}
+
+void Type::printxml() const
+{}
+
+void Type::printasm() const
+{}
+
+
+// Pointer definition
+
+Pointer::Pointer(Type* _pointer_type) : pointer_type(_pointer_type)
+{}
+
+std::string Pointer::getType() const
+{
+ return "pointer " + pointer_type->getType();
+}
+
+
+// Array definition
+
+Array::Array(Type* _array_type, int32_t _size) : size(_size), array_type(_array_type)
+{}
+
+std::string Array::getType() const
+{
+ return "array " + array_type->getType();
+}
+
+
+// Void definition
+
+Void::Void()
+{}
+
+std::string Void::getType() const
+{
+ return "void";
+}
+
+
+// Int defintion
+
+Int::Int()
+{}
+
+std::string Int::getType() const
+{
+ return "int";
+}
+
+
+// Char definition
+
+Char::Char()
+{}
+
+std::string Char::getType() const
+{
+ return "char";
+}