aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/include/expression.hpp
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-03-16 15:14:26 +0000
committerYann Herklotz <ymherklotz@gmail.com>2017-03-16 15:14:26 +0000
commit03e21a7ef589fa52d27eab85d669ca854e8ac2b8 (patch)
tree4dec7c89693c74e268756ce156ea6cdac3a41722 /c_compiler/include/expression.hpp
parent667a766552e2002ae7cf7969d78aaeba906d3759 (diff)
downloadCompiler-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.hpp159
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: