Check assignment type
This commit is contained in:
parent
4dbc5aca0d
commit
0dbbd3f403
3
TODO
3
TODO
@ -3,7 +3,6 @@
|
|||||||
- Catch exceptions thrown by the argument parser and print them normally.
|
- Catch exceptions thrown by the argument parser and print them normally.
|
||||||
- Structs or records.
|
- Structs or records.
|
||||||
- Unions.
|
- Unions.
|
||||||
- Type checking.
|
|
||||||
- Support immediates greater than 12 bits.
|
- Support immediates greater than 12 bits.
|
||||||
- It seems instructions are correctly encoded only if the compiler is running
|
- It seems instructions are correctly encoded only if the compiler is running
|
||||||
on a little endian architecture.
|
on a little endian architecture.
|
||||||
@ -13,5 +12,3 @@
|
|||||||
- Error message with an empty file wrongly says that a ")" is expected.
|
- Error message with an empty file wrongly says that a ")" is expected.
|
||||||
- Support any expressions for constants.
|
- Support any expressions for constants.
|
||||||
- Name analysis should fail if there are undefined symbols.
|
- Name analysis should fail if there are undefined symbols.
|
||||||
- type_mismatch error should get second type argument for the
|
|
||||||
expected type.
|
|
||||||
|
@ -137,7 +137,8 @@ namespace elna::source
|
|||||||
argument,
|
argument,
|
||||||
arithmetic,
|
arithmetic,
|
||||||
comparison,
|
comparison,
|
||||||
condition
|
condition,
|
||||||
|
assignment
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -88,5 +88,6 @@ namespace elna::source
|
|||||||
void visit(constant_definition *definition) override;
|
void visit(constant_definition *definition) override;
|
||||||
void visit(while_statement *statement) override;
|
void visit(while_statement *statement) override;
|
||||||
void visit(if_statement *statement) override;
|
void visit(if_statement *statement) override;
|
||||||
|
void visit(assign_statement *statement) override;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -305,6 +305,19 @@ namespace elna::source
|
|||||||
statement->body().accept(this);
|
statement->body().accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void type_analysis_visitor::visit(assign_statement *statement)
|
||||||
|
{
|
||||||
|
statement->rvalue().accept(this);
|
||||||
|
auto lvalue_info = std::dynamic_pointer_cast<typed_info>(this->table->lookup(statement->lvalue()));
|
||||||
|
|
||||||
|
if (statement->rvalue().data_type != nullptr && lvalue_info->type() == statement->rvalue().data_type)
|
||||||
|
{
|
||||||
|
auto new_error = std::make_unique<type_mismatch>(statement->rvalue().data_type,
|
||||||
|
type_mismatch::operation::assignment, this->filename, statement->position());
|
||||||
|
m_errors.push_back(std::move(new_error));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const std::list<std::unique_ptr<error>>& type_analysis_visitor::errors() const noexcept
|
const std::list<std::unique_ptr<error>>& type_analysis_visitor::errors() const noexcept
|
||||||
{
|
{
|
||||||
return m_errors;
|
return m_errors;
|
||||||
|
Loading…
Reference in New Issue
Block a user