diff --git a/src/language/ASTBuilder.cpp b/src/language/ASTBuilder.cpp index 6790f5bc6cfde884b963abee09c0a3eacf3ee1d4..22acb285c9eda3f1c026bdf5d2aa23c6a65ac660 100644 --- a/src/language/ASTBuilder.cpp +++ b/src/language/ASTBuilder.cpp @@ -237,8 +237,6 @@ using selector = and_op, or_op, xor_op, - bitand_op, - bitor_op, eq_op, multiplyeq_op, divideeq_op, diff --git a/src/language/ASTNodeBinaryOperatorExpressionBuilder.cpp b/src/language/ASTNodeBinaryOperatorExpressionBuilder.cpp index 8d710ac11005f59b3fc37862f5d9c7eac2fd996c..c14a89bec57ea1499c74094030258e4d30f488ae 100644 --- a/src/language/ASTNodeBinaryOperatorExpressionBuilder.cpp +++ b/src/language/ASTNodeBinaryOperatorExpressionBuilder.cpp @@ -42,28 +42,6 @@ struct BinOp<language::xor_op> } }; -template <> -struct BinOp<language::bitand_op> -{ - template <typename A, typename B> - PUGS_INLINE auto - eval(const A& a, const B& b) -> decltype(a & b) - { - return a & b; - } -}; - -template <> -struct BinOp<language::bitor_op> -{ - template <typename A, typename B> - PUGS_INLINE auto - eval(const A& a, const B& b) -> decltype(a | b) - { - return a | b; - } -}; - template <> struct BinOp<language::eqeq_op> { @@ -185,8 +163,7 @@ class BinaryExpressionProcessor final : public INodeProcessor // Add 'signed' when necessary to avoid signed/unsigned comparison warnings if constexpr ((not(std::is_same_v<A_DataT, bool> or std::is_same_v<B_DataT, bool>)) and (std::is_same_v<BinaryOpT, language::and_op> or std::is_same_v<BinaryOpT, language::or_op> or - std::is_same_v<BinaryOpT, language::xor_op> or std::is_same_v<BinaryOpT, language::bitand_op> or - std::is_same_v<BinaryOpT, language::bitor_op> or std::is_same_v<BinaryOpT, language::eqeq_op> or + std::is_same_v<BinaryOpT, language::xor_op> or std::is_same_v<BinaryOpT, language::eqeq_op> or std::is_same_v<BinaryOpT, language::not_eq_op> or std::is_same_v<BinaryOpT, language::lesser_op> or std::is_same_v<BinaryOpT, language::lesser_or_eq_op> or std::is_same_v<BinaryOpT, language::greater_op> or @@ -212,8 +189,7 @@ class BinaryExpressionProcessor final : public INodeProcessor } static inline const bool _is_defined{[] { - if constexpr (std::is_same_v<BinaryOpT, language::bitand_op> or std::is_same_v<BinaryOpT, language::xor_op> or - std::is_same_v<BinaryOpT, language::bitor_op>) { + if constexpr (std::is_same_v<BinaryOpT, language::xor_op>) { return std::is_same_v<std::decay_t<A_DataT>, std::decay_t<B_DataT>> and std::is_integral_v<std::decay_t<A_DataT>>; } return true; @@ -304,17 +280,13 @@ ASTNodeBinaryOperatorExpressionBuilder::ASTNodeBinaryOperatorExpressionBuilder(A set_binary_operator_processor(n, language::plus_op{}); } else if (n.is<language::minus_op>()) { set_binary_operator_processor(n, language::minus_op{}); + } else if (n.is<language::or_op>()) { set_binary_operator_processor(n, language::or_op{}); } else if (n.is<language::and_op>()) { set_binary_operator_processor(n, language::and_op{}); - } else if (n.is<language::xor_op>()) { set_binary_operator_processor(n, language::xor_op{}); - } else if (n.is<language::bitand_op>()) { - set_binary_operator_processor(n, language::bitand_op{}); - } else if (n.is<language::bitor_op>()) { - set_binary_operator_processor(n, language::bitor_op{}); } else if (n.is<language::greater_op>()) { set_binary_operator_processor(n, language::greater_op{}); diff --git a/src/language/ASTNodeDataTypeBuilder.cpp b/src/language/ASTNodeDataTypeBuilder.cpp index 088eada9b942cd38cb63ff8cbd46a99092e88c09..a7268f8a39f14964420ad1c70d153e0c07ea4e50 100644 --- a/src/language/ASTNodeDataTypeBuilder.cpp +++ b/src/language/ASTNodeDataTypeBuilder.cpp @@ -100,7 +100,7 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) } else if (n.is<language::unary_not>() or n.is<language::lesser_op>() or n.is<language::lesser_or_eq_op>() or n.is<language::greater_op>() or n.is<language::greater_or_eq_op>() or n.is<language::eqeq_op>() or n.is<language::not_eq_op>() or n.is<language::and_op>() or n.is<language::or_op>() or - n.is<language::xor_op>() or n.is<language::bitand_op>() or n.is<language::bitor_op>()) { + n.is<language::xor_op>()) { n.m_data_type = ASTNodeDataType::bool_t; } else if (n.is<language::unary_minus>() or n.is<language::unary_plus>() or n.is<language::unary_plusplus>() or n.is<language::unary_minusminus>()) { diff --git a/src/language/ASTNodeExpressionBuilder.cpp b/src/language/ASTNodeExpressionBuilder.cpp index bb56d9b78cadd9f72aba7b78fd246bf3372fcb7c..498830c75372efbb6cf438f95cc4e4bcc5979ada 100644 --- a/src/language/ASTNodeExpressionBuilder.cpp +++ b/src/language/ASTNodeExpressionBuilder.cpp @@ -295,9 +295,9 @@ build_node_type(ASTNode& n) } else if (n.is<language::multiply_op>() or n.is<language::divide_op>() or n.is<language::plus_op>() or n.is<language::minus_op>() or n.is<language::or_op>() or n.is<language::and_op>() or - n.is<language::xor_op>() or n.is<language::bitand_op>() or n.is<language::bitor_op>() or - n.is<language::greater_op>() or n.is<language::greater_or_eq_op>() or n.is<language::lesser_op>() or - n.is<language::lesser_or_eq_op>() or n.is<language::eqeq_op>() or n.is<language::not_eq_op>()) { + n.is<language::xor_op>() or n.is<language::greater_op>() or n.is<language::greater_or_eq_op>() or + n.is<language::lesser_op>() or n.is<language::lesser_or_eq_op>() or n.is<language::eqeq_op>() or + n.is<language::not_eq_op>()) { ASTNodeBinaryOperatorExpressionBuilder{n}; } else if (n.is<language::B_set>()) { diff --git a/src/language/PEGGrammar.hpp b/src/language/PEGGrammar.hpp index 56a650baa1dcd24687d99e61c920d6d547081fb1..83748365c1ba8ae2048069509744127d6a17470f 100644 --- a/src/language/PEGGrammar.hpp +++ b/src/language/PEGGrammar.hpp @@ -75,8 +75,6 @@ struct and_kw : TAO_PEGTL_KEYWORD("and") {}; struct or_kw : TAO_PEGTL_KEYWORD("or") {}; struct xor_kw : TAO_PEGTL_KEYWORD("xor") {}; -struct bitand_kw : TAO_PEGTL_KEYWORD("bitand") {}; -struct bitor_kw : TAO_PEGTL_KEYWORD("bitor") {}; struct and_eq_kw : TAO_PEGTL_KEYWORD("and_eq") {}; struct xor_eq_kw : TAO_PEGTL_KEYWORD("xor_eq") {}; @@ -113,7 +111,7 @@ struct cout_kw : TAO_PEGTL_KEYWORD("cout") {}; struct cerr_kw : TAO_PEGTL_KEYWORD("cerr") {}; struct clog_kw : TAO_PEGTL_KEYWORD("clog") {}; -struct keywork : sor < basic_type, true_kw, false_kw, do_kw, while_kw, for_kw, if_kw, else_kw, and_kw, or_kw, xor_kw, bitand_kw, bitor_kw, and_eq_kw, xor_eq_kw, or_eq_kw, break_kw, continue_kw, cout_kw, cerr_kw, clog_kw > {}; +struct keywork : sor < basic_type, true_kw, false_kw, do_kw, while_kw, for_kw, if_kw, else_kw, and_kw, or_kw, xor_kw, and_eq_kw, xor_eq_kw, or_eq_kw, break_kw, continue_kw, cout_kw, cerr_kw, clog_kw > {}; struct name : minus< identifier, keywork > {}; struct NAME : seq < name, ignored > {}; @@ -150,10 +148,7 @@ struct unary_expression : sor< seq< unary_operator, unary_expression >, struct and_op : seq< and_kw, ignored > {}; struct or_op : seq< or_kw, ignored > {}; - struct xor_op : seq< xor_kw, ignored >{}; -struct bitand_op : seq< bitand_kw, ignored >{}; -struct bitor_op : seq< bitor_kw, ignored >{}; struct eqeq_op : seq< TAO_PEGTL_STRING("=="), ignored > {}; struct not_eq_op : seq< TAO_PEGTL_STRING("!="), ignored > {}; @@ -189,13 +184,9 @@ struct compare : list_must<sum, sor< lesser_or_eq_op, greater_or_eq_op, lesser_o struct equality : list_must< compare, sor< eqeq_op, not_eq_op > >{}; -struct bitwise_and : list_must < equality, bitand_op >{}; - -struct bitwise_xor : list_must< bitwise_and, xor_op >{}; - -struct bitwise_or : list_must< bitwise_xor, bitor_op >{}; +struct bitwise_xor : list_must< equality, xor_op >{}; -struct logical_and : list_must< bitwise_or, and_op >{}; +struct logical_and : list_must< bitwise_xor, and_op >{}; struct logical_or : list_must< logical_and, or_op >{}; @@ -301,12 +292,8 @@ inline const std::string errors<language::compare>::error_message = "parse error template <> inline const std::string errors<language::equality>::error_message = "parse error, missing expression"; template <> -inline const std::string errors<language::bitwise_and>::error_message = "parse error, missing expression"; -template <> inline const std::string errors<language::bitwise_xor>::error_message = "parse error, missing expression"; template <> -inline const std::string errors<language::bitwise_or>::error_message = "parse error, missing expression"; -template <> inline const std::string errors<language::logical_and>::error_message = "parse error, missing expression"; template <> inline const std::string errors<language::logical_or>::error_message = "parse error, missing expression"; diff --git a/tests/test_ASTBuilder.cpp b/tests/test_ASTBuilder.cpp index 8807bfc6817d58444be3ae3dc8863a065a06853a..dd5afa0b72508a54a55ae5cf717ed80b3ecd0447 100644 --- a/tests/test_ASTBuilder.cpp +++ b/tests/test_ASTBuilder.cpp @@ -165,51 +165,45 @@ string s; s = "foo"; SECTION("all operators mix") { std::string_view data = R"( -1+2 and 3<= 2 * 4 - 1 == 2 or 2>=1 / 5 xor 6 bitand 7 and 2 or 1 bitor 2 <3 >7 xor -2 bitand 2 bitor + true - not false; +1+2 and 3<= 2 * 4 - 1 == 2 or 2>=1 / 5 xor 7 and 2 or 2 <3 >7 xor -2 + true - not false; )"; std::string_view result = R"( (root) `-(language::minus_op) - +-(language::bitor_op) - | +-(language::bitand_op) - | | +-(language::xor_op) - | | | +-(language::greater_op) - | | | | +-(language::lesser_op) - | | | | | +-(language::bitor_op) - | | | | | | +-(language::or_op) - | | | | | | | +-(language::and_op) - | | | | | | | | +-(language::bitand_op) - | | | | | | | | | +-(language::xor_op) - | | | | | | | | | | +-(language::greater_or_eq_op) - | | | | | | | | | | | +-(language::or_op) - | | | | | | | | | | | | +-(language::eqeq_op) - | | | | | | | | | | | | | +-(language::minus_op) - | | | | | | | | | | | | | | +-(language::lesser_or_eq_op) - | | | | | | | | | | | | | | | +-(language::and_op) - | | | | | | | | | | | | | | | | +-(language::plus_op) - | | | | | | | | | | | | | | | | | +-(language::integer:1) - | | | | | | | | | | | | | | | | | `-(language::integer:2) - | | | | | | | | | | | | | | | | `-(language::integer:3) - | | | | | | | | | | | | | | | `-(language::multiply_op) - | | | | | | | | | | | | | | | +-(language::integer:2) - | | | | | | | | | | | | | | | `-(language::integer:4) - | | | | | | | | | | | | | | `-(language::integer:1) - | | | | | | | | | | | | | `-(language::integer:2) - | | | | | | | | | | | | `-(language::integer:2) - | | | | | | | | | | | `-(language::divide_op) - | | | | | | | | | | | +-(language::integer:1) - | | | | | | | | | | | `-(language::integer:5) - | | | | | | | | | | `-(language::integer:6) - | | | | | | | | | `-(language::integer:7) - | | | | | | | | `-(language::integer:2) - | | | | | | | `-(language::integer:1) + +-(language::plus_op) + | +-(language::xor_op) + | | +-(language::greater_op) + | | | +-(language::lesser_op) + | | | | +-(language::or_op) + | | | | | +-(language::and_op) + | | | | | | +-(language::xor_op) + | | | | | | | +-(language::greater_or_eq_op) + | | | | | | | | +-(language::or_op) + | | | | | | | | | +-(language::eqeq_op) + | | | | | | | | | | +-(language::minus_op) + | | | | | | | | | | | +-(language::lesser_or_eq_op) + | | | | | | | | | | | | +-(language::and_op) + | | | | | | | | | | | | | +-(language::plus_op) + | | | | | | | | | | | | | | +-(language::integer:1) + | | | | | | | | | | | | | | `-(language::integer:2) + | | | | | | | | | | | | | `-(language::integer:3) + | | | | | | | | | | | | `-(language::multiply_op) + | | | | | | | | | | | | +-(language::integer:2) + | | | | | | | | | | | | `-(language::integer:4) + | | | | | | | | | | | `-(language::integer:1) + | | | | | | | | | | `-(language::integer:2) + | | | | | | | | | `-(language::integer:2) + | | | | | | | | `-(language::divide_op) + | | | | | | | | +-(language::integer:1) + | | | | | | | | `-(language::integer:5) + | | | | | | | `-(language::integer:7) | | | | | | `-(language::integer:2) - | | | | | `-(language::integer:3) - | | | | `-(language::integer:7) - | | | `-(language::unary_minus) - | | | `-(language::integer:2) - | | `-(language::integer:2) + | | | | | `-(language::integer:2) + | | | | `-(language::integer:3) + | | | `-(language::integer:7) + | | `-(language::unary_minus) + | | `-(language::integer:2) | `-(language::true_kw) `-(language::unary_not) `-(language::false_kw)