mirror of
https://codeberg.org/ProgramSnail/lang.git
synced 2026-03-11 20:27:10 +00:00
expression builders finished, type builders started
This commit is contained in:
parent
6682e0beb1
commit
535d8d26c3
12 changed files with 909 additions and 76 deletions
|
|
@ -5,41 +5,41 @@
|
|||
|
||||
namespace builders {
|
||||
|
||||
nodes::Node buildNode(parser::ParseTree::Node parser_node);
|
||||
nodes::Node build_node(parser::ParseTree::Node parser_node);
|
||||
|
||||
// --- literals
|
||||
|
||||
nodes::Literal buildFloatNumberLiteral(parser::ParseTree::Node parser_node);
|
||||
nodes::Literal build_float_number_literal(parser::ParseTree::Node parser_node);
|
||||
|
||||
nodes::Literal buildNumberLiteral(parser::ParseTree::Node parser_node);
|
||||
nodes::Literal build_number_literal(parser::ParseTree::Node parser_node);
|
||||
|
||||
nodes::Literal buildStringLiteral(parser::ParseTree::Node parser_node);
|
||||
nodes::Literal build_string_literal(parser::ParseTree::Node parser_node);
|
||||
|
||||
nodes::Literal buildCharLiteral(parser::ParseTree::Node parser_node);
|
||||
nodes::Literal build_char_literal(parser::ParseTree::Node parser_node);
|
||||
|
||||
nodes::Literal buildBoolLiteral(parser::ParseTree::Node parser_node);
|
||||
nodes::Literal build_bool_literal(parser::ParseTree::Node parser_node);
|
||||
|
||||
nodes::Literal buildUnitLiteral(parser::ParseTree::Node parser_node);
|
||||
nodes::Literal build_unit_literal(parser::ParseTree::Node parser_node);
|
||||
|
||||
nodes::Literal buildNullLiteral(parser::ParseTree::Node parser_node);
|
||||
nodes::Literal build_null_literal(parser::ParseTree::Node parser_node);
|
||||
|
||||
// --- identifiers
|
||||
|
||||
nodes::Identifier buildSimpleName(parser::ParseTree::Node parser_node);
|
||||
nodes::Identifier build_simple_name(parser::ParseTree::Node parser_node);
|
||||
|
||||
nodes::Identifier buildSimpleType(parser::ParseTree::Node parser_node);
|
||||
nodes::Identifier build_simple_type(parser::ParseTree::Node parser_node);
|
||||
|
||||
nodes::Identifier buildTypeclass(parser::ParseTree::Node parser_node);
|
||||
nodes::Identifier build_typeclass(parser::ParseTree::Node parser_node);
|
||||
|
||||
nodes::Identifier buildArgumentName(parser::ParseTree::Node parser_node);
|
||||
nodes::Identifier build_argument_name(parser::ParseTree::Node parser_node);
|
||||
|
||||
nodes::Identifier buildArgumentType(parser::ParseTree::Node parser_node);
|
||||
nodes::Identifier build_argument_type(parser::ParseTree::Node parser_node);
|
||||
|
||||
// Annotations are used as strings
|
||||
std::string buildAnnotation(parser::ParseTree::Node parser_node);
|
||||
std::string build_annotation(parser::ParseTree::Node parser_node);
|
||||
|
||||
nodes::Identifier buildOperator(parser::ParseTree::Node parser_node);
|
||||
nodes::Identifier build_operator(parser::ParseTree::Node parser_node);
|
||||
|
||||
nodes::Identifier buildPlaceholder(parser::ParseTree::Node parser_node);
|
||||
nodes::Identifier build_placeholder(parser::ParseTree::Node parser_node);
|
||||
|
||||
} // namespace builders
|
||||
|
|
|
|||
|
|
@ -3,12 +3,14 @@
|
|||
#include "doc_nodes.hpp"
|
||||
#include "tree_sitter_wrapper.hpp"
|
||||
|
||||
#include <unordered_set>
|
||||
#include <vector>
|
||||
|
||||
namespace builders {
|
||||
|
||||
nodes::SymbolDocs buildSymbolDocs(
|
||||
nodes::SymbolDocs build_symbol_docs(
|
||||
parser::ParseTree::Node description_parser_node,
|
||||
const std::vector<parser::ParseTree::Node> &annotation_parser_nodes);
|
||||
const std::vector<parser::ParseTree::Node> &annotation_parser_nodes,
|
||||
const std::unordered_set<std::string> &annotations);
|
||||
|
||||
} // namespace builders
|
||||
|
|
|
|||
70
include/error_handling.hpp
Normal file
70
include/error_handling.hpp
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
#pragma once
|
||||
#include "basic_nodes.hpp"
|
||||
#include "tree_sitter_wrapper.hpp"
|
||||
#include <iostream>
|
||||
|
||||
namespace error_handling {
|
||||
|
||||
inline void print_position(std::ostream &out,
|
||||
std::pair<size_t, size_t> start_position,
|
||||
std::pair<size_t, size_t> end_position) {
|
||||
out << '[' << start_position.first + 1 << ", " << start_position.second + 1
|
||||
<< "] - [" << end_position.first + 1 << ", " << end_position.second + 1
|
||||
<< ']';
|
||||
}
|
||||
|
||||
inline void handle_general_error(const std::string &message) {
|
||||
std::cerr << "\x1b[1;31mGeneral Error:\x1b[0m " << message << ".\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
inline void
|
||||
handle_internal_error(const std::string &message, const std::string &place,
|
||||
std::optional<nodes::Node> node = std::nullopt) {
|
||||
std::cerr << "\x1b[1;31mInternal Error:\x1b[0m " << message << " at "
|
||||
<< place;
|
||||
if (node.has_value()) {
|
||||
std::cerr << ", at ";
|
||||
print_position(std::cerr, node.value().get_start_position(),
|
||||
node.value().get_end_position());
|
||||
}
|
||||
std::cerr << ".\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
inline void handle_parsing_error(const std::string &message,
|
||||
parser::ParseTree::Node parse_node) {
|
||||
std::cerr << "\x1b[1;31mParsing Error:\x1b[0m " << message << " at ";
|
||||
print_position(std::cerr, parse_node.get_start_point(),
|
||||
parse_node.get_end_point());
|
||||
std::cerr << ".\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
inline void handle_typecheck_error(const std::string &message,
|
||||
nodes::Node node) {
|
||||
std::cerr << "\x1b[1;31mTypecheck Error:\x1b[0m " << message << " at ";
|
||||
print_position(std::cerr, node.get_start_position(), node.get_end_position());
|
||||
std::cerr << ".\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
inline void handle_runtime_error(const std::string &message, nodes::Node node) {
|
||||
std::cerr << "\x1b[1;31mRuntime Error:\x1b[0m " << message << " at ";
|
||||
print_position(std::cerr, node.get_start_position(), node.get_end_position());
|
||||
std::cerr << ".\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
inline void handle_names_error(const std::string &message, nodes::Node node) {
|
||||
std::cerr << "\x1b[1;31mNames Error:\x1b[0m " << message << " at ";
|
||||
print_position(std::cerr, node.get_start_position(), node.get_end_position());
|
||||
std::cerr << ".\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
template <typename T> inline void debug_print(const T &value) {
|
||||
std::cerr << "\x1b[1;33mDebug:\x1b[0m " << value << '\n';
|
||||
}
|
||||
|
||||
} // namespace error_handling
|
||||
|
|
@ -1,3 +1,77 @@
|
|||
#pragma once
|
||||
|
||||
namespace builders {} // namespace builders
|
||||
#include "expression_nodes.hpp"
|
||||
#include "tree_sitter_wrapper.hpp"
|
||||
|
||||
namespace builders {
|
||||
|
||||
// --- flow control
|
||||
|
||||
nodes::ExpressionProxy
|
||||
build_expression(parser::ParseTree::Node parse_node,
|
||||
nodes::ExpressionStorage& expression_storage);
|
||||
|
||||
nodes::Match build_match(parser::ParseTree::Node parse_node,
|
||||
nodes::ExpressionStorage& expression_storage);
|
||||
|
||||
nodes::Condition build_condition(parser::ParseTree::Node parse_node,
|
||||
nodes::ExpressionStorage& expression_storage);
|
||||
|
||||
nodes::Loop build_loop(parser::ParseTree::Node parse_node,
|
||||
nodes::ExpressionStorage& expression_storage);
|
||||
|
||||
// --- operators
|
||||
|
||||
nodes::NameExpression
|
||||
build_comma_expression(parser::ParseTree::Node parse_node,
|
||||
nodes::ExpressionStorage& expression_storage);
|
||||
|
||||
nodes::NameExpression
|
||||
build_operator_expression(parser::ParseTree::Node parse_node,
|
||||
nodes::ExpressionStorage& expression_storage);
|
||||
|
||||
// --- continers
|
||||
|
||||
nodes::Container build_block(parser::ParseTree::Node parse_node,
|
||||
nodes::ExpressionStorage &expression_storage);
|
||||
|
||||
nodes::Container build_array(parser::ParseTree::Node parse_node,
|
||||
nodes::ExpressionStorage& expression_storage);
|
||||
|
||||
// --- modifiers
|
||||
|
||||
nodes::Return build_return(parser::ParseTree::Node parse_node,
|
||||
nodes::ExpressionStorage& expression_storage);
|
||||
|
||||
nodes::NameDefinition build_name_definition(parser::ParseTree::Node parse_node);
|
||||
|
||||
nodes::Access build_array_access(parser::ParseTree::Node parse_node,
|
||||
nodes::ExpressionStorage& expression_storage);
|
||||
|
||||
nodes::Access build_tuple_access(parser::ParseTree::Node parse_node,
|
||||
nodes::ExpressionStorage& expression_storage);
|
||||
|
||||
nodes::LoopControl build_loop_control(parser::ParseTree::Node parse_node);
|
||||
|
||||
nodes::ModifierExpression
|
||||
build_reference_expression(parser::ParseTree::Node parse_node,
|
||||
nodes::ExpressionStorage& expression_storage);
|
||||
|
||||
nodes::ModifierExpression
|
||||
build_suffix_expression(parser::ParseTree::Node parse_node,
|
||||
nodes::ExpressionStorage& expression_storage);
|
||||
|
||||
// --- other
|
||||
|
||||
nodes::NameExpression
|
||||
build_name_expression(parser::ParseTree::Node parse_node,
|
||||
nodes::ExpressionStorage& expression_storage);
|
||||
|
||||
nodes::Constructor
|
||||
build_constructor(parser::ParseTree::Node parse_node,
|
||||
nodes::ExpressionStorage& expression_storage);
|
||||
|
||||
nodes::Lambda build_lambda(parser::ParseTree::Node parse_node,
|
||||
nodes::ExpressionStorage& expression_storage);
|
||||
|
||||
} // namespace builders
|
||||
|
|
|
|||
|
|
@ -52,17 +52,23 @@ proxy_to_expr_optional(const std::optional<nodes::ExpressionProxy> &proxy) {
|
|||
} // namespace utils
|
||||
|
||||
// --- flow control
|
||||
|
||||
class Match : public Node {
|
||||
public:
|
||||
class Case : public Node {
|
||||
public:
|
||||
Case(Node node, bool match_left_with_right, ExpressionProxy value,
|
||||
enum CaseType {
|
||||
PATTERN_VALUE,
|
||||
VALUE_PATTERN,
|
||||
};
|
||||
|
||||
Case(Node node, CaseType case_type, ExpressionProxy value,
|
||||
std::optional<ExpressionProxy> condition = std::nullopt,
|
||||
std::optional<ExpressionProxy> expression = std::nullopt)
|
||||
: Node(node), match_left_with_right_(match_left_with_right),
|
||||
value_(value), condition_(condition), expression_(expression) {}
|
||||
: Node(node), case_type_(case_type), value_(value),
|
||||
condition_(condition), expression_(expression) {}
|
||||
|
||||
bool match_left_with_right() const { return match_left_with_right_; }
|
||||
CaseType case_type() const { return case_type_; }
|
||||
|
||||
Expression *get_value() { return value_.get(); }
|
||||
|
||||
|
|
@ -85,7 +91,7 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
bool match_left_with_right_;
|
||||
CaseType case_type_;
|
||||
ExpressionProxy value_;
|
||||
std::optional<ExpressionProxy> condition_;
|
||||
std::optional<ExpressionProxy> expression_;
|
||||
|
|
@ -212,6 +218,7 @@ private:
|
|||
};
|
||||
|
||||
// --- containers
|
||||
|
||||
class Container : public Node {
|
||||
public:
|
||||
enum ContainerType {
|
||||
|
|
@ -244,6 +251,7 @@ private:
|
|||
};
|
||||
|
||||
// --- modifiers
|
||||
|
||||
class Return : public Node {
|
||||
public:
|
||||
enum ReturnType {
|
||||
|
|
@ -337,10 +345,11 @@ private:
|
|||
class ModifierExpression : public Node {
|
||||
public:
|
||||
enum Modifier {
|
||||
REFERENCE, // <> x
|
||||
MOVE, // <- x
|
||||
IF_VALUE, // x?
|
||||
VALUE_OR_PANIC, // x!
|
||||
OUT, // -> x
|
||||
IN, // <- x
|
||||
REF, // <> x
|
||||
OR_FALSE, // x?
|
||||
OR_PANIC, // x!
|
||||
};
|
||||
|
||||
ModifierExpression(Node node, Modifier modifier, ExpressionProxy expression)
|
||||
|
|
@ -359,11 +368,16 @@ private:
|
|||
};
|
||||
|
||||
// --- other
|
||||
|
||||
class NameExpression : public Node {
|
||||
public:
|
||||
template <typename T>
|
||||
NameExpression(Node node, T &&name)
|
||||
: Node(node), name_(std::forward<T>(name)) {}
|
||||
|
||||
template <typename T, typename U, typename V>
|
||||
NameExpression(Node node, T &&name, U &&arguments = {},
|
||||
V &&prefix = std::nullopt, bool is_point_call = false)
|
||||
NameExpression(Node node, T &&name, U &&arguments, V &&prefix,
|
||||
bool is_point_call = false)
|
||||
: Node(node), name_(std::forward<T>(name)),
|
||||
arguments_(std::forward<U>(arguments)),
|
||||
prefix_(std::forward<V>(prefix)), is_point_call_(is_point_call) {}
|
||||
|
|
@ -372,19 +386,16 @@ public:
|
|||
|
||||
const std::string *get_name() const { return name_.get(); }
|
||||
|
||||
std::optional<std::pair<std::string *, std::string *>> get_prefix() {
|
||||
std::optional<const Type *> get_prefix() {
|
||||
if (prefix_.has_value()) {
|
||||
return std::pair<std::string *, std::string *>{
|
||||
prefix_.value().first.get(), prefix_.value().second.get()};
|
||||
return &prefix_.value();
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
std::optional<std::pair<const std::string *, const std::string *>>
|
||||
get_prefix() const {
|
||||
std::optional<const Type *> get_prefix() const {
|
||||
if (prefix_.has_value()) {
|
||||
return std::pair<const std::string *, const std::string *>{
|
||||
prefix_.value().first.get(), prefix_.value().second.get()};
|
||||
return &prefix_.value();
|
||||
}
|
||||
return std::nullopt;
|
||||
}
|
||||
|
|
@ -420,7 +431,7 @@ private:
|
|||
std::vector<std::pair<std::optional<std::string>, ExpressionProxy>>
|
||||
arguments_;
|
||||
// universal function call syntax
|
||||
std::optional<std::pair<Identifier, Identifier>> prefix_;
|
||||
std::optional<const Type> prefix_;
|
||||
// for static methods
|
||||
bool is_point_call_ = false; // x.f ... or f x ...
|
||||
};
|
||||
|
|
@ -429,7 +440,7 @@ private:
|
|||
template NameExpression::NameExpression(
|
||||
Node, Identifier &&,
|
||||
std::vector<std::pair<std::optional<std::string>, ExpressionProxy>> &&,
|
||||
std::optional<std::pair<Identifier, Identifier>> &&, bool);
|
||||
std::optional<const Type> &&, bool);
|
||||
|
||||
class Constructor : public Node {
|
||||
public:
|
||||
|
|
@ -546,7 +557,10 @@ private:
|
|||
ModifierExpression,
|
||||
|
||||
// --- other
|
||||
NameExpression, Constructor, Lambda
|
||||
NameExpression, Constructor, Lambda,
|
||||
|
||||
// --- literal
|
||||
Literal
|
||||
|
||||
>
|
||||
expression_;
|
||||
|
|
|
|||
20
include/type_builders.hpp
Normal file
20
include/type_builders.hpp
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
#pragma once
|
||||
|
||||
#include "tree_sitter_wrapper.hpp"
|
||||
#include "type_nodes.hpp"
|
||||
|
||||
namespace builders {
|
||||
|
||||
// nodes::Type build_type(parser::ParseTree::Node parse_node,
|
||||
// nodes::TypeStorage &type_storage);
|
||||
|
||||
nodes::TypeProxy build_type_proxy(parser::ParseTree::Node parse_node,
|
||||
nodes::TypeStorage &type_storage);
|
||||
|
||||
nodes::TupleType build_tuple_type(parser::ParseTree::Node parse_node,
|
||||
nodes::TypeStorage &type_storage);
|
||||
|
||||
nodes::VariantType build_variant_type(parser::ParseTree::Node parse_node,
|
||||
nodes::TypeStorage &type_storage);
|
||||
|
||||
} // namespace builders
|
||||
Loading…
Add table
Add a link
Reference in a new issue