aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-03-24 21:11:52 +0000
committerYann Herklotz <ymherklotz@gmail.com>2017-03-24 21:11:52 +0000
commit42156b87d0bc78eb8bac2c0e1cb41f105bbfc32b (patch)
treec5cc1a33e9393c85de3187c594f3be38bb53a5a4
parente539805d39de73e25eeaa48a48730255c4ae695f (diff)
downloadCompiler-42156b87d0bc78eb8bac2c0e1cb41f105bbfc32b.tar.gz
Compiler-42156b87d0bc78eb8bac2c0e1cb41f105bbfc32b.zip
Working on array
-rw-r--r--a.out0
-rw-r--r--c_compiler/include/declaration.hpp31
-rw-r--r--c_compiler/include/expression.hpp7
-rw-r--r--c_compiler/src/c_parser.y7
-rw-r--r--c_compiler/src/declaration.cpp50
-rw-r--r--c_compiler/src/expression.cpp8
-rw-r--r--c_compiler/src/statement.cpp19
-rw-r--r--test_deliverable/testcases/test_ATOI.c7
-rw-r--r--test_deliverable/testcases/test_ATOI_driver.c8
9 files changed, 106 insertions, 31 deletions
diff --git a/a.out b/a.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/a.out
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<Declaration> 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 <stdlib.h>
+
+int atoi_(char *);
+
+int main()
+{
+ return !( 3893 == atoi_("3893") );
+}