Skip to content
This repository has been archived by the owner on Jun 29, 2024. It is now read-only.

Commit

Permalink
Add resolution of BinaryCalcul
Browse files Browse the repository at this point in the history
  • Loading branch information
Gashmob committed Aug 26, 2023
1 parent fba3664 commit 56cc263
Show file tree
Hide file tree
Showing 22 changed files with 715 additions and 176 deletions.
89 changes: 47 additions & 42 deletions src/lib/ast/AST.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,9 @@ namespace filc::ast {

[[nodiscard]] auto getExpressionType() const -> AbstractType *;

virtual auto
resolveType(filc::environment::Environment *environment, filc::message::MessageCollector *collector) -> void;
virtual auto resolveType(filc::environment::Environment *environment,
filc::message::MessageCollector *collector,
AbstractType *preferred_type = nullptr) -> void;

private:
bool _exported{false};
Expand All @@ -104,7 +105,8 @@ namespace filc::ast {
[[nodiscard]] auto getName() const -> const std::string &;

auto resolveType(filc::environment::Environment *environment,
filc::message::MessageCollector *collector) -> void override;
filc::message::MessageCollector *collector,
AbstractType *preferred_type) -> void override;

private:
std::string _name;
Expand All @@ -128,32 +130,32 @@ namespace filc::ast {
public:
explicit BooleanLiteral(bool value);

auto resolveType(filc::environment::Environment *environment,
filc::message::MessageCollector *collector) -> void override;
auto resolveType(filc::environment::Environment *environment, filc::message::MessageCollector *collector,
AbstractType *preferred_type) -> void override;
};

class IntegerLiteral : public AbstractLiteral<int> {
public:
explicit IntegerLiteral(int value);

auto resolveType(filc::environment::Environment *environment,
filc::message::MessageCollector *collector) -> void override;
auto resolveType(filc::environment::Environment *environment, filc::message::MessageCollector *collector,
AbstractType *preferred_type) -> void override;
};

class FloatLiteral : public AbstractLiteral<double> {
public:
explicit FloatLiteral(double value);

auto resolveType(filc::environment::Environment *environment,
filc::message::MessageCollector *collector) -> void override;
auto resolveType(filc::environment::Environment *environment, filc::message::MessageCollector *collector,
AbstractType *preferred_type) -> void override;
};

class CharacterLiteral : public AbstractLiteral<char> {
public:
explicit CharacterLiteral(char value);

auto resolveType(filc::environment::Environment *environment,
filc::message::MessageCollector *collector) -> void override;
auto resolveType(filc::environment::Environment *environment, filc::message::MessageCollector *collector,
AbstractType *preferred_type) -> void override;

static auto stringToChar(const std::string &snippet, antlr4::Token *token = nullptr) -> char;
};
Expand All @@ -162,8 +164,8 @@ namespace filc::ast {
public:
explicit StringLiteral(const std::string &value);

auto resolveType(filc::environment::Environment *environment,
filc::message::MessageCollector *collector) -> void override;
auto resolveType(filc::environment::Environment *environment, filc::message::MessageCollector *collector,
AbstractType *preferred_type) -> void override;
};

class VariableDeclaration : public AbstractExpression {
Expand All @@ -182,8 +184,8 @@ namespace filc::ast {

auto setAssignation(AbstractExpression *assignation) -> void;

auto resolveType(filc::environment::Environment *environment,
filc::message::MessageCollector *collector) -> void override;
auto resolveType(filc::environment::Environment *environment, filc::message::MessageCollector *collector,
AbstractType *preferred_type) -> void override;

private:
bool _constant;
Expand Down Expand Up @@ -244,7 +246,7 @@ namespace filc::ast {

[[nodiscard]] auto dump() const -> std::string override;

auto equals(const AbstractType &other) const -> bool override;
[[nodiscard]] auto equals(const AbstractType &other) const -> bool override;

private:
AbstractType *_inner_type;
Expand All @@ -261,7 +263,7 @@ namespace filc::ast {

[[nodiscard]] auto dump() const -> std::string override;

auto equals(const AbstractType &other) const -> bool override;
[[nodiscard]] auto equals(const AbstractType &other) const -> bool override;

private:
AbstractType *_inner_type;
Expand All @@ -284,7 +286,7 @@ namespace filc::ast {

[[nodiscard]] auto getCalledOn() const -> AbstractType *;

auto equals(const AbstractType &other) const -> bool override;
[[nodiscard]] auto equals(const AbstractType &other) const -> bool override;

private:
std::vector<AbstractType *> _argument_types;
Expand All @@ -311,16 +313,16 @@ namespace filc::ast {
public:
PreUnaryCalcul(Identifier *variable, Operator *p_operator);

auto resolveType(filc::environment::Environment *environment,
filc::message::MessageCollector *collector) -> void override;
auto resolveType(filc::environment::Environment *environment, filc::message::MessageCollector *collector,
AbstractType *preferred_type) -> void override;
};

class PostUnaryCalcul : public UnaryCalcul {
public:
PostUnaryCalcul(Identifier *variable, Operator *p_operator);

auto resolveType(filc::environment::Environment *environment,
filc::message::MessageCollector *collector) -> void override;
auto resolveType(filc::environment::Environment *environment, filc::message::MessageCollector *collector,
AbstractType *preferred_type) -> void override;
};

class BinaryCalcul : public AbstractExpression {
Expand All @@ -335,6 +337,9 @@ namespace filc::ast {

[[nodiscard]] auto getOperator() const -> Operator *;

auto resolveType(filc::environment::Environment *environment, filc::message::MessageCollector *collector,
AbstractType *preferred_type) -> void override;

private:
AbstractExpression *_left_expression;
AbstractExpression *_right_expression;
Expand All @@ -355,13 +360,13 @@ namespace filc::ast {

[[nodiscard]] virtual auto dump() const -> std::string = 0;

[[nodiscard]] virtual auto dumpPreLambdaType(filc::ast::AbstractType *return_type,
filc::ast::AbstractType *called_on,
[[nodiscard]] virtual auto dumpPreLambdaType(AbstractType *return_type,
AbstractType *called_on,
filc::environment::Environment *environment,
filc::message::MessageCollector *collector) const -> LambdaType * = 0;

[[nodiscard]] virtual auto dumpPostLambdaType(filc::ast::AbstractType *return_type,
filc::ast::AbstractType *called_on,
[[nodiscard]] virtual auto dumpPostLambdaType(AbstractType *return_type,
AbstractType *called_on,
filc::environment::Environment *environment,
filc::message::MessageCollector *collector) const -> LambdaType * = 0;

Expand Down Expand Up @@ -399,13 +404,13 @@ namespace filc::ast {

[[nodiscard]] auto dump() const -> std::string override;

[[nodiscard]] auto dumpPreLambdaType(filc::ast::AbstractType *return_type,
filc::ast::AbstractType *called_on,
[[nodiscard]] auto dumpPreLambdaType(AbstractType *return_type,
AbstractType *called_on,
filc::environment::Environment *environment,
filc::message::MessageCollector *collector) const -> LambdaType * override;

[[nodiscard]] auto dumpPostLambdaType(filc::ast::AbstractType *return_type,
filc::ast::AbstractType *called_on,
[[nodiscard]] auto dumpPostLambdaType(AbstractType *return_type,
AbstractType *called_on,
filc::environment::Environment *environment,
filc::message::MessageCollector *collector) const -> LambdaType * override;

Expand All @@ -423,13 +428,13 @@ namespace filc::ast {

[[nodiscard]] auto dump() const -> std::string override;

[[nodiscard]] auto dumpPreLambdaType(filc::ast::AbstractType *return_type,
filc::ast::AbstractType *called_on,
[[nodiscard]] auto dumpPreLambdaType(AbstractType *return_type,
AbstractType *called_on,
filc::environment::Environment *environment,
filc::message::MessageCollector *collector) const -> LambdaType * override;

[[nodiscard]] auto dumpPostLambdaType(filc::ast::AbstractType *return_type,
filc::ast::AbstractType *called_on,
[[nodiscard]] auto dumpPostLambdaType(AbstractType *return_type,
AbstractType *called_on,
filc::environment::Environment *environment,
filc::message::MessageCollector *collector) const -> LambdaType * override;

Expand All @@ -447,13 +452,13 @@ namespace filc::ast {

[[nodiscard]] auto dump() const -> std::string override;

[[nodiscard]] auto dumpPreLambdaType(filc::ast::AbstractType *return_type,
filc::ast::AbstractType *called_on,
[[nodiscard]] auto dumpPreLambdaType(AbstractType *return_type,
AbstractType *called_on,
filc::environment::Environment *environment,
filc::message::MessageCollector *collector) const -> LambdaType * override;

[[nodiscard]] auto dumpPostLambdaType(filc::ast::AbstractType *return_type,
filc::ast::AbstractType *called_on,
[[nodiscard]] auto dumpPostLambdaType(AbstractType *return_type,
AbstractType *called_on,
filc::environment::Environment *environment,
filc::message::MessageCollector *collector) const -> LambdaType * override;

Expand All @@ -471,13 +476,13 @@ namespace filc::ast {

[[nodiscard]] auto dump() const -> std::string override;

[[nodiscard]] auto dumpPreLambdaType(filc::ast::AbstractType *return_type,
filc::ast::AbstractType *called_on,
[[nodiscard]] auto dumpPreLambdaType(AbstractType *return_type,
AbstractType *called_on,
filc::environment::Environment *environment,
filc::message::MessageCollector *collector) const -> LambdaType * override;

[[nodiscard]] auto dumpPostLambdaType(filc::ast::AbstractType *return_type,
filc::ast::AbstractType *called_on,
[[nodiscard]] auto dumpPostLambdaType(AbstractType *return_type,
AbstractType *called_on,
filc::environment::Environment *environment,
filc::message::MessageCollector *collector) const -> LambdaType * override;

Expand Down
4 changes: 3 additions & 1 deletion src/lib/ast/AbstractExpression.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,9 @@ namespace filc::ast {
_expression_type = expression_type;
}

auto AbstractExpression::resolveType(filc::environment::Environment *environment, filc::message::MessageCollector *collector) -> void {
auto AbstractExpression::resolveType(filc::environment::Environment *environment,
filc::message::MessageCollector *collector,
AbstractType *preferred_type) -> void {
throw std::logic_error("Not implemented");
}
}
8 changes: 4 additions & 4 deletions src/lib/ast/ArrayOperator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,15 @@ namespace filc::ast {
return "[]";
}

auto ArrayOperator::dumpPreLambdaType(filc::ast::AbstractType *return_type,
filc::ast::AbstractType *called_on,
auto ArrayOperator::dumpPreLambdaType(AbstractType *return_type,
AbstractType *called_on,
filc::environment::Environment *environment,
filc::message::MessageCollector *collector) const -> LambdaType * {
throw std::logic_error("Should not be called");
}

auto ArrayOperator::dumpPostLambdaType(filc::ast::AbstractType *return_type,
filc::ast::AbstractType *called_on,
auto ArrayOperator::dumpPostLambdaType(AbstractType *return_type,
AbstractType *called_on,
filc::environment::Environment *environment,
filc::message::MessageCollector *collector) const -> LambdaType * {
_expression->resolveType(environment, collector);
Expand Down
8 changes: 4 additions & 4 deletions src/lib/ast/AssignationOperator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,15 @@ namespace filc::ast {
return _inner_operator->dump() + "=";
}

auto AssignationOperator::dumpPreLambdaType(filc::ast::AbstractType *return_type,
filc::ast::AbstractType *called_on,
auto AssignationOperator::dumpPreLambdaType(AbstractType *return_type,
AbstractType *called_on,
filc::environment::Environment *environment,
filc::message::MessageCollector *collector) const -> LambdaType * {
throw std::logic_error("Should not be called");
}

auto AssignationOperator::dumpPostLambdaType(filc::ast::AbstractType *return_type,
filc::ast::AbstractType *called_on,
auto AssignationOperator::dumpPostLambdaType(AbstractType *return_type,
AbstractType *called_on,
filc::environment::Environment *environment,
filc::message::MessageCollector *collector) const -> LambdaType * {
throw std::logic_error("Should not be called");
Expand Down
31 changes: 31 additions & 0 deletions src/lib/ast/BinaryCalcul.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
* SOFTWARE.
*/
#include "AST.h"
#include "Error.h"

namespace filc::ast {
BinaryCalcul::BinaryCalcul(filc::ast::AbstractExpression *left_expression, filc::ast::Operator *p_operator,
Expand All @@ -45,4 +46,34 @@ namespace filc::ast {
delete _operator;
delete _right_expression;
}

auto BinaryCalcul::resolveType(filc::environment::Environment *environment,
filc::message::MessageCollector *collector,
AbstractType *preferred_type) -> void {
_left_expression->resolveType(environment, collector);
auto *left_type = _left_expression->getExpressionType();
_right_expression->resolveType(environment, collector);
auto *right_type = _right_expression->getExpressionType();
if (left_type == nullptr || right_type == nullptr) {
return;
}

auto operator_name = "operator" + _operator->dump();
auto has_found_preferred = preferred_type != nullptr &&
environment->hasName(operator_name, new LambdaType({left_type, right_type},
preferred_type, left_type));
auto has_found_left = environment->hasName(operator_name, new LambdaType({left_type, right_type},
left_type, left_type));
if ((preferred_type != nullptr && (!has_found_preferred || !has_found_left)) || !has_found_left) {
collector->addError(
new filc::message::Error(filc::message::ERROR,
"There is no operator " + getOperator()->dump() +
" for types " + left_type->dump() + " and " + right_type->dump(),
getPosition())
);
return;
}

setExpressionType(has_found_preferred ? preferred_type : left_type);
}
}
3 changes: 2 additions & 1 deletion src/lib/ast/BooleanLiteral.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ namespace filc::ast {
: AbstractLiteral<bool>(value) {}

auto BooleanLiteral::resolveType(filc::environment::Environment *environment,
filc::message::MessageCollector *collector) -> void {
filc::message::MessageCollector *collector,
AbstractType *preferred_type) -> void {
if (!environment->hasType("bool")) {
environment->addType(new filc::ast::Type(new filc::ast::Identifier("bool")));
}
Expand Down
3 changes: 2 additions & 1 deletion src/lib/ast/CharacterLiteral.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ namespace filc::ast {
}

auto CharacterLiteral::resolveType(filc::environment::Environment *environment,
filc::message::MessageCollector *collector) -> void {
filc::message::MessageCollector *collector,
AbstractType *preferred_type) -> void {
if (!environment->hasType("char")) {
environment->addType(new filc::ast::Type(new filc::ast::Identifier("char")));
}
Expand Down
8 changes: 4 additions & 4 deletions src/lib/ast/ClassicOperator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,15 +76,15 @@ namespace filc::ast {
throw std::logic_error("Should not come here");
}

auto ClassicOperator::dumpPreLambdaType(filc::ast::AbstractType *return_type,
filc::ast::AbstractType *called_on,
auto ClassicOperator::dumpPreLambdaType(AbstractType *return_type,
AbstractType *called_on,
filc::environment::Environment *environment,
filc::message::MessageCollector *collector) const -> LambdaType * {
return new LambdaType({}, return_type, called_on);
}

auto ClassicOperator::dumpPostLambdaType(filc::ast::AbstractType *return_type,
filc::ast::AbstractType *called_on,
auto ClassicOperator::dumpPostLambdaType(AbstractType *return_type,
AbstractType *called_on,
filc::environment::Environment *environment,
filc::message::MessageCollector *collector) const -> LambdaType * {
if (!environment->hasType("void")) {
Expand Down
Loading

0 comments on commit 56cc263

Please sign in to comment.