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 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
|
||||||
|
|
@ -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
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
|
|
||||||
|
|
@ -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_)); // ??
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue