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 NameExpression;
struct ScopedStatement; struct ScopedStatement;
struct AccessExpression; struct AccessExpression;
struct ReferenceExpression;
using SubExpressionToken = std::variant< using SubExpressionToken = std::variant<
std::unique_ptr<NameExpression>, std::unique_ptr<NameExpression>,
std::unique_ptr<ScopedStatement>, std::unique_ptr<ScopedStatement>,
std::unique_ptr<AccessExpression>, std::unique_ptr<AccessExpression>,
std::unique_ptr<Literal>>; std::unique_ptr<Literal>,
std::unique_ptr<ReferenceExpression>>;
// //
struct FunctionCallExpression; struct FunctionCallExpression;
struct ArrayExpression; struct ArrayExpression;
struct ReferenceExpression;
using SubExpression = std::variant< // BiaryOperatorExpression is FunctionCallExpression using SubExpression = std::variant< // BiaryOperatorExpression is FunctionCallExpression
std::unique_ptr<FunctionCallExpression>, std::unique_ptr<FunctionCallExpression>,
std::unique_ptr<SubExpressionToken>, std::unique_ptr<SubExpressionToken>>;
std::unique_ptr<ReferenceExpression>>;
// //
enum class LoopControlExpression { enum class LoopControlExpression {
Break, Break,
@ -497,7 +497,7 @@ struct ScopedStatement {
struct ReferenceExpression { struct ReferenceExpression {
BaseNode base; BaseNode base;
std::vector<utils::ReferenceModifier> references; utils::ReferenceModifier reference;
std::unique_ptr<ScopedStatement> expression; 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) { } else if (current_node_type == parser::tokens::Literal) {
node = std::make_unique<Literal>(); node = std::make_unique<Literal>();
Visit(*std::get<std::unique_ptr<Literal>>(node)); 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 { } else {
// error // error
} }
@ -772,9 +775,6 @@ void BuildVisitor::Visit(SubExpression& node) {
} else if (current_node_type == parser::tokens::SubExpressionToken) { } else if (current_node_type == parser::tokens::SubExpressionToken) {
node = std::make_unique<SubExpressionToken>(); node = std::make_unique<SubExpressionToken>();
Visit(*std::get<std::unique_ptr<SubExpressionToken>>(node)); 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 { } else {
// error // error
} }
@ -919,16 +919,15 @@ void BuildVisitor::Visit(ReferenceExpression* node) {
size_t child_count = parse_node.ChildCount(); size_t child_count = parse_node.ChildCount();
if (child_count > 1) { if (child_count > 1) {
node->references.resize(child_count - 1); std::string reference_name = parse_node.NthChild(0).GetValue();
for (size_t i = 0; i + 1 < child_count; ++i) { if (reference_name == "^") {
std::string reference = parse_node.NthChild(i).GetValue(); node->reference = utils::ReferenceModifier::Reference;
if (reference == "^") { } else if (reference_name == "~") {
node->references[i] = utils::ReferenceModifier::Reference; node->reference = utils::ReferenceModifier::Dereference;
} else if (reference == "~") { } else if (reference_name == "@") {
node->references[i] = utils::ReferenceModifier::Dereference; node->reference = utils::ReferenceModifier::UniqueReference; // TODO: rename to move ??
} else if (reference == "@") { } else {
node->references[i] = utils::ReferenceModifier::UniqueReference; // TODO: rename to move ?? // error
}
} }
} }

View file

@ -360,7 +360,7 @@ void ExecuteVisitor::Visit(ReferenceExpression* node) {
utils::ValueType value_type = context_manager_.GetValueType(current_value_); utils::ValueType value_type = context_manager_.GetValueType(current_value_);
current_value_ = context_manager_.AddValue( 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); value_type);
} }

View file

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

View file

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

View file

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

View file

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