From 42156b87d0bc78eb8bac2c0e1cb41f105bbfc32b Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Fri, 24 Mar 2017 21:11:52 +0000 Subject: Working on array --- a.out | 0 c_compiler/include/declaration.hpp | 31 ++++++++++++----- c_compiler/include/expression.hpp | 7 +++- c_compiler/src/c_parser.y | 7 ++-- c_compiler/src/declaration.cpp | 50 ++++++++++++++++++++++++++- c_compiler/src/expression.cpp | 8 ++++- c_compiler/src/statement.cpp | 19 ++-------- test_deliverable/testcases/test_ATOI.c | 7 ++++ test_deliverable/testcases/test_ATOI_driver.c | 8 +++++ 9 files changed, 106 insertions(+), 31 deletions(-) create mode 100644 a.out create mode 100644 test_deliverable/testcases/test_ATOI.c create mode 100644 test_deliverable/testcases/test_ATOI_driver.c diff --git a/a.out b/a.out new file mode 100644 index 0000000..e69de29 diff --git a/c_compiler/include/declaration.hpp b/c_compiler/include/declaration.hpp index bcd12a7..b607c3c 100644 --- a/c_compiler/include/declaration.hpp +++ b/c_compiler/include/declaration.hpp @@ -13,34 +13,47 @@ typedef std::shared_ptr DeclarationPtr; class Declaration : public Node { -private: +protected: TypePtr type_; std::string id_; ExpressionPtr initializer_; DeclarationPtr next_declaration_; DeclarationPtr next_list_declaration_; bool extern_declaration_; - public: - Declaration(const std::string& id = "", Expression* initializer = nullptr); + Declaration(const std::string &id = "", Expression *initializer = nullptr); + Declaration(const std::string &id, ExpressionPtr initializer); virtual void print() const; virtual void printXml() const; - virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned& label_count) const; + virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const; + virtual VariableStackBindings localAsm(VariableStackBindings bindings, unsigned &label_count) const; + virtual void countDeclarations(unsigned &declaration_count) const; - VariableStackBindings localAsm(VariableStackBindings bindings, unsigned& label_count) const; - - void linkDeclaration(Declaration* next_declaration); - void linkListDeclaration(Declaration* next_list_declaration); + void linkDeclaration(Declaration *next_declaration); + void linkListDeclaration(Declaration *next_list_declaration); void setType(TypePtr type); - void setInitializer(Expression* initializer); + void setInitializer(Expression *initializer); void setExternDeclaration(bool is_extern); DeclarationPtr getNext() const; DeclarationPtr getNextListItem() const; + ExpressionPtr getInitializer() const; std::string getId() const; TypePtr getType() const; }; +class ArrayDeclaration : public Declaration +{ +private: + unsigned size_; +public: + ArrayDeclaration(const std::string &id = "", ExpressionPtr initializer = nullptr, const unsigned &size = 0); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const; + virtual VariableStackBindings localAsm(VariableStackBindings bindings, unsigned &label_count) const; + virtual void countDeclarations(unsigned &declaration_count) const; +}; + #endif diff --git a/c_compiler/include/expression.hpp b/c_compiler/include/expression.hpp index 244b2a8..1e7c557 100644 --- a/c_compiler/include/expression.hpp +++ b/c_compiler/include/expression.hpp @@ -61,10 +61,15 @@ public: class PostfixArrayElement : public UnaryExpression { +private: + ExpressionPtr postfix_expression_; + ExpressionPtr index_expression_; + public: - PostfixArrayElement(); + PostfixArrayElement(Expression *postfix_expression, Expression *index_expression); virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const; + virtual void stackPosition(VariableStackBindings bindings) const; }; class PostfixFunctionCall : public UnaryExpression diff --git a/c_compiler/src/c_parser.y b/c_compiler/src/c_parser.y index c56b4b6..5c464cd 100644 --- a/c_compiler/src/c_parser.y +++ b/c_compiler/src/c_parser.y @@ -110,7 +110,8 @@ ParameterList: ; Parameter: DeclarationSpecifierList Declarator { $$ = new Declaration($2->getId()); delete $1; } - | DeclarationSpecifierList {$$ = new Declaration(""); } + | DeclarationSpecifierList { $$ = new Declaration(""); } + | DeclarationSpecifierList T_MULT { $$ = new Declaration(""); delete $2; } ; // Declaration @@ -201,7 +202,7 @@ TypeQualifier: DirectDeclarator: T_IDENTIFIER { $$ = new Declaration(*$1); delete $1; } | T_LRB Declarator T_RRB { $$ = $2; } - | DirectDeclarator T_LSB ConditionalExpression T_RSB { $$ = $1; } +| DirectDeclarator T_LSB ConditionalExpression T_RSB { $$ = new ArrayDeclaration($1->getId(), $1->getInitializer(), $3->constantFold()); } | DirectDeclarator T_LSB T_RSB { $$ = $1; } | DirectDeclarator T_LRB T_RRB { $$ = $1; $$->setExternDeclaration(true); } | DirectDeclarator T_LRB ParameterList T_RRB { $1->linkDeclaration($3); $$ = $1; $$->setExternDeclaration(true); } @@ -416,7 +417,7 @@ UnaryOperator: T_AND { $$ = $1; } PostfixExpression: PrimaryExpression { $$ = $1; } - | PostfixExpression T_LSB Expression T_RSB { $$ = new PostfixArrayElement(); } + | PostfixExpression T_LSB Expression T_RSB { $$ = new PostfixArrayElement($1, $3); } | PostfixExpression T_LRB PostfixExpression2 { $$ = $3; diff --git a/c_compiler/src/declaration.cpp b/c_compiler/src/declaration.cpp index b151077..c16c6d5 100644 --- a/c_compiler/src/declaration.cpp +++ b/c_compiler/src/declaration.cpp @@ -8,10 +8,14 @@ // Declaration definition -Declaration::Declaration(const std::string& id, Expression* initializer) +Declaration::Declaration(const std::string &id, Expression *initializer) : id_(id), initializer_(initializer), extern_declaration_(false) {} +Declaration::Declaration(const std::string &id, ExpressionPtr initializer) + :id_(id), initializer_(initializer), extern_declaration_(false) +{} + void Declaration::print() const { if(next_declaration_ != nullptr) @@ -73,6 +77,17 @@ VariableStackBindings Declaration::localAsm(VariableStackBindings bindings, unsi return bindings; } +void Declaration::countDeclarations(unsigned &declaration_count) const +{ + if(next_declaration_ != nullptr) + next_declaration_->countDeclarations(declaration_count); + + if(next_list_declaration_ != nullptr) + next_list_declaration_->countDeclarations(declaration_count); + + ++declaration_count; +} + void Declaration::linkDeclaration(Declaration* next_declaration) { DeclarationPtr decl_ptr(next_declaration); @@ -111,6 +126,11 @@ DeclarationPtr Declaration::getNextListItem() const return next_list_declaration_; } +ExpressionPtr Declaration::getInitializer() const +{ + return initializer_; +} + std::string Declaration::getId() const { return id_; @@ -120,3 +140,31 @@ TypePtr Declaration::getType() const { return type_; } + + +// Array declaration class + +ArrayDeclaration::ArrayDeclaration(const std::string &id, ExpressionPtr initializer, const unsigned &size) + : Declaration(id, initializer), size_(size) +{} + +VariableStackBindings ArrayDeclaration::printAsm(VariableStackBindings bindings, unsigned &label_count) const +{ + return bindings; +} + +VariableStackBindings ArrayDeclaration::localAsm(VariableStackBindings bindings, unsigned &label_count) const +{ + return bindings; +} + +void ArrayDeclaration::countDeclarations(unsigned &declaration_count) const +{ + if(next_declaration_ != nullptr) + next_declaration_->countDeclarations(declaration_count); + + if(next_list_declaration_ != nullptr) + next_list_declaration_->countDeclarations(declaration_count); + + declaration_count += size_; +} diff --git a/c_compiler/src/expression.cpp b/c_compiler/src/expression.cpp index af2687d..5b407d8 100644 --- a/c_compiler/src/expression.cpp +++ b/c_compiler/src/expression.cpp @@ -117,7 +117,8 @@ void UnaryExpression::stackPosition(VariableStackBindings) const // PostfixArrayElement -PostfixArrayElement::PostfixArrayElement() +PostfixArrayElement::PostfixArrayElement(Expression *postfix_expression, Expression *index_expression) + : postfix_expression_(postfix_expression), index_expression_(index_expression) {} VariableStackBindings PostfixArrayElement::printAsm(VariableStackBindings bindings, unsigned &label_count) const @@ -125,6 +126,11 @@ VariableStackBindings PostfixArrayElement::printAsm(VariableStackBindings bindin return bindings; } +void PostfixArrayElement::stackPosition(VariableStackBindings bindings) const +{ + +} + // PostfixFunctionCall diff --git a/c_compiler/src/statement.cpp b/c_compiler/src/statement.cpp index c266140..35bda61 100644 --- a/c_compiler/src/statement.cpp +++ b/c_compiler/src/statement.cpp @@ -234,27 +234,14 @@ VariableStackBindings CompoundStatement::printAsm(VariableStackBindings bindings void CompoundStatement::countVariables(unsigned &var_count) const { - DeclarationPtr declaration = declaration_; - if(next_statement_ != nullptr) next_statement_->countVariables(var_count); + + if(declaration_ != nullptr) + declaration_->countDeclarations(var_count); if(statement_ != nullptr) statement_->countVariables(var_count); - - while(declaration != nullptr) { - DeclarationPtr declaration_list = declaration->getNextListItem(); - - while(declaration_list != nullptr) { - var_count++; - - declaration_list = declaration_list->getNextListItem(); - } - - var_count++; - - declaration = declaration->getNext(); - } } void CompoundStatement::countArguments(unsigned &argument_count) const diff --git a/test_deliverable/testcases/test_ATOI.c b/test_deliverable/testcases/test_ATOI.c new file mode 100644 index 0000000..32e4f69 --- /dev/null +++ b/test_deliverable/testcases/test_ATOI.c @@ -0,0 +1,7 @@ +int atoi(const char *); + +int atoi_(char* str_) +{ + int a = atoi(str_); + return a; +} diff --git a/test_deliverable/testcases/test_ATOI_driver.c b/test_deliverable/testcases/test_ATOI_driver.c new file mode 100644 index 0000000..d04c5a9 --- /dev/null +++ b/test_deliverable/testcases/test_ATOI_driver.c @@ -0,0 +1,8 @@ +#include + +int atoi_(char *); + +int main() +{ + return !( 3893 == atoi_("3893") ); +} -- cgit