From 03e21a7ef589fa52d27eab85d669ca854e8ac2b8 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Thu, 16 Mar 2017 15:14:26 +0000 Subject: Still works and added correct frame size --- c_compiler/include/expression.hpp | 159 +++++++++++++++++++++++++++++++++++++- 1 file changed, 156 insertions(+), 3 deletions(-) (limited to 'c_compiler/include/expression.hpp') diff --git a/c_compiler/include/expression.hpp b/c_compiler/include/expression.hpp index dc2b2e9..ba1a556 100644 --- a/c_compiler/include/expression.hpp +++ b/c_compiler/include/expression.hpp @@ -1,8 +1,9 @@ #ifndef EXPRESSION_HPP #define EXPRESSION_HPP -#include "node.hpp" #include "bindings.hpp" +#include "node.hpp" +#include "type.hpp" #include #include @@ -15,12 +16,21 @@ typedef std::shared_ptr ExpressionPtr; class Expression : public Node { +private: + ExpressionPtr next_expression_; + public: virtual VariableStackBindings printAsm(VariableStackBindings bindings) const = 0; virtual void print() const; virtual void printXml() const; + virtual void countArguments(unsigned& argument_count) const; + virtual int postfixStackPosition(VariableStackBindings bindings) const; + virtual void setPostfixExpression(Expression* postfix_expression); + + void linkExpression(Expression* next_expression); + ExpressionPtr nextExpression() const; }; @@ -36,10 +46,57 @@ public: }; -class AssignmentExpression : public OperationExpression +class PostfixExpression : public Expression { public: - AssignmentExpression(Expression* lhs, Expression* rhs); + PostfixExpression(); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings) const; +}; + + +class PostfixArrayElement : public Expression +{ +public: + PostfixArrayElement(); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings) const; +}; + + +class PostfixFunctionCall : public Expression +{ +private: + ExpressionPtr postfix_expression_; + ExpressionPtr argument_expression_list_; + +public: + PostfixFunctionCall(Expression* argument_expression_list = nullptr); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings) const; + virtual void countArguments(unsigned& argument_count) const; + + void setPostfixExpression(Expression* postfix_expression); +}; + + +class UnaryExpression : public Expression +{ +public: + UnaryExpression(); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings) const; +}; + + +class CastExpression : public Expression +{ +private: + TypePtr type_; + ExpressionPtr expression_; + +public: + CastExpression(Type* type, Expression* expression); virtual VariableStackBindings printAsm(VariableStackBindings bindings) const; }; @@ -69,6 +126,102 @@ public: }; +class ShiftExpression : public OperationExpression +{ +public: + ShiftExpression(Expression* lhs, Expression* rhs); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings) const; +}; + + +class RelationalExpression : public OperationExpression +{ +public: + RelationalExpression(Expression* lhs, Expression* rhs); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings) const; +}; + + +class EqualityExpression : public OperationExpression +{ +public: + EqualityExpression(Expression* lhs, Expression* rhs); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings) const; +}; + + +class AndExpression : public OperationExpression +{ +public: + AndExpression(Expression* lhs, Expression* rhs); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings) const; +}; + + +class ExclusiveOrExpression : public OperationExpression +{ +public: + ExclusiveOrExpression(Expression* lhs, Expression* rhs); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings) const; +}; + + +class InclusiveOrExpression : public OperationExpression +{ +public: + InclusiveOrExpression(Expression* lhs, Expression* rhs); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings) const; +}; + + +class LogicalAndExpression : public OperationExpression +{ +public: + LogicalAndExpression(Expression* lhs, Expression* rhs); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings) const; +}; + + +class LogicalOrExpression : public OperationExpression +{ +public: + LogicalOrExpression(Expression* lhs, Expression* rhs); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings) const; +}; + + +class ConditionalExpression : public Expression +{ +private: + ExpressionPtr logical_or_; + ExpressionPtr expression_; + ExpressionPtr conditional_expression_; + +public: + ConditionalExpression(Expression* logical_or, Expression* expression, + Expression* conditional_expression); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings) const; +}; + + +class AssignmentExpression : public OperationExpression +{ +public: + AssignmentExpression(Expression* lhs, Expression* rhs); + + virtual VariableStackBindings printAsm(VariableStackBindings bindings) const; +}; + + class Identifier : public Expression { private: -- cgit