mirror of
https://codeberg.org/ProgramSnail/lang_2023.git
synced 2025-12-05 22:48:42 +00:00
reference fixes, fizes
This commit is contained in:
parent
8a84cfff70
commit
a9d4d3a104
8 changed files with 43 additions and 48 deletions
|
|
@ -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
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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_)); // ??
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue