mirror of
https://codeberg.org/ProgramSnail/lang.git
synced 2026-01-25 13:07:13 +00:00
expression builders: func -> task
This commit is contained in:
parent
49d9a95fd9
commit
f5856734c6
4 changed files with 364 additions and 343 deletions
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
namespace builders {
|
namespace builders {
|
||||||
|
|
||||||
using Code = parser::ParseTree;
|
// using Code = parser::ParseTree;
|
||||||
using Exprs = nodes::ExpressionStorage;
|
using Exprs = nodes::ExpressionStorage;
|
||||||
using Types = nodes::TypeStorage;
|
using Types = nodes::TypeStorage;
|
||||||
using Names = names::NameTree;
|
using Names = names::NameTree;
|
||||||
|
|
@ -18,29 +18,19 @@ using Node = nodes::Node_<nodes::NodePart<utils::Pos>>; // TODO
|
||||||
template <typename N>
|
template <typename N>
|
||||||
using Task = utils::Task<Executor, N, utils::None, parser::ParseTree::Node>;
|
using Task = utils::Task<Executor, N, utils::None, parser::ParseTree::Node>;
|
||||||
|
|
||||||
template <typename N> struct BuilderTask {
|
template <typename N, typename Tag = utils::None> struct BuilderTask {
|
||||||
static_assert(false);
|
static_assert(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename N> struct BuilderTaskBase : public Task<N> {
|
template <typename N> struct BuilderTaskBase : public Task<N> {
|
||||||
using Task<N>::Task;
|
using Task<N>::Task;
|
||||||
|
|
||||||
template <typename OtherN>
|
template <typename OtherN, typename OtherTag = utils::None>
|
||||||
OtherN Run(const parser::ParseTree::Node &node,
|
OtherN Run(const parser::ParseTree::Node &node,
|
||||||
const utils::None &args = {}) {
|
const utils::None &args = {}) {
|
||||||
BuilderTask<OtherN> task(this->executor);
|
BuilderTask<OtherN, OtherTag> task(this->executor);
|
||||||
return task(node, args);
|
return task(node, args);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO
|
|
||||||
// template <>
|
|
||||||
// struct BuilderTask<nodes::ExpressionProxy>
|
|
||||||
// : public BuilderTaskBase<nodes::ExpressionProxy> {
|
|
||||||
// using BuilderTaskBase<nodes::ExpressionProxy>::BuilderTaskBase;
|
|
||||||
|
|
||||||
// nodes::ExpressionProxy operator()(const parser::ParseTree::Node &expr,
|
|
||||||
// const utils::None &args) override;
|
|
||||||
// };
|
|
||||||
|
|
||||||
} // namespace builders
|
} // namespace builders
|
||||||
|
|
|
||||||
|
|
@ -1,94 +1,238 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "basic_builders.hpp"
|
||||||
|
#include "builders_utils.hpp"
|
||||||
#include "expression_nodes.hpp"
|
#include "expression_nodes.hpp"
|
||||||
#include "tree_sitter_wrapper.hpp"
|
#include "tree_sitter_wrapper.hpp"
|
||||||
|
|
||||||
|
namespace utils {
|
||||||
|
|
||||||
|
struct CommaTag {};
|
||||||
|
struct OperatorTag {};
|
||||||
|
struct BlockTag {};
|
||||||
|
struct ArrayTag {};
|
||||||
|
struct ArrayAccessTag {};
|
||||||
|
struct TupleAccessTag {};
|
||||||
|
struct RefTag {};
|
||||||
|
struct SuffixTag {};
|
||||||
|
struct FuncCallTag {};
|
||||||
|
|
||||||
|
} // namespace utils
|
||||||
|
|
||||||
namespace builders {
|
namespace builders {
|
||||||
|
|
||||||
// --- flow control
|
// --- flow control
|
||||||
|
|
||||||
nodes::ExpressionProxy
|
template <>
|
||||||
build_expression(parser::ParseTree::Node parser_node,
|
struct BuilderTask<nodes::ExpressionProxy>
|
||||||
nodes::ExpressionStorage &expression_storage,
|
: public BuilderTaskBase<nodes::ExpressionProxy> {
|
||||||
nodes::TypeStorage &type_storage);
|
using BuilderTaskBase<nodes::ExpressionProxy>::BuilderTaskBase;
|
||||||
|
|
||||||
nodes::Match build_match(parser::ParseTree::Node parser_node,
|
nodes::ExpressionProxy operator()(const parser::ParseTree::Node &parser_node,
|
||||||
nodes::ExpressionStorage &expression_storage,
|
const utils::None &args) override;
|
||||||
nodes::TypeStorage &type_storage);
|
};
|
||||||
|
|
||||||
nodes::Condition build_condition(parser::ParseTree::Node parser_node,
|
template <>
|
||||||
nodes::ExpressionStorage &expression_storage,
|
struct BuilderTask<nodes::Match::Case>
|
||||||
nodes::TypeStorage &type_storage);
|
: public BuilderTaskBase<nodes::Match::Case> {
|
||||||
|
using BuilderTaskBase<nodes::Match::Case>::BuilderTaskBase;
|
||||||
|
|
||||||
nodes::Loop build_loop(parser::ParseTree::Node parser_node,
|
nodes::Match::Case operator()(const parser::ParseTree::Node &parser_node,
|
||||||
nodes::ExpressionStorage &expression_storage,
|
const utils::None &args) override;
|
||||||
nodes::TypeStorage &type_storage);
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct BuilderTask<nodes::Match> : public BuilderTaskBase<nodes::Match> {
|
||||||
|
using BuilderTaskBase<nodes::Match>::BuilderTaskBase;
|
||||||
|
|
||||||
|
nodes::Match operator()(const parser::ParseTree::Node &parser_node,
|
||||||
|
const utils::None &args) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct BuilderTask<nodes::Condition>
|
||||||
|
: public BuilderTaskBase<nodes::Condition> {
|
||||||
|
using BuilderTaskBase<nodes::Condition>::BuilderTaskBase;
|
||||||
|
|
||||||
|
nodes::Condition operator()(const parser::ParseTree::Node &parser_node,
|
||||||
|
const utils::None &args) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct BuilderTask<nodes::Loop> : public BuilderTaskBase<nodes::Loop> {
|
||||||
|
using BuilderTaskBase<nodes::Loop>::BuilderTaskBase;
|
||||||
|
|
||||||
|
nodes::Loop operator()(const parser::ParseTree::Node &parser_node,
|
||||||
|
const utils::None &args) override;
|
||||||
|
};
|
||||||
|
|
||||||
// --- operators
|
// --- operators
|
||||||
|
|
||||||
nodes::NameExpression
|
template <>
|
||||||
build_comma_expression(parser::ParseTree::Node parser_node,
|
struct BuilderTask<nodes::NameExpression, utils::CommaTag>
|
||||||
nodes::ExpressionStorage &expression_storage,
|
: public BuilderTaskBase<nodes::NameExpression> {
|
||||||
nodes::TypeStorage &type_storage);
|
using BuilderTaskBase<nodes::NameExpression>::BuilderTaskBase;
|
||||||
|
|
||||||
nodes::NameExpression
|
nodes::NameExpression operator()(const parser::ParseTree::Node &parser_node,
|
||||||
build_operator_expression(parser::ParseTree::Node parser_node,
|
const utils::None &args) override;
|
||||||
nodes::ExpressionStorage &expression_storage,
|
};
|
||||||
nodes::TypeStorage &type_storage);
|
|
||||||
|
template <>
|
||||||
|
struct BuilderTask<nodes::NameExpression, utils::OperatorTag>
|
||||||
|
: public BuilderTaskBase<nodes::NameExpression> {
|
||||||
|
using BuilderTaskBase<nodes::NameExpression>::BuilderTaskBase;
|
||||||
|
|
||||||
|
nodes::NameExpression operator()(const parser::ParseTree::Node &parser_node,
|
||||||
|
const utils::None &args) override;
|
||||||
|
};
|
||||||
|
|
||||||
// --- continers
|
// --- continers
|
||||||
|
|
||||||
nodes::Container build_block(parser::ParseTree::Node parser_node,
|
template <typename T>
|
||||||
nodes::ExpressionStorage &expression_storage,
|
requires std::is_same_v<T, utils::BlockTag> or
|
||||||
nodes::TypeStorage &type_storage);
|
std::is_same_v<T, utils::ArrayTag>
|
||||||
|
struct BuilderTask<nodes::Container, T>
|
||||||
|
: public BuilderTaskBase<nodes::Container> {
|
||||||
|
using BuilderTaskBase<nodes::Container>::BuilderTaskBase;
|
||||||
|
|
||||||
nodes::Container build_array(parser::ParseTree::Node parser_node,
|
// '{' (expression ';')* '}'
|
||||||
nodes::ExpressionStorage &expression_storage,
|
// or
|
||||||
nodes::TypeStorage &type_storage);
|
// '[[' expression+ ']]'
|
||||||
|
nodes::Container operator()(const parser::ParseTree::Node &parser_node,
|
||||||
|
const utils::None &) override {
|
||||||
|
const auto container_type = std::is_same_v<T, utils::BlockTag>
|
||||||
|
? nodes::Container::BLOCK
|
||||||
|
: nodes::Container::ARRAY;
|
||||||
|
|
||||||
|
std::vector<nodes::ExpressionProxy> expressions;
|
||||||
|
|
||||||
|
auto current_node = parser_node.nth_named_child(0);
|
||||||
|
|
||||||
|
while (!current_node.is_null()) {
|
||||||
|
expressions.push_back(Run<nodes::ExpressionProxy>(current_node));
|
||||||
|
current_node = current_node.next_named_sibling();
|
||||||
|
}
|
||||||
|
|
||||||
|
return nodes::Container(build_node(parser_node), container_type,
|
||||||
|
std::move(expressions));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// --- modifiers
|
// --- modifiers
|
||||||
|
|
||||||
nodes::Return build_return(parser::ParseTree::Node parser_node,
|
template <>
|
||||||
nodes::ExpressionStorage &expression_storage,
|
struct BuilderTask<nodes::Return> : public BuilderTaskBase<nodes::Return> {
|
||||||
nodes::TypeStorage &type_storage);
|
using BuilderTaskBase<nodes::Return>::BuilderTaskBase;
|
||||||
|
|
||||||
nodes::NameDefinition
|
nodes::Return operator()(const parser::ParseTree::Node &parser_node,
|
||||||
build_name_definition(parser::ParseTree::Node parser_node);
|
const utils::None &args) override;
|
||||||
|
};
|
||||||
|
|
||||||
nodes::Access build_array_access(parser::ParseTree::Node parser_node,
|
template <>
|
||||||
nodes::ExpressionStorage &expression_storage,
|
struct BuilderTask<nodes::NameDefinition>
|
||||||
nodes::TypeStorage &type_storage);
|
: public BuilderTaskBase<nodes::NameDefinition> {
|
||||||
|
using BuilderTaskBase<nodes::NameDefinition>::BuilderTaskBase;
|
||||||
|
|
||||||
nodes::Access build_tuple_access(parser::ParseTree::Node parser_node,
|
nodes::NameDefinition operator()(const parser::ParseTree::Node &parser_node,
|
||||||
nodes::ExpressionStorage &expression_storage,
|
const utils::None &args) override;
|
||||||
nodes::TypeStorage &type_storage);
|
};
|
||||||
|
|
||||||
nodes::LoopControl build_loop_control(parser::ParseTree::Node parser_node);
|
template <>
|
||||||
|
struct BuilderTask<nodes::Access, utils::ArrayAccessTag>
|
||||||
|
: public BuilderTaskBase<nodes::Access> {
|
||||||
|
using BuilderTaskBase<nodes::Access>::BuilderTaskBase;
|
||||||
|
|
||||||
nodes::ModifierExpression
|
nodes::Access operator()(const parser::ParseTree::Node &parser_node,
|
||||||
build_reference_expression(parser::ParseTree::Node parser_node,
|
const utils::None &args) override;
|
||||||
nodes::ExpressionStorage &expression_storage,
|
};
|
||||||
nodes::TypeStorage &type_storage);
|
|
||||||
|
|
||||||
nodes::ModifierExpression
|
template <>
|
||||||
build_suffix_expression(parser::ParseTree::Node parser_node,
|
struct BuilderTask<nodes::Access, utils::TupleAccessTag>
|
||||||
nodes::ExpressionStorage &expression_storage,
|
: public BuilderTaskBase<nodes::Access> {
|
||||||
nodes::TypeStorage &type_storage);
|
using BuilderTaskBase<nodes::Access>::BuilderTaskBase;
|
||||||
|
|
||||||
|
nodes::Access operator()(const parser::ParseTree::Node &parser_node,
|
||||||
|
const utils::None &args) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct BuilderTask<nodes::LoopControl>
|
||||||
|
: public BuilderTaskBase<nodes::LoopControl> {
|
||||||
|
using BuilderTaskBase<nodes::LoopControl>::BuilderTaskBase;
|
||||||
|
|
||||||
|
nodes::LoopControl operator()(const parser::ParseTree::Node &parser_node,
|
||||||
|
const utils::None &args) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct BuilderTask<nodes::ModifierExpression, utils::RefTag>
|
||||||
|
: public BuilderTaskBase<nodes::ModifierExpression> {
|
||||||
|
using BuilderTaskBase<nodes::ModifierExpression>::BuilderTaskBase;
|
||||||
|
|
||||||
|
nodes::ModifierExpression
|
||||||
|
operator()(const parser::ParseTree::Node &parser_node,
|
||||||
|
const utils::None &args) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct BuilderTask<nodes::ModifierExpression, utils::SuffixTag>
|
||||||
|
: public BuilderTaskBase<nodes::ModifierExpression> {
|
||||||
|
using BuilderTaskBase<nodes::ModifierExpression>::BuilderTaskBase;
|
||||||
|
|
||||||
|
nodes::ModifierExpression
|
||||||
|
operator()(const parser::ParseTree::Node &parser_node,
|
||||||
|
const utils::None &args) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
requires std::is_same_v<T, utils::RefTag> or
|
||||||
|
std::is_same_v<T, utils::SuffixTag>
|
||||||
|
struct BuilderTask<nodes::ModifierExpression, T>
|
||||||
|
: public BuilderTaskBase<nodes::ModifierExpression> {
|
||||||
|
using BuilderTaskBase<nodes::ModifierExpression>::BuilderTaskBase;
|
||||||
|
|
||||||
|
// _reference_ expression
|
||||||
|
// or
|
||||||
|
// expression ('?' | '!')
|
||||||
|
nodes::ModifierExpression
|
||||||
|
operator()(const parser::ParseTree::Node &parser_node,
|
||||||
|
const utils::None &) override {
|
||||||
|
const size_t modifier_pos =
|
||||||
|
std::is_same_v<T, utils::RefTag> ? 0 : parser_node.child_count() - 1;
|
||||||
|
|
||||||
|
return nodes::ModifierExpression(
|
||||||
|
build_node(parser_node),
|
||||||
|
build_modifier(parser_node.nth_child(modifier_pos)),
|
||||||
|
Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// --- other
|
// --- other
|
||||||
|
|
||||||
nodes::NameExpression
|
template <>
|
||||||
build_name_expression(parser::ParseTree::Node parser_node,
|
struct BuilderTask<nodes::NameExpression, utils::FuncCallTag>
|
||||||
nodes::ExpressionStorage &expression_storage,
|
: public BuilderTaskBase<nodes::NameExpression> {
|
||||||
nodes::TypeStorage &type_storage);
|
using BuilderTaskBase<nodes::NameExpression>::BuilderTaskBase;
|
||||||
|
|
||||||
nodes::Constructor
|
nodes::NameExpression operator()(const parser::ParseTree::Node &parser_node,
|
||||||
build_constructor(parser::ParseTree::Node parser_node,
|
const utils::None &args) override;
|
||||||
nodes::ExpressionStorage &expression_storage,
|
};
|
||||||
nodes::TypeStorage &type_storage);
|
|
||||||
|
|
||||||
nodes::Lambda build_lambda(parser::ParseTree::Node parser_node,
|
template <>
|
||||||
nodes::ExpressionStorage &expression_storage,
|
struct BuilderTask<nodes::Constructor>
|
||||||
nodes::TypeStorage &type_storage);
|
: public BuilderTaskBase<nodes::Constructor> {
|
||||||
|
using BuilderTaskBase<nodes::Constructor>::BuilderTaskBase;
|
||||||
|
|
||||||
|
nodes::Constructor operator()(const parser::ParseTree::Node &parser_node,
|
||||||
|
const utils::None &args) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct BuilderTask<nodes::Lambda> : public BuilderTaskBase<nodes::Lambda> {
|
||||||
|
using BuilderTaskBase<nodes::Lambda>::BuilderTaskBase;
|
||||||
|
|
||||||
|
nodes::Lambda operator()(const parser::ParseTree::Node &parser_node,
|
||||||
|
const utils::None &args) override;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace builders
|
} // namespace builders
|
||||||
|
|
|
||||||
|
|
@ -10,10 +10,8 @@
|
||||||
|
|
||||||
namespace builders {
|
namespace builders {
|
||||||
|
|
||||||
nodes::ExpressionProxy
|
nodes::ExpressionProxy BuilderTask<nodes::ExpressionProxy>::operator()(
|
||||||
build_expression(parser::ParseTree::Node parser_node,
|
const parser::ParseTree::Node &parser_node, const utils::None &) {
|
||||||
nodes::ExpressionStorage &expression_storage,
|
|
||||||
nodes::TypeStorage &type_storage) {
|
|
||||||
tokens::Type type = tokens::string_to_type(parser_node.get_type());
|
tokens::Type type = tokens::string_to_type(parser_node.get_type());
|
||||||
|
|
||||||
auto maybe_parenthesis = parser_node.previous_sibling();
|
auto maybe_parenthesis = parser_node.previous_sibling();
|
||||||
|
|
@ -24,141 +22,128 @@ build_expression(parser::ParseTree::Node parser_node,
|
||||||
switch (type) {
|
switch (type) {
|
||||||
// --- flow control
|
// --- flow control
|
||||||
case tokens::Type::MATCH:
|
case tokens::Type::MATCH:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node),
|
build_node(parser_node), Run<nodes::Match>(parser_node), is_scoped));
|
||||||
build_match(parser_node, expression_storage, type_storage), is_scoped));
|
|
||||||
case tokens::Type::CONDITION:
|
case tokens::Type::CONDITION:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(
|
||||||
build_node(parser_node),
|
nodes::Expression(build_node(parser_node),
|
||||||
build_condition(parser_node, expression_storage, type_storage),
|
Run<nodes::Condition>(parser_node), is_scoped));
|
||||||
is_scoped));
|
|
||||||
case tokens::Type::LOOP:
|
case tokens::Type::LOOP:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node),
|
build_node(parser_node), Run<nodes::Loop>(parser_node), is_scoped));
|
||||||
build_loop(parser_node, expression_storage, type_storage), is_scoped));
|
|
||||||
// --- operators
|
// --- operators
|
||||||
case tokens::Type::COMMA_EXPRESSION:
|
case tokens::Type::COMMA_EXPRESSION:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node),
|
build_node(parser_node),
|
||||||
build_comma_expression(parser_node, expression_storage, type_storage),
|
Run<nodes::NameExpression, utils::CommaTag>(parser_node), is_scoped));
|
||||||
is_scoped));
|
|
||||||
case tokens::Type::OPERATOR_EXPRESSION:
|
case tokens::Type::OPERATOR_EXPRESSION:
|
||||||
return expression_storage.add_expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
nodes::Expression(build_node(parser_node),
|
build_node(parser_node),
|
||||||
build_operator_expression(
|
Run<nodes::NameExpression, utils::OperatorTag>(parser_node),
|
||||||
parser_node, expression_storage, type_storage),
|
|
||||||
is_scoped));
|
is_scoped));
|
||||||
// --- containers
|
// --- containers
|
||||||
case tokens::Type::BLOCK:
|
case tokens::Type::BLOCK:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node),
|
build_node(parser_node),
|
||||||
build_block(parser_node, expression_storage, type_storage), is_scoped));
|
Run<nodes::Container, utils::BlockTag>(parser_node), is_scoped));
|
||||||
case tokens::Type::ARRAY:
|
case tokens::Type::ARRAY:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node),
|
build_node(parser_node),
|
||||||
build_array(parser_node, expression_storage, type_storage), is_scoped));
|
Run<nodes::Container, utils::ArrayTag>(parser_node), is_scoped));
|
||||||
// --- modifiers
|
// --- modifiers
|
||||||
case tokens::Type::RETURN:
|
case tokens::Type::RETURN:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node),
|
build_node(parser_node), Run<nodes::Return>(parser_node), is_scoped));
|
||||||
build_return(parser_node, expression_storage, type_storage),
|
|
||||||
is_scoped));
|
|
||||||
case tokens::Type::NAME_DEFINITION:
|
case tokens::Type::NAME_DEFINITION:
|
||||||
return expression_storage.add_expression(
|
return state<Exprs>().add_expression(
|
||||||
nodes::Expression(build_node(parser_node),
|
nodes::Expression(build_node(parser_node),
|
||||||
build_name_definition(parser_node), is_scoped));
|
Run<nodes::NameDefinition>(parser_node), is_scoped));
|
||||||
case tokens::Type::ARRAY_ACCESS:
|
case tokens::Type::ARRAY_ACCESS:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node),
|
build_node(parser_node),
|
||||||
build_array_access(parser_node, expression_storage, type_storage),
|
Run<nodes::Access, utils::ArrayAccessTag>(parser_node), is_scoped));
|
||||||
is_scoped));
|
|
||||||
case tokens::Type::TUPLE_ACCESS:
|
case tokens::Type::TUPLE_ACCESS:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node),
|
build_node(parser_node),
|
||||||
build_tuple_access(parser_node, expression_storage, type_storage),
|
Run<nodes::Access, utils::TupleAccessTag>(parser_node), is_scoped));
|
||||||
is_scoped));
|
|
||||||
case tokens::Type::LOOP_CONTROL:
|
case tokens::Type::LOOP_CONTROL:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(
|
||||||
build_node(parser_node), build_loop_control(parser_node), is_scoped));
|
|
||||||
case tokens::Type::REFERENCE_EXPRESSION:
|
|
||||||
return expression_storage.add_expression(
|
|
||||||
nodes::Expression(build_node(parser_node),
|
nodes::Expression(build_node(parser_node),
|
||||||
build_reference_expression(
|
Run<nodes::LoopControl>(parser_node), is_scoped));
|
||||||
parser_node, expression_storage, type_storage),
|
case tokens::Type::REFERENCE_EXPRESSION:
|
||||||
is_scoped));
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
case tokens::Type::SUFFIX_EXPRESSION:
|
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
|
||||||
build_node(parser_node),
|
build_node(parser_node),
|
||||||
build_suffix_expression(parser_node, expression_storage, type_storage),
|
Run<nodes::ModifierExpression, utils::RefTag>(parser_node), is_scoped));
|
||||||
|
case tokens::Type::SUFFIX_EXPRESSION:
|
||||||
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
|
build_node(parser_node),
|
||||||
|
Run<nodes::ModifierExpression, utils::SuffixTag>(parser_node),
|
||||||
is_scoped));
|
is_scoped));
|
||||||
// --- other
|
// --- other
|
||||||
case tokens::Type::NAME_EXPRESSION:
|
case tokens::Type::NAME_EXPRESSION:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node),
|
build_node(parser_node),
|
||||||
build_name_expression(parser_node, expression_storage, type_storage),
|
Run<nodes::NameExpression, utils::FuncCallTag>(parser_node),
|
||||||
is_scoped));
|
is_scoped));
|
||||||
case tokens::Type::ARGUMENT_NAME_IDENTIFIER:
|
case tokens::Type::ARGUMENT_NAME_IDENTIFIER:
|
||||||
case tokens::Type::SIMPLE_NAME_IDENTIFIER:
|
case tokens::Type::SIMPLE_NAME_IDENTIFIER:
|
||||||
case tokens::Type::PLACEHOLDER:
|
case tokens::Type::PLACEHOLDER:
|
||||||
return expression_storage.add_expression(
|
return state<Exprs>().add_expression(
|
||||||
nodes::Expression(build_node(parser_node),
|
nodes::Expression(build_node(parser_node),
|
||||||
nodes::NameExpression(build_node(parser_node),
|
nodes::NameExpression(build_node(parser_node),
|
||||||
build_identifier(parser_node)),
|
build_identifier(parser_node)),
|
||||||
is_scoped));
|
is_scoped));
|
||||||
case tokens::Type::CONSTRUCTOR:
|
case tokens::Type::CONSTRUCTOR:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(
|
||||||
build_node(parser_node),
|
nodes::Expression(build_node(parser_node),
|
||||||
build_constructor(parser_node, expression_storage, type_storage),
|
Run<nodes::Constructor>(parser_node), is_scoped));
|
||||||
is_scoped));
|
|
||||||
case tokens::Type::LAMBDA:
|
case tokens::Type::LAMBDA:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node),
|
build_node(parser_node), Run<nodes::Lambda>(parser_node), is_scoped));
|
||||||
build_lambda(parser_node, expression_storage, type_storage),
|
|
||||||
is_scoped));
|
|
||||||
// --- literals
|
// --- literals
|
||||||
case tokens::Type::FLOAT_LITERAL:
|
case tokens::Type::FLOAT_LITERAL:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node), build_float_literal(parser_node), is_scoped));
|
build_node(parser_node), build_float_literal(parser_node), is_scoped));
|
||||||
case tokens::Type::DOUBLE_LITERAL:
|
case tokens::Type::DOUBLE_LITERAL:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node), build_double_literal(parser_node), is_scoped));
|
build_node(parser_node), build_double_literal(parser_node), is_scoped));
|
||||||
case tokens::Type::INT_LITERAL:
|
case tokens::Type::INT_LITERAL:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node), build_int_literal(parser_node), is_scoped));
|
build_node(parser_node), build_int_literal(parser_node), is_scoped));
|
||||||
case tokens::Type::LONG_LITERAL:
|
case tokens::Type::LONG_LITERAL:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node), build_long_literal(parser_node), is_scoped));
|
build_node(parser_node), build_long_literal(parser_node), is_scoped));
|
||||||
case tokens::Type::INDEX_LITERAL:
|
case tokens::Type::INDEX_LITERAL:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node), build_index_literal(parser_node), is_scoped));
|
build_node(parser_node), build_index_literal(parser_node), is_scoped));
|
||||||
case tokens::Type::STRING_LITERAL:
|
case tokens::Type::STRING_LITERAL:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node), build_string_literal(parser_node), is_scoped));
|
build_node(parser_node), build_string_literal(parser_node), is_scoped));
|
||||||
case tokens::Type::UNICODE_STRING_LITERAL:
|
case tokens::Type::UNICODE_STRING_LITERAL:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node), build_unicode_string_literal(parser_node),
|
build_node(parser_node), build_unicode_string_literal(parser_node),
|
||||||
is_scoped));
|
is_scoped));
|
||||||
case tokens::Type::CHAR_LITERAL:
|
case tokens::Type::CHAR_LITERAL:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node), build_char_literal(parser_node), is_scoped));
|
build_node(parser_node), build_char_literal(parser_node), is_scoped));
|
||||||
case tokens::Type::UNICODE_LITERAL:
|
case tokens::Type::UNICODE_LITERAL:
|
||||||
return expression_storage.add_expression(
|
return state<Exprs>().add_expression(
|
||||||
nodes::Expression(build_node(parser_node),
|
nodes::Expression(build_node(parser_node),
|
||||||
build_unicode_literal(parser_node), is_scoped));
|
build_unicode_literal(parser_node), is_scoped));
|
||||||
case tokens::Type::BOOL_LITERAL:
|
case tokens::Type::BOOL_LITERAL:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node), build_bool_literal(parser_node), is_scoped));
|
build_node(parser_node), build_bool_literal(parser_node), is_scoped));
|
||||||
case tokens::Type::UNIT_LITERAL:
|
case tokens::Type::UNIT_LITERAL:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node), build_unit_literal(parser_node), is_scoped));
|
build_node(parser_node), build_unit_literal(parser_node), is_scoped));
|
||||||
case tokens::Type::NULL_LITERAL:
|
case tokens::Type::NULL_LITERAL:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node), build_null_literal(parser_node), is_scoped));
|
build_node(parser_node), build_null_literal(parser_node), is_scoped));
|
||||||
case tokens::Type::EXTRA:
|
case tokens::Type::EXTRA:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node), build_extra(parser_node), is_scoped));
|
build_node(parser_node), build_extra(parser_node), is_scoped));
|
||||||
case tokens::Type::EMPTY_LINES:
|
case tokens::Type::EMPTY_LINES:
|
||||||
return expression_storage.add_expression(nodes::Expression(
|
return state<Exprs>().add_expression(nodes::Expression(
|
||||||
build_node(parser_node), build_empty_lines(parser_node), is_scoped));
|
build_node(parser_node), build_empty_lines(parser_node), is_scoped));
|
||||||
default:
|
default:
|
||||||
error_handling::handle_parsing_error("Unexprected expression node type",
|
error_handling::handle_parsing_error("Unexprected expression node type",
|
||||||
|
|
@ -172,9 +157,8 @@ build_expression(parser::ParseTree::Node parser_node,
|
||||||
// --- flow control
|
// --- flow control
|
||||||
|
|
||||||
// (':=' | '=:') expression (('??' | 'if') expression)? (_do_ expression)?
|
// (':=' | '=:') expression (('??' | 'if') expression)? (_do_ expression)?
|
||||||
nodes::Match::Case build_case(parser::ParseTree::Node parser_node,
|
nodes::Match::Case BuilderTask<nodes::Match::Case>::operator()(
|
||||||
nodes::ExpressionStorage &expression_storage,
|
const parser::ParseTree::Node &parser_node, const utils::None &) {
|
||||||
nodes::TypeStorage &type_storage) {
|
|
||||||
std::string case_type = parser_node.nth_child(0).get_value();
|
std::string case_type = parser_node.nth_child(0).get_value();
|
||||||
|
|
||||||
std::optional<parser::ParseTree::Node> condition_node;
|
std::optional<parser::ParseTree::Node> condition_node;
|
||||||
|
|
@ -198,41 +182,36 @@ nodes::Match::Case build_case(parser::ParseTree::Node parser_node,
|
||||||
build_node(parser_node),
|
build_node(parser_node),
|
||||||
case_type == ":=" ? nodes::Match::Case::PATTERN_VALUE
|
case_type == ":=" ? nodes::Match::Case::PATTERN_VALUE
|
||||||
: nodes::Match::Case::VALUE_PATTERN,
|
: nodes::Match::Case::VALUE_PATTERN,
|
||||||
build_expression(parser_node.nth_named_child(0), expression_storage,
|
Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)),
|
||||||
type_storage),
|
|
||||||
condition_node.has_value()
|
condition_node.has_value()
|
||||||
? build_expression(condition_node.value(), expression_storage,
|
? Run<nodes::ExpressionProxy>(condition_node.value())
|
||||||
type_storage)
|
|
||||||
: std::optional<nodes::ExpressionProxy>(),
|
: std::optional<nodes::ExpressionProxy>(),
|
||||||
expression_node.has_value()
|
expression_node.has_value()
|
||||||
? build_expression(expression_node.value(), expression_storage,
|
? Run<nodes::ExpressionProxy>(expression_node.value())
|
||||||
type_storage)
|
|
||||||
: std::optional<nodes::ExpressionProxy>());
|
: std::optional<nodes::ExpressionProxy>());
|
||||||
}
|
}
|
||||||
|
|
||||||
// expression case+
|
// expression case+
|
||||||
nodes::Match build_match(parser::ParseTree::Node parser_node,
|
nodes::Match BuilderTask<nodes::Match>::operator()(
|
||||||
nodes::ExpressionStorage &expression_storage,
|
const parser::ParseTree::Node &parser_node, const utils::None &) {
|
||||||
nodes::TypeStorage &type_storage) {
|
|
||||||
std::vector<nodes::Match::Case> cases;
|
std::vector<nodes::Match::Case> cases;
|
||||||
|
|
||||||
auto current_node = parser_node.nth_named_child(1);
|
auto current_node = parser_node.nth_named_child(1);
|
||||||
while (!current_node.is_null()) {
|
while (!current_node.is_null()) {
|
||||||
cases.push_back(build_case(current_node, expression_storage, type_storage));
|
cases.push_back(Run<nodes::Match::Case>(current_node));
|
||||||
current_node = current_node.next_named_sibling();
|
current_node = current_node.next_named_sibling();
|
||||||
}
|
}
|
||||||
|
|
||||||
return nodes::Match(build_node(parser_node),
|
return nodes::Match(
|
||||||
build_expression(parser_node.nth_named_child(0),
|
build_node(parser_node),
|
||||||
expression_storage, type_storage),
|
Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)),
|
||||||
std::move(cases));
|
std::move(cases));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ('??' | 'if') expression _do_ expression (('!!' | 'elif') expression _do_
|
// ('??' | 'if') expression _do_ expression (('!!' | 'elif') expression _do_
|
||||||
// expression)* (('!!=>', 'else') expression)?
|
// expression)* (('!!=>', 'else') expression)?
|
||||||
nodes::Condition build_condition(parser::ParseTree::Node parser_node,
|
nodes::Condition BuilderTask<nodes::Condition>::operator()(
|
||||||
nodes::ExpressionStorage &expression_storage,
|
const parser::ParseTree::Node &parser_node, const utils::None &) {
|
||||||
nodes::TypeStorage &type_storage) {
|
|
||||||
size_t named_child_count = parser_node.named_child_count();
|
size_t named_child_count = parser_node.named_child_count();
|
||||||
|
|
||||||
std::vector<std::pair<nodes::ExpressionProxy, nodes::ExpressionProxy>> cases;
|
std::vector<std::pair<nodes::ExpressionProxy, nodes::ExpressionProxy>> cases;
|
||||||
|
|
@ -241,9 +220,8 @@ nodes::Condition build_condition(parser::ParseTree::Node parser_node,
|
||||||
auto next_node = current_node.next_named_sibling();
|
auto next_node = current_node.next_named_sibling();
|
||||||
|
|
||||||
while (!current_node.is_null() && !next_node.is_null()) {
|
while (!current_node.is_null() && !next_node.is_null()) {
|
||||||
cases.push_back(
|
cases.push_back({Run<nodes::ExpressionProxy>(current_node),
|
||||||
{build_expression(current_node, expression_storage, type_storage),
|
Run<nodes::ExpressionProxy>(next_node)});
|
||||||
build_expression(next_node, expression_storage, type_storage)});
|
|
||||||
current_node = next_node.next_named_sibling();
|
current_node = next_node.next_named_sibling();
|
||||||
if (current_node.is_null()) {
|
if (current_node.is_null()) {
|
||||||
break;
|
break;
|
||||||
|
|
@ -254,35 +232,32 @@ nodes::Condition build_condition(parser::ParseTree::Node parser_node,
|
||||||
return nodes::Condition(
|
return nodes::Condition(
|
||||||
build_node(parser_node), std::move(cases),
|
build_node(parser_node), std::move(cases),
|
||||||
named_child_count % 2 == 1
|
named_child_count % 2 == 1
|
||||||
? build_expression(parser_node.nth_named_child(named_child_count - 1),
|
? Run<nodes::ExpressionProxy>(
|
||||||
expression_storage, type_storage)
|
parser_node.nth_named_child(named_child_count - 1))
|
||||||
: std::optional<nodes::ExpressionProxy>());
|
: std::optional<nodes::ExpressionProxy>());
|
||||||
}
|
}
|
||||||
|
|
||||||
// ('@' | 'for') (expression | expression ':' expression)? _do_ expression
|
// ('@' | 'for') (expression | expression ':' expression)? _do_ expression
|
||||||
nodes::Loop build_loop(parser::ParseTree::Node parser_node,
|
nodes::Loop
|
||||||
nodes::ExpressionStorage &expression_storage,
|
BuilderTask<nodes::Loop>::operator()(const parser::ParseTree::Node &parser_node,
|
||||||
nodes::TypeStorage &type_storage) {
|
const utils::None &) {
|
||||||
size_t named_child_count = parser_node.named_child_count();
|
size_t named_child_count = parser_node.named_child_count();
|
||||||
|
|
||||||
if (named_child_count == 1) { // body
|
if (named_child_count == 1) { // body
|
||||||
return nodes::Loop(build_node(parser_node),
|
return nodes::Loop(
|
||||||
build_expression(parser_node.nth_named_child(0),
|
build_node(parser_node),
|
||||||
expression_storage, type_storage));
|
Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)));
|
||||||
} else if (named_child_count == 2) { // condition, body
|
} else if (named_child_count == 2) { // condition, body
|
||||||
return nodes::Loop(build_node(parser_node),
|
return nodes::Loop(
|
||||||
build_expression(parser_node.nth_named_child(0),
|
build_node(parser_node),
|
||||||
expression_storage, type_storage),
|
Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)),
|
||||||
build_expression(parser_node.nth_named_child(1),
|
Run<nodes::ExpressionProxy>(parser_node.nth_named_child(1)));
|
||||||
expression_storage, type_storage));
|
|
||||||
} else if (named_child_count == 3) { // variable, interval, body
|
} else if (named_child_count == 3) { // variable, interval, body
|
||||||
return nodes::Loop(build_node(parser_node),
|
return nodes::Loop(
|
||||||
build_expression(parser_node.nth_named_child(0),
|
build_node(parser_node),
|
||||||
expression_storage, type_storage),
|
Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)),
|
||||||
build_expression(parser_node.nth_named_child(1),
|
Run<nodes::ExpressionProxy>(parser_node.nth_named_child(1)),
|
||||||
expression_storage, type_storage),
|
Run<nodes::ExpressionProxy>(parser_node.nth_named_child(2)));
|
||||||
build_expression(parser_node.nth_named_child(2),
|
|
||||||
expression_storage, type_storage));
|
|
||||||
} else {
|
} else {
|
||||||
error_handling::handle_parsing_error(
|
error_handling::handle_parsing_error(
|
||||||
"Unexprected named expression amount in loop", parser_node);
|
"Unexprected named expression amount in loop", parser_node);
|
||||||
|
|
@ -296,19 +271,16 @@ nodes::Loop build_loop(parser::ParseTree::Node parser_node,
|
||||||
|
|
||||||
// expression ',' expression
|
// expression ',' expression
|
||||||
nodes::NameExpression
|
nodes::NameExpression
|
||||||
build_comma_expression(parser::ParseTree::Node parser_node,
|
BuilderTask<nodes::NameExpression, utils::CommaTag>::operator()(
|
||||||
nodes::ExpressionStorage &expression_storage,
|
const parser::ParseTree::Node &parser_node, const utils::None &) {
|
||||||
nodes::TypeStorage &type_storage) {
|
|
||||||
std::vector<std::pair<std::optional<std::string>, nodes::ExpressionProxy>>
|
std::vector<std::pair<std::optional<std::string>, nodes::ExpressionProxy>>
|
||||||
arguments;
|
arguments;
|
||||||
|
|
||||||
arguments.emplace_back(std::nullopt,
|
arguments.emplace_back(std::nullopt, Run<nodes::ExpressionProxy>(
|
||||||
build_expression(parser_node.nth_named_child(0),
|
parser_node.nth_named_child(0)));
|
||||||
expression_storage, type_storage));
|
|
||||||
|
|
||||||
arguments.emplace_back(std::nullopt,
|
arguments.emplace_back(std::nullopt, Run<nodes::ExpressionProxy>(
|
||||||
build_expression(parser_node.nth_named_child(1),
|
parser_node.nth_named_child(1)));
|
||||||
expression_storage, type_storage));
|
|
||||||
|
|
||||||
return nodes::NameExpression(
|
return nodes::NameExpression(
|
||||||
build_node(parser_node),
|
build_node(parser_node),
|
||||||
|
|
@ -320,21 +292,18 @@ build_comma_expression(parser::ParseTree::Node parser_node,
|
||||||
|
|
||||||
// expression operator expression
|
// expression operator expression
|
||||||
nodes::NameExpression
|
nodes::NameExpression
|
||||||
build_operator_expression(parser::ParseTree::Node parser_node,
|
BuilderTask<nodes::NameExpression, utils::OperatorTag>::operator()(
|
||||||
nodes::ExpressionStorage &expression_storage,
|
const parser::ParseTree::Node &parser_node, const utils::None &) {
|
||||||
nodes::TypeStorage &type_storage) {
|
|
||||||
auto name_node = parser_node.child_by_field_name("name");
|
auto name_node = parser_node.child_by_field_name("name");
|
||||||
|
|
||||||
std::vector<std::pair<std::optional<std::string>, nodes::ExpressionProxy>>
|
std::vector<std::pair<std::optional<std::string>, nodes::ExpressionProxy>>
|
||||||
arguments;
|
arguments;
|
||||||
|
|
||||||
arguments.emplace_back(std::nullopt,
|
arguments.emplace_back(std::nullopt, Run<nodes::ExpressionProxy>(
|
||||||
build_expression(name_node.previous_named_sibling(),
|
name_node.previous_named_sibling()));
|
||||||
expression_storage, type_storage));
|
|
||||||
|
|
||||||
arguments.emplace_back(std::nullopt,
|
arguments.emplace_back(std::nullopt, Run<nodes::ExpressionProxy>(
|
||||||
build_expression(name_node.next_named_sibling(),
|
name_node.next_named_sibling()));
|
||||||
expression_storage, type_storage));
|
|
||||||
|
|
||||||
return nodes::NameExpression(build_node(parser_node),
|
return nodes::NameExpression(build_node(parser_node),
|
||||||
build_operator(name_node), std::move(arguments),
|
build_operator(name_node), std::move(arguments),
|
||||||
|
|
@ -343,59 +312,24 @@ build_operator_expression(parser::ParseTree::Node parser_node,
|
||||||
|
|
||||||
// --- continers
|
// --- continers
|
||||||
|
|
||||||
nodes::Container
|
// // Container -> .hpp
|
||||||
build_container(parser::ParseTree::Node parser_node,
|
|
||||||
nodes::ExpressionStorage &expression_storage,
|
|
||||||
nodes::TypeStorage &type_storage,
|
|
||||||
nodes::Container::ContainerType container_type) {
|
|
||||||
std::vector<nodes::ExpressionProxy> expressions;
|
|
||||||
|
|
||||||
auto current_node = parser_node.nth_named_child(0);
|
|
||||||
|
|
||||||
while (!current_node.is_null()) {
|
|
||||||
expressions.push_back(
|
|
||||||
build_expression(current_node, expression_storage, type_storage));
|
|
||||||
current_node = current_node.next_named_sibling();
|
|
||||||
}
|
|
||||||
|
|
||||||
return nodes::Container(build_node(parser_node), container_type,
|
|
||||||
std::move(expressions));
|
|
||||||
}
|
|
||||||
|
|
||||||
// '{' (expression ';')* '}'
|
|
||||||
nodes::Container build_block(parser::ParseTree::Node parser_node,
|
|
||||||
nodes::ExpressionStorage &expression_storage,
|
|
||||||
nodes::TypeStorage &type_storage) {
|
|
||||||
return build_container(parser_node, expression_storage, type_storage,
|
|
||||||
nodes::Container::BLOCK);
|
|
||||||
}
|
|
||||||
|
|
||||||
// '[[' expression+ ']]'
|
|
||||||
nodes::Container build_array(parser::ParseTree::Node parser_node,
|
|
||||||
nodes::ExpressionStorage &expression_storage,
|
|
||||||
nodes::TypeStorage &type_storage) {
|
|
||||||
return build_container(parser_node, expression_storage, type_storage,
|
|
||||||
nodes::Container::ARRAY);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- modifiers
|
// --- modifiers
|
||||||
|
|
||||||
// ('return' | 'bring') expression
|
// ('return' | 'bring') expression
|
||||||
nodes::Return build_return(parser::ParseTree::Node parser_node,
|
nodes::Return BuilderTask<nodes::Return>::operator()(
|
||||||
nodes::ExpressionStorage &expression_storage,
|
const parser::ParseTree::Node &parser_node, const utils::None &) {
|
||||||
nodes::TypeStorage &type_storage) {
|
|
||||||
std::string modifier = parser_node.nth_child(0).get_value();
|
std::string modifier = parser_node.nth_child(0).get_value();
|
||||||
|
|
||||||
return nodes::Return(build_node(parser_node),
|
return nodes::Return(
|
||||||
modifier == "return" ? nodes::Return::RETURN
|
build_node(parser_node),
|
||||||
: nodes::Return::BRING,
|
modifier == "return" ? nodes::Return::RETURN : nodes::Return::BRING,
|
||||||
build_expression(parser_node.nth_named_child(0),
|
Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)));
|
||||||
expression_storage, type_storage));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// _var_let_ (simple_name_identifier | placeholder)
|
// _var_let_ (simple_name_identifier | placeholder)
|
||||||
nodes::NameDefinition
|
nodes::NameDefinition BuilderTask<nodes::NameDefinition>::operator()(
|
||||||
build_name_definition(parser::ParseTree::Node parser_node) {
|
const parser::ParseTree::Node &parser_node, const utils::None &) {
|
||||||
std::string modifier = parser_node.nth_child(0).get_value();
|
std::string modifier = parser_node.nth_child(0).get_value();
|
||||||
|
|
||||||
auto name_node = parser_node.nth_named_child(0);
|
auto name_node = parser_node.nth_named_child(0);
|
||||||
|
|
@ -408,76 +342,41 @@ build_name_definition(parser::ParseTree::Node parser_node) {
|
||||||
} // IN PROGRESS
|
} // IN PROGRESS
|
||||||
|
|
||||||
// expression '[' expression ']'
|
// expression '[' expression ']'
|
||||||
nodes::Access build_array_access(parser::ParseTree::Node parser_node,
|
nodes::Access BuilderTask<nodes::Access, utils::ArrayAccessTag>::operator()(
|
||||||
nodes::ExpressionStorage &expression_storage,
|
const parser::ParseTree::Node &parser_node, const utils::None &) {
|
||||||
nodes::TypeStorage &type_storage) {
|
return nodes::Access(
|
||||||
return nodes::Access(build_node(parser_node), nodes::Access::ARRAY,
|
build_node(parser_node), nodes::Access::ARRAY,
|
||||||
build_expression(parser_node.nth_named_child(0),
|
Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)),
|
||||||
expression_storage, type_storage),
|
Run<nodes::ExpressionProxy>(parser_node.nth_named_child(1)));
|
||||||
build_expression(parser_node.nth_named_child(1),
|
|
||||||
expression_storage, type_storage));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// expression '.' number_literal
|
// expression '.' number_literal
|
||||||
nodes::Access build_tuple_access(parser::ParseTree::Node parser_node,
|
nodes::Access BuilderTask<nodes::Access, utils::TupleAccessTag>::operator()(
|
||||||
nodes::ExpressionStorage &expression_storage,
|
const parser::ParseTree::Node &parser_node, const utils::None &) {
|
||||||
nodes::TypeStorage &type_storage) {
|
|
||||||
return nodes::Access(
|
return nodes::Access(
|
||||||
build_node(parser_node), nodes::Access::TUPLE,
|
build_node(parser_node), nodes::Access::TUPLE,
|
||||||
build_expression(parser_node.nth_named_child(0), expression_storage,
|
Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)),
|
||||||
type_storage),
|
state<Exprs>().add_expression(nodes::Expression(
|
||||||
expression_storage.add_expression(nodes::Expression(
|
|
||||||
build_node(parser_node.nth_named_child(1)),
|
build_node(parser_node.nth_named_child(1)),
|
||||||
build_index_literal(parser_node.nth_named_child(1)), false)));
|
build_index_literal(parser_node.nth_named_child(1)), false)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 'break' | 'continue'
|
// 'break' | 'continue'
|
||||||
nodes::LoopControl build_loop_control(parser::ParseTree::Node parser_node) {
|
nodes::LoopControl BuilderTask<nodes::LoopControl>::operator()(
|
||||||
|
const parser::ParseTree::Node &parser_node, const utils::None &) {
|
||||||
return nodes::LoopControl(build_node(parser_node),
|
return nodes::LoopControl(build_node(parser_node),
|
||||||
parser_node.get_value() == "break"
|
parser_node.get_value() == "break"
|
||||||
? nodes::LoopControl::BREAK
|
? nodes::LoopControl::BREAK
|
||||||
: nodes::LoopControl::CONTINUE);
|
: nodes::LoopControl::CONTINUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
nodes::ModifierExpression
|
// // ModifierExpression -> .hpp
|
||||||
build_modifier_expression(parser::ParseTree::Node parser_node,
|
|
||||||
nodes::ExpressionStorage &expression_storage,
|
|
||||||
nodes::TypeStorage &type_storage,
|
|
||||||
size_t modifier_position) {
|
|
||||||
|
|
||||||
return nodes::ModifierExpression(
|
|
||||||
build_node(parser_node),
|
|
||||||
build_modifier(parser_node.nth_child(modifier_position)),
|
|
||||||
build_expression(parser_node.nth_named_child(0), expression_storage,
|
|
||||||
type_storage));
|
|
||||||
}
|
|
||||||
|
|
||||||
// _reference_ expression
|
|
||||||
nodes::ModifierExpression
|
|
||||||
build_reference_expression(parser::ParseTree::Node parser_node,
|
|
||||||
nodes::ExpressionStorage &expression_storage,
|
|
||||||
nodes::TypeStorage &type_storage) {
|
|
||||||
return build_modifier_expression(parser_node, expression_storage,
|
|
||||||
type_storage, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// expression ('?' | '!')
|
|
||||||
nodes::ModifierExpression
|
|
||||||
build_suffix_expression(parser::ParseTree::Node parser_node,
|
|
||||||
nodes::ExpressionStorage &expression_storage,
|
|
||||||
nodes::TypeStorage &type_storage) {
|
|
||||||
return build_modifier_expression(parser_node, expression_storage,
|
|
||||||
type_storage, parser_node.child_count() - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- other
|
// --- other
|
||||||
|
|
||||||
void build_arguments_until_end(
|
void build_arguments_until_end(
|
||||||
parser::ParseTree::Node first_parse_node,
|
parser::ParseTree::Node first_parse_node, Executor &executor,
|
||||||
nodes::ExpressionStorage &expression_storage,
|
std::vector<nodes::AnnotatedArgument> &arguments) {
|
||||||
nodes::TypeStorage &type_storage,
|
|
||||||
std::vector<std::pair<std::optional<std::string>, nodes::ExpressionProxy>>
|
|
||||||
&arguments) {
|
|
||||||
|
|
||||||
auto current_node = first_parse_node;
|
auto current_node = first_parse_node;
|
||||||
|
|
||||||
|
|
@ -489,7 +388,7 @@ void build_arguments_until_end(
|
||||||
} else {
|
} else {
|
||||||
arguments.emplace_back(
|
arguments.emplace_back(
|
||||||
std::move(last_annotation),
|
std::move(last_annotation),
|
||||||
build_expression(current_node, expression_storage, type_storage));
|
executor.Run<nodes::ExpressionProxy>(current_node));
|
||||||
last_annotation = std::nullopt;
|
last_annotation = std::nullopt;
|
||||||
}
|
}
|
||||||
current_node = current_node.next_named_sibling();
|
current_node = current_node.next_named_sibling();
|
||||||
|
|
@ -499,11 +398,9 @@ void build_arguments_until_end(
|
||||||
// (type '.' simple_name | expression '.' simple_name | name | '(' operator
|
// (type '.' simple_name | expression '.' simple_name | name | '(' operator
|
||||||
// ')') (annotation? expression)*
|
// ')') (annotation? expression)*
|
||||||
nodes::NameExpression
|
nodes::NameExpression
|
||||||
build_name_expression(parser::ParseTree::Node parser_node,
|
BuilderTask<nodes::NameExpression, utils::FuncCallTag>::operator()(
|
||||||
nodes::ExpressionStorage &expression_storage,
|
const parser::ParseTree::Node &parser_node, const utils::None &) {
|
||||||
nodes::TypeStorage &type_storage) {
|
std::vector<nodes::AnnotatedArgument> arguments;
|
||||||
std::vector<std::pair<std::optional<std::string>, nodes::ExpressionProxy>>
|
|
||||||
arguments;
|
|
||||||
|
|
||||||
std::optional<nodes::Type> prefix;
|
std::optional<nodes::Type> prefix;
|
||||||
|
|
||||||
|
|
@ -528,45 +425,40 @@ build_name_expression(parser::ParseTree::Node parser_node,
|
||||||
prefix_node = current_node;
|
prefix_node = current_node;
|
||||||
} else {
|
} else {
|
||||||
is_point_call = true;
|
is_point_call = true;
|
||||||
arguments.emplace_back(
|
arguments.emplace_back(std::nullopt,
|
||||||
std::nullopt,
|
Run<nodes::ExpressionProxy>(current_node));
|
||||||
build_expression(current_node, expression_storage, type_storage));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
build_arguments_until_end(name_node.next_named_sibling(), expression_storage,
|
build_arguments_until_end(name_node.next_named_sibling(), executor,
|
||||||
type_storage, arguments);
|
arguments);
|
||||||
|
|
||||||
return nodes::NameExpression(
|
return nodes::NameExpression(
|
||||||
build_node(parser_node), build_identifier(name_node),
|
build_node(parser_node), build_identifier(name_node),
|
||||||
std::move(arguments),
|
std::move(arguments),
|
||||||
prefix_node.has_value() ? build_type(prefix_node.value(), type_storage)
|
prefix_node.has_value() ? build_type(prefix_node.value(), state<Types>())
|
||||||
: nodes::MaybeTypeProxy(),
|
: nodes::MaybeTypeProxy(),
|
||||||
is_point_call, false);
|
is_point_call, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// type (annotation? expression)*
|
// type (annotation? expression)*
|
||||||
nodes::Constructor
|
nodes::Constructor BuilderTask<nodes::Constructor>::operator()(
|
||||||
build_constructor(parser::ParseTree::Node parser_node,
|
const parser::ParseTree::Node &parser_node, const utils::None &) {
|
||||||
nodes::ExpressionStorage &expression_storage,
|
std::vector<nodes::AnnotatedArgument> arguments;
|
||||||
nodes::TypeStorage &type_storage) {
|
|
||||||
std::vector<std::pair<std::optional<std::string>, nodes::ExpressionProxy>>
|
|
||||||
arguments;
|
|
||||||
|
|
||||||
build_arguments_until_end(
|
build_arguments_until_end(
|
||||||
parser_node.child_by_field_name("type").next_named_sibling(),
|
parser_node.child_by_field_name("type").next_named_sibling(), executor,
|
||||||
expression_storage, type_storage, arguments);
|
arguments);
|
||||||
|
|
||||||
return nodes::Constructor(
|
return nodes::Constructor(
|
||||||
build_node(parser_node),
|
build_node(parser_node),
|
||||||
build_type(parser_node.child_by_field_name("type"), type_storage),
|
build_type(parser_node.child_by_field_name("type"), state<Types>()),
|
||||||
std::move(arguments));
|
std::move(arguments));
|
||||||
}
|
}
|
||||||
|
|
||||||
// '\\' argument_name* _do_ expression
|
// '\\' argument_name* _do_ expression
|
||||||
nodes::Lambda build_lambda(parser::ParseTree::Node parser_node,
|
nodes::Lambda BuilderTask<nodes::Lambda>::operator()(
|
||||||
nodes::ExpressionStorage &expression_storage,
|
const parser::ParseTree::Node &parser_node, const utils::None &) {
|
||||||
nodes::TypeStorage &type_storage) {
|
|
||||||
std::vector<nodes::Identifier> arguments;
|
std::vector<nodes::Identifier> arguments;
|
||||||
|
|
||||||
auto current_node =
|
auto current_node =
|
||||||
|
|
@ -580,9 +472,8 @@ nodes::Lambda build_lambda(parser::ParseTree::Node parser_node,
|
||||||
// skip '=>'
|
// skip '=>'
|
||||||
current_node = current_node.next_named_sibling();
|
current_node = current_node.next_named_sibling();
|
||||||
|
|
||||||
return nodes::Lambda(
|
return nodes::Lambda(build_node(parser_node), std::move(arguments),
|
||||||
build_node(parser_node), std::move(arguments),
|
Run<nodes::ExpressionProxy>(current_node));
|
||||||
build_expression(current_node, expression_storage, type_storage));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace builders
|
} // namespace builders
|
||||||
|
|
|
||||||
|
|
@ -379,6 +379,9 @@ private:
|
||||||
|
|
||||||
// --- other
|
// --- other
|
||||||
|
|
||||||
|
using AnnotatedArgument =
|
||||||
|
std::pair<std::optional<std::string>, ExpressionProxy>;
|
||||||
|
|
||||||
class NameExpression : public TypedNode {
|
class NameExpression : public TypedNode {
|
||||||
public:
|
public:
|
||||||
NameExpression(Node node, Identifier &&name)
|
NameExpression(Node node, Identifier &&name)
|
||||||
|
|
@ -387,10 +390,8 @@ public:
|
||||||
NameExpression(Node node, const Identifier &name)
|
NameExpression(Node node, const Identifier &name)
|
||||||
: TypedNode(node), name_(name) {}
|
: TypedNode(node), name_(name) {}
|
||||||
|
|
||||||
NameExpression(
|
NameExpression(Node node, Identifier &&name,
|
||||||
Node node, Identifier &&name,
|
std::vector<AnnotatedArgument> &&arguments,
|
||||||
std::vector<std::pair<std::optional<std::string>, ExpressionProxy>>
|
|
||||||
&&arguments,
|
|
||||||
std::optional<TypeProxy> &&prefix, bool is_point_call = false,
|
std::optional<TypeProxy> &&prefix, bool is_point_call = false,
|
||||||
bool is_operator_call = false)
|
bool is_operator_call = false)
|
||||||
: TypedNode(node), name_(std::move(name)),
|
: TypedNode(node), name_(std::move(name)),
|
||||||
|
|
@ -446,8 +447,7 @@ public:
|
||||||
private:
|
private:
|
||||||
Identifier name_;
|
Identifier name_;
|
||||||
// universal function call syntax
|
// universal function call syntax
|
||||||
std::vector<std::pair<std::optional<std::string>, ExpressionProxy>>
|
std::vector<AnnotatedArgument> arguments_;
|
||||||
arguments_;
|
|
||||||
std::optional<TypeProxy> prefix_;
|
std::optional<TypeProxy> prefix_;
|
||||||
// for static methods
|
// for static methods
|
||||||
bool is_point_call_ = false; // x.f ... or f x ...
|
bool is_point_call_ = false; // x.f ... or f x ...
|
||||||
|
|
@ -456,17 +456,13 @@ private:
|
||||||
|
|
||||||
class Constructor : public TypedNode {
|
class Constructor : public TypedNode {
|
||||||
public:
|
public:
|
||||||
Constructor(
|
Constructor(Node node, TypeProxy type,
|
||||||
Node node, TypeProxy type,
|
std::vector<AnnotatedArgument> &&arguments)
|
||||||
std::vector<std::pair<std::optional<std::string>, ExpressionProxy>>
|
|
||||||
&&arguments)
|
|
||||||
: TypedNode(node), constructor_type_(type),
|
: TypedNode(node), constructor_type_(type),
|
||||||
arguments_(std::move(arguments)) {}
|
arguments_(std::move(arguments)) {}
|
||||||
|
|
||||||
Constructor(
|
Constructor(Node node, TypeProxy type,
|
||||||
Node node, TypeProxy type,
|
const std::vector<AnnotatedArgument> &arguments)
|
||||||
const std::vector<std::pair<std::optional<std::string>, ExpressionProxy>>
|
|
||||||
&arguments)
|
|
||||||
: TypedNode(node), constructor_type_(type), arguments_(arguments) {}
|
: TypedNode(node), constructor_type_(type), arguments_(arguments) {}
|
||||||
|
|
||||||
Type *get_type() { return constructor_type_.get(); }
|
Type *get_type() { return constructor_type_.get(); }
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue