diff --git a/src/spider/.clang-format b/src/spider/.clang-format index 1b2d9229d..1a2a1acf4 100644 --- a/src/spider/.clang-format +++ b/src/spider/.clang-format @@ -7,7 +7,7 @@ IncludeCategories: - Regex: "^" diff --git a/src/spider/CMakeLists.txt b/src/spider/CMakeLists.txt index 534e31315..068d7b5aa 100644 --- a/src/spider/CMakeLists.txt +++ b/src/spider/CMakeLists.txt @@ -230,6 +230,7 @@ set(SPIDER_TDL_SHARED_SOURCES ) set(SPIDER_TDL_SHARED_HEADERS + tdl/Error.hpp tdl/parser/ast/Node.hpp tdl/parser/ast/FloatSpec.hpp tdl/parser/ast/IntSpec.hpp @@ -249,8 +250,9 @@ set(SPIDER_TDL_SHARED_HEADERS tdl/parser/ast/node_impl/type_impl/primitive_impl/Int.hpp tdl/parser/ast/node_impl/type_impl/Struct.hpp tdl/parser/ast/nodes.hpp - tdl/parser/ast/SourceLocation.hpp tdl/parser/ast/utils.hpp + tdl/parser/ErrorListener.hpp + tdl/parser/SourceLocation.hpp CACHE INTERNAL "spider task definition language shared header files" ) diff --git a/src/spider/tdl/Error.hpp b/src/spider/tdl/Error.hpp new file mode 100644 index 000000000..45c4504dd --- /dev/null +++ b/src/spider/tdl/Error.hpp @@ -0,0 +1,45 @@ +#ifndef SPIDER_TDL_ERROR_HPP +#define SPIDER_TDL_ERROR_HPP + +#include +#include +#include +#include +#include + +#include + +namespace spider::tdl { +/** + * Represents a generic error in the TDL compiler. + */ +class Error { +public: + // Constructor + Error(std::string message, + parser::SourceLocation source_location, + std::optional error_code = std::nullopt) + : m_message{std::move(message)}, + m_source_location{source_location}, + m_error_code{error_code} {} + + // Methods + [[nodiscard]] auto get_message() const noexcept -> std::string_view { return m_message; } + + [[nodiscard]] auto get_source_location() const noexcept -> parser::SourceLocation { + return m_source_location; + } + + [[nodiscard]] auto get_error_code() const noexcept -> std::optional { + return m_error_code; + } + +private: + // Variables + std::string m_message; + parser::SourceLocation m_source_location; + std::optional m_error_code; +}; +} // namespace spider::tdl + +#endif // SPIDER_TDL_ERROR_HPP diff --git a/src/spider/tdl/parser/ErrorListener.hpp b/src/spider/tdl/parser/ErrorListener.hpp new file mode 100644 index 000000000..110d808ef --- /dev/null +++ b/src/spider/tdl/parser/ErrorListener.hpp @@ -0,0 +1,58 @@ +#ifndef SPIDER_TDL_PARSER_ERRORLISTENER_HPP +#define SPIDER_TDL_PARSER_ERRORLISTENER_HPP + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +namespace spider::tdl::parser { +class ErrorListener : public antlr4::BaseErrorListener { +public: + // Constructor + explicit ErrorListener(std::string tag) : m_tag{std::move(tag)} {} + + // Methods implementing `antlr4::BaseErrorListener` + auto syntaxError( + [[maybe_unused]] antlr4::Recognizer* recognizer, + [[maybe_unused]] antlr4::Token* offending_symbol, + size_t line, + size_t char_position_in_line, + std::string const& msg, + [[maybe_unused]] std::exception_ptr e + ) -> void override { + m_error.emplace( + fmt::format("{}: {}", m_tag, msg), + SourceLocation{line, char_position_in_line}, + std::nullopt + ); + } + + // Methods + [[nodiscard]] auto has_error() const -> bool { return m_error.has_value(); } + + /** + * @return A reference to the error. The caller must ensure that `has_error()` is true before + * calling this method. + */ + [[nodiscard]] auto error() const -> Error const& { + // We require the caller to check `has_error()` before calling this method, which ensures + // the optional var has a value. + // NOLINTNEXTLINE(bugprone-unchecked-optional-access) + return m_error.value(); + } + +private: + std::string m_tag; + std::optional m_error; +}; +} // namespace spider::tdl::parser + +#endif // SPIDER_TDL_PARSER_ERRORLISTENER_HPP diff --git a/src/spider/tdl/parser/ast/SourceLocation.hpp b/src/spider/tdl/parser/SourceLocation.hpp similarity index 66% rename from src/spider/tdl/parser/ast/SourceLocation.hpp rename to src/spider/tdl/parser/SourceLocation.hpp index 63ff05add..c64e871a1 100644 --- a/src/spider/tdl/parser/ast/SourceLocation.hpp +++ b/src/spider/tdl/parser/SourceLocation.hpp @@ -1,9 +1,9 @@ -#ifndef SPIDER_TDL_AST_SOURCELOCATION_HPP -#define SPIDER_TDL_AST_SOURCELOCATION_HPP +#ifndef SPIDER_TDL_PARSER_SOURCELOCATION_HPP +#define SPIDER_TDL_PARSER_SOURCELOCATION_HPP #include -namespace spider::tdl::parser::ast { +namespace spider::tdl::parser { class SourceLocation { public: // Constructor @@ -19,6 +19,6 @@ class SourceLocation { size_t m_line; size_t m_column; }; -} // namespace spider::tdl::parser::ast +} // namespace spider::tdl::parser -#endif // SPIDER_TDL_AST_SOURCELOCATION_HPP +#endif // SPIDER_TDL_PARSER_SOURCELOCATION_HPP diff --git a/src/spider/tdl/parser/ast/Node.hpp b/src/spider/tdl/parser/ast/Node.hpp index 4992d15ec..032f8eb41 100644 --- a/src/spider/tdl/parser/ast/Node.hpp +++ b/src/spider/tdl/parser/ast/Node.hpp @@ -11,7 +11,7 @@ #include #include -#include +#include namespace spider::tdl::parser::ast { /** diff --git a/src/spider/tdl/parser/ast/node_impl/Function.cpp b/src/spider/tdl/parser/ast/node_impl/Function.cpp index 8af8233f9..50a585f9c 100644 --- a/src/spider/tdl/parser/ast/node_impl/Function.cpp +++ b/src/spider/tdl/parser/ast/node_impl/Function.cpp @@ -17,8 +17,8 @@ #include #include #include -#include #include +#include using spider::tdl::parser::ast::node_impl::Function; using FunctionErrorCodeCategory = ystdlib::error_handling::ErrorCategory; diff --git a/src/spider/tdl/parser/ast/node_impl/Function.hpp b/src/spider/tdl/parser/ast/node_impl/Function.hpp index 2d41dd6ff..32807c70a 100644 --- a/src/spider/tdl/parser/ast/node_impl/Function.hpp +++ b/src/spider/tdl/parser/ast/node_impl/Function.hpp @@ -16,7 +16,7 @@ #include #include #include -#include +#include namespace spider::tdl::parser::ast::node_impl { class Function : public Node { diff --git a/src/spider/tdl/parser/ast/node_impl/Identifier.hpp b/src/spider/tdl/parser/ast/node_impl/Identifier.hpp index 225010ddf..268279338 100644 --- a/src/spider/tdl/parser/ast/node_impl/Identifier.hpp +++ b/src/spider/tdl/parser/ast/node_impl/Identifier.hpp @@ -10,7 +10,7 @@ #include #include -#include +#include namespace spider::tdl::parser::ast::node_impl { class Identifier : public Node { diff --git a/src/spider/tdl/parser/ast/node_impl/NamedVar.cpp b/src/spider/tdl/parser/ast/node_impl/NamedVar.cpp index 83e55d651..8a11d9576 100644 --- a/src/spider/tdl/parser/ast/node_impl/NamedVar.cpp +++ b/src/spider/tdl/parser/ast/node_impl/NamedVar.cpp @@ -11,8 +11,8 @@ #include #include #include -#include #include +#include namespace spider::tdl::parser::ast::node_impl { auto NamedVar::create( diff --git a/src/spider/tdl/parser/ast/node_impl/NamedVar.hpp b/src/spider/tdl/parser/ast/node_impl/NamedVar.hpp index 6e92b7d60..ea19cd35d 100644 --- a/src/spider/tdl/parser/ast/node_impl/NamedVar.hpp +++ b/src/spider/tdl/parser/ast/node_impl/NamedVar.hpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include namespace spider::tdl::parser::ast::node_impl { /** diff --git a/src/spider/tdl/parser/ast/node_impl/Namespace.cpp b/src/spider/tdl/parser/ast/node_impl/Namespace.cpp index a82300e64..9c75e9e80 100644 --- a/src/spider/tdl/parser/ast/node_impl/Namespace.cpp +++ b/src/spider/tdl/parser/ast/node_impl/Namespace.cpp @@ -17,8 +17,8 @@ #include #include #include -#include #include +#include using spider::tdl::parser::ast::node_impl::Namespace; using NamespaceErrorCodeCategory = ystdlib::error_handling::ErrorCategory; diff --git a/src/spider/tdl/parser/ast/node_impl/Namespace.hpp b/src/spider/tdl/parser/ast/node_impl/Namespace.hpp index 2500f8e22..282cdc793 100644 --- a/src/spider/tdl/parser/ast/node_impl/Namespace.hpp +++ b/src/spider/tdl/parser/ast/node_impl/Namespace.hpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include namespace spider::tdl::parser::ast::node_impl { /** diff --git a/src/spider/tdl/parser/ast/node_impl/StructSpec.cpp b/src/spider/tdl/parser/ast/node_impl/StructSpec.cpp index f38b380a3..62a33d140 100644 --- a/src/spider/tdl/parser/ast/node_impl/StructSpec.cpp +++ b/src/spider/tdl/parser/ast/node_impl/StructSpec.cpp @@ -16,8 +16,8 @@ #include #include #include -#include #include +#include using spider::tdl::parser::ast::node_impl::StructSpec; using StructSpecErrorCodeCategory diff --git a/src/spider/tdl/parser/ast/node_impl/StructSpec.hpp b/src/spider/tdl/parser/ast/node_impl/StructSpec.hpp index bdd354be1..1bbd2f32d 100644 --- a/src/spider/tdl/parser/ast/node_impl/StructSpec.hpp +++ b/src/spider/tdl/parser/ast/node_impl/StructSpec.hpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include namespace spider::tdl::parser::ast::node_impl { /** diff --git a/src/spider/tdl/parser/ast/node_impl/Type.hpp b/src/spider/tdl/parser/ast/node_impl/Type.hpp index e7ff47ca1..3155bcf62 100644 --- a/src/spider/tdl/parser/ast/node_impl/Type.hpp +++ b/src/spider/tdl/parser/ast/node_impl/Type.hpp @@ -2,7 +2,7 @@ #define SPIDER_TDL_PARSER_AST_NODE_IMPL_TYPE_HPP #include -#include +#include namespace spider::tdl::parser::ast::node_impl { // Abstract base class for all type nodes in the AST. diff --git a/src/spider/tdl/parser/ast/node_impl/type_impl/Container.hpp b/src/spider/tdl/parser/ast/node_impl/type_impl/Container.hpp index 33b70dbb5..257612200 100644 --- a/src/spider/tdl/parser/ast/node_impl/type_impl/Container.hpp +++ b/src/spider/tdl/parser/ast/node_impl/type_impl/Container.hpp @@ -2,7 +2,7 @@ #define SPIDER_TDL_PARSER_AST_NODE_IMPL_TYPE_IMPL_CONTAINER_HPP #include -#include +#include namespace spider::tdl::parser::ast::node_impl::type_impl { // Abstract base class for all container type nodes in the AST. diff --git a/src/spider/tdl/parser/ast/node_impl/type_impl/Primitive.hpp b/src/spider/tdl/parser/ast/node_impl/type_impl/Primitive.hpp index 144639c93..b76e3ebfa 100644 --- a/src/spider/tdl/parser/ast/node_impl/type_impl/Primitive.hpp +++ b/src/spider/tdl/parser/ast/node_impl/type_impl/Primitive.hpp @@ -2,7 +2,7 @@ #define SPIDER_TDL_PARSER_AST_NODE_IMPL_TYPE_IMPL_PRIMITIVE_HPP #include -#include +#include namespace spider::tdl::parser::ast::node_impl::type_impl { // Abstract base class for all primitive type nodes in the AST. diff --git a/src/spider/tdl/parser/ast/node_impl/type_impl/Struct.cpp b/src/spider/tdl/parser/ast/node_impl/type_impl/Struct.cpp index a3af9be3f..3bf488d5c 100644 --- a/src/spider/tdl/parser/ast/node_impl/type_impl/Struct.cpp +++ b/src/spider/tdl/parser/ast/node_impl/type_impl/Struct.cpp @@ -12,8 +12,8 @@ #include #include #include -#include #include +#include using spider::tdl::parser::ast::node_impl::type_impl::Struct; using StructErrorCodeCategory = ystdlib::error_handling::ErrorCategory; diff --git a/src/spider/tdl/parser/ast/node_impl/type_impl/Struct.hpp b/src/spider/tdl/parser/ast/node_impl/type_impl/Struct.hpp index 6f26e77a4..305d47eb1 100644 --- a/src/spider/tdl/parser/ast/node_impl/type_impl/Struct.hpp +++ b/src/spider/tdl/parser/ast/node_impl/type_impl/Struct.hpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include namespace spider::tdl::parser::ast::node_impl::type_impl { class Struct : public Type { diff --git a/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/List.cpp b/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/List.cpp index ab3e11aab..dd77f4cf0 100644 --- a/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/List.cpp +++ b/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/List.cpp @@ -10,8 +10,8 @@ #include #include -#include #include +#include namespace spider::tdl::parser::ast::node_impl::type_impl::container_impl { auto List::create(std::unique_ptr element_type, SourceLocation source_location) diff --git a/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/List.hpp b/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/List.hpp index 964b3b54e..f9ab6a4f9 100644 --- a/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/List.hpp +++ b/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/List.hpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include namespace spider::tdl::parser::ast::node_impl::type_impl::container_impl { class List : public Container { diff --git a/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/Map.cpp b/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/Map.cpp index f518d329c..5f13b542b 100644 --- a/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/Map.cpp +++ b/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/Map.cpp @@ -14,8 +14,8 @@ #include #include #include -#include #include +#include using spider::tdl::parser::ast::node_impl::type_impl::container_impl::Map; using MapErrorCodeCategory = ystdlib::error_handling::ErrorCategory; diff --git a/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/Map.hpp b/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/Map.hpp index c9d0c6459..c19e27253 100644 --- a/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/Map.hpp +++ b/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/Map.hpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include namespace spider::tdl::parser::ast::node_impl::type_impl::container_impl { class Map : public Container { diff --git a/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/Tuple.cpp b/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/Tuple.cpp index e1423e854..aa59e8969 100644 --- a/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/Tuple.cpp +++ b/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/Tuple.cpp @@ -13,8 +13,8 @@ #include #include -#include #include +#include namespace spider::tdl::parser::ast::node_impl::type_impl::container_impl { auto Tuple::create(std::vector> elements, SourceLocation source_location) diff --git a/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/Tuple.hpp b/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/Tuple.hpp index 1981bf51a..fb68834e5 100644 --- a/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/Tuple.hpp +++ b/src/spider/tdl/parser/ast/node_impl/type_impl/container_impl/Tuple.hpp @@ -10,7 +10,7 @@ #include #include -#include +#include namespace spider::tdl::parser::ast::node_impl::type_impl::container_impl { class Tuple : public Container { diff --git a/src/spider/tdl/parser/ast/node_impl/type_impl/primitive_impl/Bool.hpp b/src/spider/tdl/parser/ast/node_impl/type_impl/primitive_impl/Bool.hpp index 1599c6e48..d04c55626 100644 --- a/src/spider/tdl/parser/ast/node_impl/type_impl/primitive_impl/Bool.hpp +++ b/src/spider/tdl/parser/ast/node_impl/type_impl/primitive_impl/Bool.hpp @@ -9,7 +9,7 @@ #include #include -#include +#include namespace spider::tdl::parser::ast::node_impl::type_impl::primitive_impl { class Bool : public Primitive { diff --git a/src/spider/tdl/parser/ast/node_impl/type_impl/primitive_impl/Float.hpp b/src/spider/tdl/parser/ast/node_impl/type_impl/primitive_impl/Float.hpp index 77309f07a..810b336b9 100644 --- a/src/spider/tdl/parser/ast/node_impl/type_impl/primitive_impl/Float.hpp +++ b/src/spider/tdl/parser/ast/node_impl/type_impl/primitive_impl/Float.hpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include namespace spider::tdl::parser::ast::node_impl::type_impl::primitive_impl { class Float : public Primitive { diff --git a/src/spider/tdl/parser/ast/node_impl/type_impl/primitive_impl/Int.hpp b/src/spider/tdl/parser/ast/node_impl/type_impl/primitive_impl/Int.hpp index c0a159f7b..97eefc7e1 100644 --- a/src/spider/tdl/parser/ast/node_impl/type_impl/primitive_impl/Int.hpp +++ b/src/spider/tdl/parser/ast/node_impl/type_impl/primitive_impl/Int.hpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include namespace spider::tdl::parser::ast::node_impl::type_impl::primitive_impl { class Int : public Primitive { diff --git a/tests/tdl/test-parser-ast.cpp b/tests/tdl/test-parser-ast.cpp index 82a1dd822..040e9ae6e 100644 --- a/tests/tdl/test-parser-ast.cpp +++ b/tests/tdl/test-parser-ast.cpp @@ -25,7 +25,7 @@ #include #include #include -#include +#include namespace { /** @@ -55,7 +55,7 @@ create_named_var(std::string_view name, std::unique_ptr spider::tdl::parser::ast::SourceLocation; +[[nodiscard]] auto create_source_location() -> spider::tdl::parser::SourceLocation; auto create_struct_node(std::string_view name) -> std::unique_ptr { using spider::tdl::parser::ast::node_impl::Identifier; @@ -101,8 +101,8 @@ auto create_func(std::string_view name) -> std::unique_ptr spider::tdl::parser::ast::SourceLocation { - return spider::tdl::parser::ast::SourceLocation{0, 0}; +auto create_source_location() -> spider::tdl::parser::SourceLocation { + return {0, 0}; } TEST_CASE("test-ast-node", "[tdl][ast][Node]") {