diff options
Diffstat (limited to 'c_compiler/src')
-rw-r--r-- | c_compiler/src/c_parser.y | 7 | ||||
-rw-r--r-- | c_compiler/src/declaration.cpp | 50 | ||||
-rw-r--r-- | c_compiler/src/expression.cpp | 8 | ||||
-rw-r--r-- | c_compiler/src/statement.cpp | 19 |
4 files changed, 63 insertions, 21 deletions
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 |