fix const-array
This commit is contained in:
@ -68,6 +68,9 @@ struct ArrayType {
|
||||
size_t level;
|
||||
};
|
||||
inline bool operator==(const ArrayType &l, const ArrayType &r) {
|
||||
if (!r.has_base_type) {
|
||||
return l.level >= r.level;
|
||||
}
|
||||
return l.has_base_type == r.has_base_type && l.basetype == r.basetype && l.level == r.level;
|
||||
}
|
||||
using ExprTypeInfo = std::variant<IdentifierType, ArrayType>;
|
||||
@ -90,6 +93,7 @@ inline bool operator==(const ExprTypeInfo &l, const ExprTypeInfo &r) {
|
||||
return std::holds_alternative<IdentifierType>(r) && std::get<IdentifierType>(l) == std::get<IdentifierType>(r);
|
||||
}
|
||||
if (std::holds_alternative<ArrayType>(l)) {
|
||||
bool x = std::holds_alternative<ArrayType>(r);
|
||||
return std::holds_alternative<ArrayType>(r) && std::get<ArrayType>(l) == std::get<ArrayType>(r);
|
||||
}
|
||||
throw std::runtime_error("something strange happened");
|
||||
|
@ -53,6 +53,7 @@ void ASTSemanticCheckVisitor::ActuralVisit(Program_ASTNode *node) {
|
||||
void ASTSemanticCheckVisitor::ActuralVisit(EmptyStatement_ASTNode *node) {}
|
||||
|
||||
void ASTSemanticCheckVisitor::ActuralVisit(DefinitionStatement_ASTNode *node) {
|
||||
std::cerr << "visit definition statement" << std::endl;
|
||||
auto cur_scope = node->current_scope;
|
||||
for (const auto &var : node->vars) {
|
||||
std::string base_type;
|
||||
@ -535,6 +536,6 @@ void ASTSemanticCheckVisitor::ActuralVisit(ConstantExpr_ASTNode *node) {
|
||||
}
|
||||
};
|
||||
search(node, 0);
|
||||
node->expr_type_info = ArrayType{true, base_type, found_level};
|
||||
node->expr_type_info = ArrayType{found_base_type, base_type, found_level};
|
||||
}
|
||||
}
|
||||
|
@ -1025,6 +1025,7 @@ std::any Visitor::visitConstant(MXParser::ConstantContext *context) {
|
||||
}
|
||||
constant_expr->value = std::move(tmp);
|
||||
constant_expr->level = max_sub_level + 1;
|
||||
constant_expr->expr_type_info = ArrayType();
|
||||
} else {
|
||||
throw std::runtime_error("unknown constant type");
|
||||
}
|
||||
|
Reference in New Issue
Block a user