Check assignment type
This commit is contained in:
		
							
								
								
									
										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; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user