aboutsummaryrefslogtreecommitdiffstats
path: root/AST.h
diff options
context:
space:
mode:
Diffstat (limited to 'AST.h')
-rw-r--r--AST.h104
1 files changed, 83 insertions, 21 deletions
diff --git a/AST.h b/AST.h
index 4dc44e29..f42ff47d 100644
--- a/AST.h
+++ b/AST.h
@@ -152,7 +152,7 @@ public:
ASTNode(_location), m_parameters(_parameters) {}
virtual void accept(ASTVisitor& _visitor) override;
- std::vector<ASTPointer<VariableDeclaration>> const& getParameters() { return m_parameters; }
+ std::vector<ASTPointer<VariableDeclaration>> const& getParameters() const { return m_parameters; }
private:
std::vector<ASTPointer<VariableDeclaration>> m_parameters;
@@ -175,15 +175,21 @@ public:
bool isDeclaredConst() const { return m_isDeclaredConst; }
std::vector<ASTPointer<VariableDeclaration>> const& getParameters() const { return m_parameters->getParameters(); }
ParameterList& getParameterList() { return *m_parameters; }
+ std::vector<ASTPointer<VariableDeclaration>> const& getReturnParameters() const { return m_returnParameters->getParameters(); }
ASTPointer<ParameterList> const& getReturnParameterList() const { return m_returnParameters; }
Block& getBody() { return *m_body; }
+ void addLocalVariable(VariableDeclaration const& _localVariable) { m_localVariables.push_back(&_localVariable); }
+ std::vector<VariableDeclaration const*> const& getLocalVariables() const { return m_localVariables; }
+
private:
bool m_isPublic;
ASTPointer<ParameterList> m_parameters;
bool m_isDeclaredConst;
ASTPointer<ParameterList> m_returnParameters;
ASTPointer<Block> m_body;
+
+ std::vector<VariableDeclaration const*> m_localVariables;
};
/**
@@ -237,7 +243,10 @@ class ElementaryTypeName: public TypeName
{
public:
explicit ElementaryTypeName(Location const& _location, Token::Value _type):
- TypeName(_location), m_type(_type) {}
+ TypeName(_location), m_type(_type)
+ {
+ if (asserts(Token::isElementaryTypeName(_type))) BOOST_THROW_EXCEPTION(InternalCompilerError());
+ }
virtual void accept(ASTVisitor& _visitor) override;
virtual std::shared_ptr<Type> toType() override { return Type::fromElementaryTypeName(m_type); }
@@ -305,11 +314,6 @@ public:
/// This includes checking that operators are applicable to their arguments but also that
/// the number of function call arguments matches the number of formal parameters and so forth.
virtual void checkTypeRequirements() = 0;
-
-protected:
- /// Helper function, check that the inferred type for @a _expression is @a _expectedType or at
- /// least implicitly convertible to @a _expectedType. If not, throw exception.
- void expectType(Expression& _expression, Type const& _expectedType);
};
/**
@@ -342,6 +346,11 @@ public:
virtual void accept(ASTVisitor& _visitor) override;
virtual void checkTypeRequirements() override;
+ Expression& getCondition() const { return *m_condition; }
+ Statement& getTrueStatement() const { return *m_trueBody; }
+ /// @returns the "else" part of the if statement or nullptr if there is no "else" part.
+ Statement* getFalseStatement() const { return m_falseBody.get(); }
+
private:
ASTPointer<Expression> m_condition;
ASTPointer<Statement> m_trueBody;
@@ -368,6 +377,9 @@ public:
virtual void accept(ASTVisitor& _visitor) override;
virtual void checkTypeRequirements() override;
+ Expression& getCondition() const { return *m_condition; }
+ Statement& getBody() const { return *m_body; }
+
private:
ASTPointer<Expression> m_condition;
ASTPointer<Statement> m_body;
@@ -398,6 +410,13 @@ public:
virtual void checkTypeRequirements() override;
void setFunctionReturnParameters(ParameterList& _parameters) { m_returnParameters = &_parameters; }
+ ParameterList const& getFunctionReturnParameters() const
+ {
+ if (asserts(m_returnParameters))
+ BOOST_THROW_EXCEPTION(InternalCompilerError());
+ return *m_returnParameters;
+ }
+ Expression* getExpression() const { return m_expression.get(); }
private:
ASTPointer<Expression> m_expression; ///< value to return, optional
@@ -420,25 +439,29 @@ public:
virtual void accept(ASTVisitor& _visitor) override;
virtual void checkTypeRequirements() override;
+ VariableDeclaration const& getDeclaration() const { return *m_variable; }
+ Expression* getExpression() const { return m_value.get(); }
+
private:
ASTPointer<VariableDeclaration> m_variable;
ASTPointer<Expression> m_value; ///< the assigned value, can be missing
};
/**
- * An expression, i.e. something that has a value (which can also be of type "void" in case
- * of function calls).
+ * A statement that contains only an expression (i.e. an assignment, function call, ...).
*/
-class Expression: public Statement
+class ExpressionStatement: public Statement
{
public:
- Expression(Location const& _location): Statement(_location) {}
+ ExpressionStatement(Location const& _location, ASTPointer<Expression> _expression):
+ Statement(_location), m_expression(_expression) {}
+ virtual void accept(ASTVisitor& _visitor) override;
+ virtual void checkTypeRequirements() override;
- std::shared_ptr<Type const> const& getType() const { return m_type; }
+ Expression& getExpression() const { return *m_expression; }
-protected:
- /// Inferred type of the expression, only filled after a call to checkTypeRequirements().
- std::shared_ptr<Type const> m_type;
+private:
+ ASTPointer<Expression> m_expression;
};
/// @}
@@ -447,16 +470,43 @@ protected:
/// @{
/**
- * Assignment, can also be a compound assignment.
- * Examples: (a = 7 + 8) or (a *= 2)
+ * An expression, i.e. something that has a value (which can also be of type "void" in case
+ * of some function calls).
+ * @abstract
*/
+class Expression: public ASTNode
+{
+public:
+ Expression(Location const& _location): ASTNode(_location), m_isLvalue(false) {}
+ virtual void checkTypeRequirements() = 0;
+
+ std::shared_ptr<Type const> const& getType() const { return m_type; }
+ bool isLvalue() const { return m_isLvalue; }
+
+ /// Helper function, infer the type via @ref checkTypeRequirements and then check that it
+ /// is implicitly convertible to @a _expectedType. If not, throw exception.
+ void expectType(Type const& _expectedType);
+
+protected:
+ //! Inferred type of the expression, only filled after a call to checkTypeRequirements().
+ std::shared_ptr<Type const> m_type;
+ //! Whether or not this expression is an lvalue, i.e. something that can be assigned to.
+ //! This is set during calls to @a checkTypeRequirements()
+ bool m_isLvalue;
+};
+
+/// Assignment, can also be a compound assignment.
+/// Examples: (a = 7 + 8) or (a *= 2)
class Assignment: public Expression
{
public:
Assignment(Location const& _location, ASTPointer<Expression> const& _leftHandSide,
Token::Value _assignmentOperator, ASTPointer<Expression> const& _rightHandSide):
Expression(_location), m_leftHandSide(_leftHandSide),
- m_assigmentOperator(_assignmentOperator), m_rightHandSide(_rightHandSide) {}
+ m_assigmentOperator(_assignmentOperator), m_rightHandSide(_rightHandSide)
+ {
+ if (asserts(Token::isAssignmentOp(_assignmentOperator))) BOOST_THROW_EXCEPTION(InternalCompilerError());
+ }
virtual void accept(ASTVisitor& _visitor) override;
virtual void checkTypeRequirements() override;
@@ -480,7 +530,10 @@ public:
UnaryOperation(Location const& _location, Token::Value _operator,
ASTPointer<Expression> const& _subExpression, bool _isPrefix):
Expression(_location), m_operator(_operator),
- m_subExpression(_subExpression), m_isPrefix(_isPrefix) {}
+ m_subExpression(_subExpression), m_isPrefix(_isPrefix)
+ {
+ if (asserts(Token::isUnaryOp(_operator))) BOOST_THROW_EXCEPTION(InternalCompilerError());
+ }
virtual void accept(ASTVisitor& _visitor) override;
virtual void checkTypeRequirements() override;
@@ -502,7 +555,10 @@ class BinaryOperation: public Expression
public:
BinaryOperation(Location const& _location, ASTPointer<Expression> const& _left,
Token::Value _operator, ASTPointer<Expression> const& _right):
- Expression(_location), m_left(_left), m_operator(_operator), m_right(_right) {}
+ Expression(_location), m_left(_left), m_operator(_operator), m_right(_right)
+ {
+ if (asserts(Token::isBinaryOp(_operator) || Token::isCompareOp(_operator))) BOOST_THROW_EXCEPTION(InternalCompilerError());
+ }
virtual void accept(ASTVisitor& _visitor) override;
virtual void checkTypeRequirements() override;
@@ -530,6 +586,9 @@ public:
virtual void accept(ASTVisitor& _visitor) override;
virtual void checkTypeRequirements() override;
+ Expression& getExpression() const { return *m_expression; }
+ std::vector<ASTPointer<Expression>> const& getArguments() const { return m_arguments; }
+
/// Returns true if this is not an actual function call, but an explicit type conversion
/// or constructor call.
bool isTypeConversion() const;
@@ -616,7 +675,10 @@ class ElementaryTypeNameExpression: public PrimaryExpression
{
public:
ElementaryTypeNameExpression(Location const& _location, Token::Value _typeToken):
- PrimaryExpression(_location), m_typeToken(_typeToken) {}
+ PrimaryExpression(_location), m_typeToken(_typeToken)
+ {
+ if (asserts(Token::isElementaryTypeName(_typeToken))) BOOST_THROW_EXCEPTION(InternalCompilerError());
+ }
virtual void accept(ASTVisitor& _visitor) override;
virtual void checkTypeRequirements() override;