diff options
author | Yann Herklotz <ymherklotz@gmail.com> | 2017-03-16 15:14:26 +0000 |
---|---|---|
committer | Yann Herklotz <ymherklotz@gmail.com> | 2017-03-16 15:14:26 +0000 |
commit | 03e21a7ef589fa52d27eab85d669ca854e8ac2b8 (patch) | |
tree | 4dec7c89693c74e268756ce156ea6cdac3a41722 /c_compiler/include/expression.hpp | |
parent | 667a766552e2002ae7cf7969d78aaeba906d3759 (diff) | |
download | Compiler-03e21a7ef589fa52d27eab85d669ca854e8ac2b8.tar.gz Compiler-03e21a7ef589fa52d27eab85d669ca854e8ac2b8.zip |
Still works and added correct frame size
Diffstat (limited to 'c_compiler/include/expression.hpp')
-rw-r--r-- | c_compiler/include/expression.hpp | 159 |
1 files changed, 156 insertions, 3 deletions
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 <cstdint> #include <memory> @@ -15,12 +16,21 @@ typedef std::shared_ptr<Expression> 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: |