mirror of
https://codeberg.org/ProgramSnail/lang.git
synced 2025-12-26 16:58:46 +00:00
statement builders finished
This commit is contained in:
parent
64a91299ff
commit
4470454838
19 changed files with 682 additions and 255 deletions
|
|
@ -1,6 +1,9 @@
|
|||
#include "../include/basic_builders.hpp"
|
||||
#include "basic_builders.hpp"
|
||||
|
||||
#include "basic_nodes.hpp"
|
||||
#include "error_handling.hpp"
|
||||
#include "tokens.hpp"
|
||||
#include "tree_sitter_wrapper.hpp"
|
||||
|
||||
namespace builders {
|
||||
|
||||
|
|
@ -32,6 +35,23 @@ std::optional<char> to_escape_symbol(char symbol) {
|
|||
|
||||
} // namespace utils
|
||||
|
||||
nodes::Modifier build_modifier(parser::ParseTree::Node parser_node) {
|
||||
std::string modifier = parser_node.get_value();
|
||||
|
||||
if (modifier == "?") {
|
||||
return nodes::Modifier::OR_FALSE;
|
||||
} else if (modifier == "!") {
|
||||
return nodes::Modifier::OR_PANIC;
|
||||
} else if (modifier == "->" || modifier == "out") {
|
||||
return nodes::Modifier::OUT;
|
||||
} else if (modifier == "<-" || modifier == "in") {
|
||||
return nodes::Modifier::IN;
|
||||
} else if (modifier == "<>" || modifier == "ref") {
|
||||
return nodes::Modifier::REF;
|
||||
}
|
||||
return nodes::Modifier::NONE;
|
||||
}
|
||||
|
||||
nodes::Node build_node(parser::ParseTree::Node parser_node) {
|
||||
return nodes::Node(parser_node.get_start_point(),
|
||||
parser_node.get_end_point());
|
||||
|
|
@ -125,6 +145,33 @@ nodes::Literal build_null_literal(parser::ParseTree::Node parser_node) {
|
|||
|
||||
// --- identifiers
|
||||
|
||||
nodes::Identifier build_identifier(parser::ParseTree::Node parser_node) {
|
||||
tokens::Type type = tokens::string_to_type(parser_node.get_type());
|
||||
|
||||
switch (type) {
|
||||
case tokens::Type::PLACEHOLDER:
|
||||
return build_placeholder(parser_node);
|
||||
case tokens::Type::SIMPLE_NAME_IDENTIFIER:
|
||||
return build_simple_name(parser_node);
|
||||
case tokens::Type::SIMPLE_TYPE_IDENTIFIER:
|
||||
return build_simple_type(parser_node);
|
||||
case tokens::Type::TYPECLASS_IDENTIFIER:
|
||||
return build_typeclass(parser_node);
|
||||
case tokens::Type::ARGUMENT_NAME_IDENTIFIER:
|
||||
return build_argument_name(parser_node);
|
||||
case tokens::Type::ARGUMENT_TYPE_IDENTIFIER:
|
||||
return build_argument_type(parser_node);
|
||||
// used as string
|
||||
// case tokens::Type::ANNOTATION_IDENTIFIER:
|
||||
// return build_annotation(parser_node);
|
||||
default:
|
||||
error_handling::handle_parsing_error("Unexprected identifier node type",
|
||||
parser_node);
|
||||
}
|
||||
error_handling::handle_general_error("Unreachable");
|
||||
exit(1); // unreachable
|
||||
}
|
||||
|
||||
nodes::Identifier build_simple_name(parser::ParseTree::Node parser_node) {
|
||||
return nodes::Identifier(build_node(parser_node),
|
||||
nodes::Identifier::SIMPLE_NAME,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue