reference fixes, fizes

This commit is contained in:
ProgramSnail 2023-05-21 10:57:08 +03:00
parent 8a84cfff70
commit a9d4d3a104
8 changed files with 43 additions and 48 deletions

View file

@ -122,19 +122,19 @@ using Literal = std::variant<
struct NameExpression;
struct ScopedStatement;
struct AccessExpression;
struct ReferenceExpression;
using SubExpressionToken = std::variant<
std::unique_ptr<NameExpression>,
std::unique_ptr<ScopedStatement>,
std::unique_ptr<AccessExpression>,
std::unique_ptr<Literal>>;
std::unique_ptr<Literal>,
std::unique_ptr<ReferenceExpression>>;
//
struct FunctionCallExpression;
struct ArrayExpression;
struct ReferenceExpression;
using SubExpression = std::variant< // BiaryOperatorExpression is FunctionCallExpression
std::unique_ptr<FunctionCallExpression>,
std::unique_ptr<SubExpressionToken>,
std::unique_ptr<ReferenceExpression>>;
std::unique_ptr<SubExpressionToken>>;
//
enum class LoopControlExpression {
Break,
@ -497,7 +497,7 @@ struct ScopedStatement {
struct ReferenceExpression {
BaseNode base;
std::vector<utils::ReferenceModifier> references;
utils::ReferenceModifier reference;
std::unique_ptr<ScopedStatement> expression;
};

@ -1 +1 @@
Subproject commit ed339526706e0e9289a112fa2cec6ecfdcb362ab
Subproject commit ad07e6d8fb84b902aea295baf0c1c2faccdce849

View file

@ -749,6 +749,9 @@ void BuildVisitor::Visit(SubExpressionToken& node) {
} else if (current_node_type == parser::tokens::Literal) {
node = std::make_unique<Literal>();
Visit(*std::get<std::unique_ptr<Literal>>(node));
} else if (current_node_type == parser::tokens::ReferenceExpression) {
node = std::make_unique<ReferenceExpression>();
Visit(std::get<std::unique_ptr<ReferenceExpression>>(node).get());
} else {
// error
}
@ -772,9 +775,6 @@ void BuildVisitor::Visit(SubExpression& node) {
} else if (current_node_type == parser::tokens::SubExpressionToken) {
node = std::make_unique<SubExpressionToken>();
Visit(*std::get<std::unique_ptr<SubExpressionToken>>(node));
} else if (current_node_type == parser::tokens::ReferenceExpression) {
node = std::make_unique<ReferenceExpression>();
Visit(std::get<std::unique_ptr<ReferenceExpression>>(node).get());
} else {
// error
}
@ -919,16 +919,15 @@ void BuildVisitor::Visit(ReferenceExpression* node) {
size_t child_count = parse_node.ChildCount();
if (child_count > 1) {
node->references.resize(child_count - 1);
for (size_t i = 0; i + 1 < child_count; ++i) {
std::string reference = parse_node.NthChild(i).GetValue();
if (reference == "^") {
node->references[i] = utils::ReferenceModifier::Reference;
} else if (reference == "~") {
node->references[i] = utils::ReferenceModifier::Dereference;
} else if (reference == "@") {
node->references[i] = utils::ReferenceModifier::UniqueReference; // TODO: rename to move ??
}
std::string reference_name = parse_node.NthChild(0).GetValue();
if (reference_name == "^") {
node->reference = utils::ReferenceModifier::Reference;
} else if (reference_name == "~") {
node->reference = utils::ReferenceModifier::Dereference;
} else if (reference_name == "@") {
node->reference = utils::ReferenceModifier::UniqueReference; // TODO: rename to move ??
} else {
// error
}
}

View file

@ -360,7 +360,7 @@ void ExecuteVisitor::Visit(ReferenceExpression* node) {
utils::ValueType value_type = context_manager_.GetValueType(current_value_);
current_value_ = context_manager_.AddValue(
info::value::ReferenceToValue(node->references, current_value_, context_manager_.GetValueManager()),
info::value::ReferenceToValue({node->reference}, current_value_, context_manager_.GetValueManager()),
value_type);
}

View file

@ -386,18 +386,16 @@ void PrintVisitor::Visit(LoopControlExpression& node) { // enum
void PrintVisitor::Visit(ReferenceExpression* node) {
out_ << "[ReferenceExpression ";
for (auto& reference : node->references) {
switch (reference) {
case utils::ReferenceModifier::Reference:
out_ << '^';
break;
case utils::ReferenceModifier::UniqueReference:
out_ << '@';
break;
case utils::ReferenceModifier::Dereference:
out_ << '~';
break;
}
switch (node->reference) {
case utils::ReferenceModifier::Reference:
out_ << '^';
break;
case utils::ReferenceModifier::UniqueReference:
out_ << '@';
break;
case utils::ReferenceModifier::Dereference:
out_ << '~';
break;
}
out_ << "] (";
Visit(node->expression.get());

View file

@ -718,7 +718,7 @@ void TypeCheckVisitor::Visit(ReferenceExpression* node) {
Visit(node->expression.get());
current_type_ = context_manager_.AddValue(
info::type::ReferenceToType(node->references,
info::type::ReferenceToType({node->reference},
current_type_,
context_manager_.GetValueManager()),
context_manager_.GetValueType(current_type_)); // ??

View file

@ -545,18 +545,16 @@ void TypedPrintVisitor::Visit(ReferenceExpression* node) {
}
out_ << ") ";
for (auto& reference : node->references) {
switch (reference) {
case utils::ReferenceModifier::Reference:
out_ << '^';
break;
case utils::ReferenceModifier::UniqueReference:
out_ << '@';
break;
case utils::ReferenceModifier::Dereference:
out_ << '~';
break;
}
switch (node->reference) {
case utils::ReferenceModifier::Reference:
out_ << '^';
break;
case utils::ReferenceModifier::UniqueReference:
out_ << '@';
break;
case utils::ReferenceModifier::Dereference:
out_ << '~';
break;
}
out_ << "] (";
Visit(node->expression.get());

View file

@ -134,6 +134,9 @@ void Visitor::Visit(SubExpressionToken& node) {
case 3:
Visit(*std::get<std::unique_ptr<Literal>>(node));
break;
case 4:
Visit(std::get<std::unique_ptr<ReferenceExpression>>(node).get());
break;
default:
// error
break;
@ -148,9 +151,6 @@ void Visitor::Visit(SubExpression& node) {
case 1:
Visit(*std::get<std::unique_ptr<SubExpressionToken>>(node));
break;
case 2:
Visit(std::get<std::unique_ptr<ReferenceExpression>>(node).get());
break;
default:
// error
break;