aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/include
diff options
context:
space:
mode:
Diffstat (limited to 'c_compiler/include')
-rw-r--r--c_compiler/include/declaration.hpp6
-rw-r--r--c_compiler/include/expression.hpp159
-rw-r--r--c_compiler/include/function.hpp6
-rw-r--r--c_compiler/include/statement.hpp16
-rw-r--r--c_compiler/include/type.hpp1
5 files changed, 169 insertions, 19 deletions
diff --git a/c_compiler/include/declaration.hpp b/c_compiler/include/declaration.hpp
index 4fe754a..391438f 100644
--- a/c_compiler/include/declaration.hpp
+++ b/c_compiler/include/declaration.hpp
@@ -2,15 +2,13 @@
#define AST_DECLARATION_HPP
#include "node.hpp"
+#include "type.hpp"
+#include "expression.hpp"
#include <memory>
-class Expression;
-class Type;
class Declaration;
-typedef std::shared_ptr<Expression> ExpressionPtr;
-typedef std::shared_ptr<Type> TypePtr;
typedef std::shared_ptr<Declaration> DeclarationPtr;
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:
diff --git a/c_compiler/include/function.hpp b/c_compiler/include/function.hpp
index dc8640e..f049577 100644
--- a/c_compiler/include/function.hpp
+++ b/c_compiler/include/function.hpp
@@ -10,14 +10,8 @@
#include <memory>
#include <string>
-class Declaration;
-class Statement;
-class Type;
class Function;
-typedef std::shared_ptr<Declaration> DeclarationPtr;
-typedef std::shared_ptr<Statement> StatementPtr;
-typedef std::shared_ptr<Type> TypePtr;
typedef std::shared_ptr<Function> FunctionPtr;
diff --git a/c_compiler/include/statement.hpp b/c_compiler/include/statement.hpp
index 76d9303..4d2ffc4 100644
--- a/c_compiler/include/statement.hpp
+++ b/c_compiler/include/statement.hpp
@@ -10,8 +10,6 @@
class Statement;
-typedef std::shared_ptr<Declaration> DeclarationPtr;
-typedef std::shared_ptr<Expression> ExpressionPtr;
typedef std::shared_ptr<Statement> StatementPtr;
@@ -27,6 +25,7 @@ public:
virtual VariableStackBindings printAsm(VariableStackBindings bindings) const = 0;
virtual void countVariables(unsigned& var_count) const = 0;
+ virtual void countArguments(unsigned& argument_count) const = 0;
void linkStatement(Statement* next);
};
@@ -46,6 +45,7 @@ public:
virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
virtual void countVariables(unsigned& var_count) const;
+ virtual void countArguments(unsigned& argument_count) const;
};
@@ -61,34 +61,37 @@ public:
virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
virtual void countVariables(unsigned& var_count) const;
+ virtual void countArguments(unsigned& argument_count) const;
};
class ExpressionStatement : public Statement {
protected:
- ExpressionPtr expr_;
+ ExpressionPtr expression_;
public:
- ExpressionStatement(Expression* expr = nullptr);
+ ExpressionStatement(Expression* expression = nullptr);
virtual void print() const;
virtual void printXml() const;
virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
virtual void countVariables(unsigned& var_count) const;
+ virtual void countArguments(unsigned& argument_count) const;
};
class JumpStatement : public Statement {
protected:
- ExpressionPtr expr_;
+ ExpressionPtr expression_;
public:
- JumpStatement(Expression* expr = nullptr);
+ JumpStatement(Expression* expression = nullptr);
virtual void print() const;
virtual void printXml() const;
virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
virtual void countVariables(unsigned& var_count) const;
+ virtual void countArguments(unsigned& argument_count) const;
};
@@ -103,6 +106,7 @@ public:
virtual VariableStackBindings printAsm(VariableStackBindings bindings) const;
virtual void countVariables(unsigned& var_count) const;
+ virtual void countArguments(unsigned& argument_count) const;
};
diff --git a/c_compiler/include/type.hpp b/c_compiler/include/type.hpp
index 80afdfe..9352674 100644
--- a/c_compiler/include/type.hpp
+++ b/c_compiler/include/type.hpp
@@ -11,6 +11,7 @@ class Type;
typedef std::shared_ptr<Type> TypePtr;
+
class Type : public Node {
public:
virtual void print() const;