Refactoring: cleanup grammar and upgrade Bison

This commit is contained in:
IRBorisov 2024-05-05 15:11:10 +03:00
parent 173e38f052
commit c4db405fbe
15 changed files with 1774 additions and 1179 deletions

View File

@ -20,6 +20,7 @@ Checks: "*,\
-google-readability-todo,\
-google-global-names-in-headers,\
-readability-redundant-access-specifiers,\
-readability-redundant-member-init,\
-readability-else-after-return,\
-readability-implicit-bool-conversion,\
-readability-use-anyofallof,\

97
.vscode/settings.json vendored
View File

@ -20,9 +20,12 @@
"coredll",
"DCMAKE",
"debool",
"DECART",
"Decartian",
"defexpr",
"GNUC",
"gtest",
"ifdef",
"MSVC",
"nlohmann",
"noteq",
@ -30,6 +33,96 @@
"pybind",
"pyconcept",
"rslang",
"symmdiff"
]
"setexpr",
"struct",
"symmdiff",
"yylex",
"yylval",
"YYSTYPE",
"Булеан",
"Кардинальность",
"Родоструктурные"
],
"files.associations": {
"vector": "cpp",
"locale": "cpp",
"xlocale": "cpp",
"xlocmes": "cpp",
"xlocmon": "cpp",
"xlocnum": "cpp",
"xloctime": "cpp",
"algorithm": "cpp",
"any": "cpp",
"array": "cpp",
"atomic": "cpp",
"bit": "cpp",
"bitset": "cpp",
"cctype": "cpp",
"charconv": "cpp",
"chrono": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"codecvt": "cpp",
"compare": "cpp",
"concepts": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"exception": "cpp",
"forward_list": "cpp",
"list": "cpp",
"map": "cpp",
"set": "cpp",
"string": "cpp",
"unordered_map": "cpp",
"unordered_set": "cpp",
"filesystem": "cpp",
"format": "cpp",
"functional": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"ios": "cpp",
"iosfwd": "cpp",
"iostream": "cpp",
"istream": "cpp",
"iterator": "cpp",
"limits": "cpp",
"memory": "cpp",
"new": "cpp",
"numeric": "cpp",
"optional": "cpp",
"ostream": "cpp",
"random": "cpp",
"ranges": "cpp",
"ratio": "cpp",
"regex": "cpp",
"span": "cpp",
"sstream": "cpp",
"stack": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"typeinfo": "cpp",
"utility": "cpp",
"valarray": "cpp",
"variant": "cpp",
"xfacet": "cpp",
"xhash": "cpp",
"xiosbase": "cpp",
"xlocbuf": "cpp",
"xlocinfo": "cpp",
"xmemory": "cpp",
"xstring": "cpp",
"xtr1common": "cpp",
"xtree": "cpp",
"xutility": "cpp"
}
}

View File

@ -19,7 +19,7 @@ C++ library for manipulating concepts in formal language of advanced set theory
After changing grammar / syntax you can rebuild lexers and parser using 'scripts' folder.
- parser requires [Bison](https://www.gnu.org/software/bison/) installed
- parser requires [Bison](https://www.gnu.org/software/bison/) installed on through chocolatey: 'choco install winflexbison3'
- lexer requires [Re-flex](https://github.com/Genivia/RE-flex)
To run terminal after building docker container use command

View File

@ -1,8 +1,8 @@
// A Bison parser, made by GNU Bison 3.3.2.
// A Bison parser, made by GNU Bison 3.7.4.
// Skeleton interface for Bison LALR(1) parsers in C++
// Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
// Copyright (C) 2002-2015, 2018-2020 Free Software Foundation, Inc.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@ -38,13 +38,14 @@
// C++ LALR(1) parser skeleton written by Akim Demaille.
// Undocumented macros, especially those whose name start with YY_,
// are private implementation details. Do not rely on them.
// DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
// especially those whose name start with YY_ or yy_. They are
// private implementation details that can be changed or removed.
#ifndef YY_YY_HEADER_RSPARSERIMPL_H_INCLUDED
# define YY_YY_HEADER_RSPARSERIMPL_H_INCLUDED
// // "%code requires" blocks.
#line 36 "RSParserImpl.y" // lalr1.cc:401
// "%code requires" blocks.
#line 48 "RSParserImpl.y"
#include "ccl/rslang/SyntaxTree.h"
#include "ccl/rslang/ParserState.hpp"
@ -54,32 +55,89 @@ namespace ccl::rslang::detail {
#define YYSTYPE RawNode
struct ParserState;
int yylex(RawNode* yylval, ParserState* state);
RawNode AddNode(TokenID token, RawNode son);
RawNode AddNode(TokenID token, RawNode son1, RawNode son2);
RawNode BinaryOperation(RawNode op1, RawNode operation, RawNode op2);
RawNode UnaryOperation(RawNode operation, RawNode operand);
RawNode RemoveBrackets(RawNode br1, RawNode operand, RawNode br2);
RawNode ReplaceBrackets(TokenID token, RawNode br1, RawNode argList, RawNode br2);
RawNode BinaryOperation(RawNode op1, RawNode operation, RawNode op2);
RawNode UnaryOperation(RawNode operation, RawNode operand);
RawNode Enumeration(TokenID token, RawNode el1, RawNode el2);
RawNode Decartian(RawNode op1, RawNode decart, RawNode op2);
RawNode Quantifier(RawNode quant, RawNode declaration, RawNode domain, RawNode predicate);
RawNode FunctionDeclaration(RawNode start, RawNode argdecl, RawNode expr);
RawNode FunctionCall(RawNode function, RawNode args, RawNode rs);
RawNode FilterCall(RawNode filter, RawNode params, RawNode argument, RawNode rp);
RawNode TextOperator(RawNode oper, RawNode args, RawNode rp);
RawNode TermDeclaration(RawNode lc, RawNode declaration, RawNode domain, RawNode predicate, RawNode rc);
RawNode FullRecursion(RawNode rec, RawNode localid, RawNode domain, RawNode condition, RawNode iteration, RawNode rc);
RawNode ShortRecursion(RawNode rec, RawNode localid, RawNode domain, RawNode iteration, RawNode rc);
RawNode Imperative(RawNode imp, RawNode value, RawNode actions, RawNode rc);
RawNode Decartian(
RawNode op1,
RawNode decartian,
RawNode op2
);
int yylex(RawNode* yylval, ParserState* state);
RawNode Quantifier(
RawNode quant,
RawNode declaration,
RawNode domain,
RawNode predicate
);
RawNode FunctionDeclaration(
RawNode start,
RawNode argumentsDeclaration,
RawNode expr
);
RawNode FunctionCall(
RawNode function,
RawNode args, RawNode
rs
);
RawNode FilterCall(
RawNode filter,
RawNode params,
RawNode argument,
RawNode rp
);
RawNode TextOperator(
RawNode operatorName,
RawNode args,
RawNode rp
);
RawNode TermDeclaration(
RawNode lc,
RawNode declaration,
RawNode domain,
RawNode predicate,
RawNode rc);
RawNode FullRecursion(
RawNode rec,
RawNode declaration,
RawNode domain,
RawNode condition,
RawNode iteration,
RawNode rc
);
RawNode ShortRecursion(
RawNode rec,
RawNode declaration,
RawNode domain,
RawNode iteration,
RawNode rc
);
RawNode Imperative(
RawNode imp,
RawNode value,
RawNode actions,
RawNode rc
);
} // namespace ccl::rslang::detail
#line 83 "../header/RSParserImpl.h" // lalr1.cc:401
#line 141 "../header/RSParserImpl.h"
# include <cassert>
# include <cstdlib> // std::abort
@ -127,22 +185,20 @@ int yylex(RawNode* yylval, ParserState* state);
#ifndef YY_ATTRIBUTE
# if (defined __GNUC__ \
&& (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \
|| defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
# define YY_ATTRIBUTE(Spec) __attribute__(Spec)
#ifndef YY_ATTRIBUTE_PURE
# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
# else
# define YY_ATTRIBUTE(Spec) /* empty */
# define YY_ATTRIBUTE_PURE
# endif
#endif
#ifndef YY_ATTRIBUTE_PURE
# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__))
#endif
#ifndef YY_ATTRIBUTE_UNUSED
# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
# else
# define YY_ATTRIBUTE_UNUSED
# endif
#endif
/* Suppress unused-variable warnings by "using" E. */
@ -154,11 +210,11 @@ int yylex(RawNode* yylval, ParserState* state);
#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
/* Suppress an incorrect diagnostic about yylval being uninitialized. */
# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
_Pragma ("GCC diagnostic push") \
_Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
_Pragma ("GCC diagnostic push") \
_Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \
_Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
_Pragma ("GCC diagnostic pop")
#else
# define YY_INITIAL_VALUE(Value) Value
@ -171,6 +227,27 @@ int yylex(RawNode* yylval, ParserState* state);
# define YY_INITIAL_VALUE(Value) /* Nothing. */
#endif
#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
# define YY_IGNORE_USELESS_CAST_BEGIN \
_Pragma ("GCC diagnostic push") \
_Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
# define YY_IGNORE_USELESS_CAST_END \
_Pragma ("GCC diagnostic pop")
#endif
#ifndef YY_IGNORE_USELESS_CAST_BEGIN
# define YY_IGNORE_USELESS_CAST_BEGIN
# define YY_IGNORE_USELESS_CAST_END
#endif
# ifndef YY_CAST
# ifdef __cplusplus
# define YY_CAST(Type, Val) static_cast<Type> (Val)
# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
# else
# define YY_CAST(Type, Val) ((Type) (Val))
# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
# endif
# endif
# ifndef YY_NULLPTR
# if defined __cplusplus
# if 201103L <= __cplusplus
@ -188,9 +265,10 @@ int yylex(RawNode* yylval, ParserState* state);
# define YYDEBUG 0
#endif
#line 11 "RSParserImpl.y" // lalr1.cc:401
#line 15 "RSParserImpl.y"
namespace ccl { namespace rslang { namespace detail {
#line 194 "../header/RSParserImpl.h" // lalr1.cc:401
#line 271 "../header/RSParserImpl.h"
@ -219,88 +297,206 @@ namespace ccl { namespace rslang { namespace detail {
~syntax_error () YY_NOEXCEPT YY_NOTHROW;
};
/// Tokens.
/// Token kinds.
struct token
{
enum yytokentype
enum token_kind_type
{
RST_LOCAL = 258,
RST_GLOBAL = 259,
RST_FUNCTION = 260,
RST_PREDICATE = 261,
RST_RADICAL = 262,
RST_INTEGER = 263,
RST_INFINITY = 264,
RST_EMPTYSET = 265,
RST_PLUS = 266,
RST_MINUS = 267,
RST_MULTIPLY = 268,
RST_GREATER = 269,
RST_LESSER = 270,
RST_GREATER_OR_EQ = 271,
RST_LESSER_OR_EQ = 272,
RST_EQUAL = 273,
RST_NOTEQUAL = 274,
RST_FORALL = 275,
RST_EXISTS = 276,
RST_NOT = 277,
RST_EQUIVALENT = 278,
RST_IMPLICATION = 279,
RST_OR = 280,
RST_AND = 281,
RST_IN = 282,
RST_NOTIN = 283,
RST_SUBSET = 284,
RST_SUBOR_EQ = 285,
RST_NOTSUBSET = 286,
RST_DECART = 287,
RST_UNION = 288,
RST_INTERSECTION = 289,
RST_SET_MINUS = 290,
RST_SYMMINUS = 291,
RST_BOOLEAN = 292,
RST_BIGPR = 293,
RST_SMALLPR = 294,
RST_FILTER = 295,
RST_CARD = 296,
RST_BOOL = 297,
RST_DEBOOL = 298,
RST_RED = 299,
RST_DECLARATIVE = 300,
RST_RECURSIVE = 301,
RST_IMPERATIVE = 302,
RST_DEFINE = 303,
RST_STRUCT = 304,
RST_ASSIGN = 305,
RST_ITERATE = 306,
RST_LP = 307,
RST_RP = 308,
RST_LC = 309,
RST_RC = 310,
RST_LS = 311,
RST_RS = 312,
RST_BAR = 313,
RST_COMMA = 314,
RST_SEMICOLON = 315
RST_YYEMPTY = -2,
RST_YYEOF = 0, // "end of file"
RST_YYerror = 256, // error
RST_YYUNDEF = 257, // "invalid token"
RST_LOCAL = 258, // LOCAL
RST_GLOBAL = 259, // GLOBAL
RST_FUNCTION = 260, // FUNCTION
RST_PREDICATE = 261, // PREDICATE
RST_RADICAL = 262, // RADICAL
RST_INTEGER = 263, // INTEGER
RST_INTSET = 264, // INTSET
RST_EMPTYSET = 265, // EMPTYSET
RST_PLUS = 266, // PLUS
RST_MINUS = 267, // MINUS
RST_MULTIPLY = 268, // MULTIPLY
RST_GREATER = 269, // GREATER
RST_LESSER = 270, // LESSER
RST_GREATER_OR_EQ = 271, // GREATER_OR_EQ
RST_LESSER_OR_EQ = 272, // LESSER_OR_EQ
RST_EQUAL = 273, // EQUAL
RST_NOTEQUAL = 274, // NOTEQUAL
RST_FORALL = 275, // FORALL
RST_EXISTS = 276, // EXISTS
RST_NOT = 277, // NOT
RST_EQUIVALENT = 278, // EQUIVALENT
RST_IMPLICATION = 279, // IMPLICATION
RST_OR = 280, // OR
RST_AND = 281, // AND
RST_IN = 282, // IN
RST_NOTIN = 283, // NOTIN
RST_SUBSET = 284, // SUBSET
RST_SUBOR_EQ = 285, // SUBOR_EQ
RST_NOTSUBSET = 286, // NOTSUBSET
RST_DECART = 287, // DECART
RST_UNION = 288, // UNION
RST_INTERSECTION = 289, // INTERSECTION
RST_SET_MINUS = 290, // SET_MINUS
RST_SYMMINUS = 291, // SYMMINUS
RST_BOOLEAN = 292, // BOOLEAN
RST_BIGPR = 293, // BIGPR
RST_SMALLPR = 294, // SMALLPR
RST_FILTER = 295, // FILTER
RST_CARD = 296, // CARD
RST_BOOL = 297, // BOOL
RST_DEBOOL = 298, // DEBOOL
RST_RED = 299, // RED
RST_DECLARATIVE = 300, // DECLARATIVE
RST_RECURSIVE = 301, // RECURSIVE
RST_IMPERATIVE = 302, // IMPERATIVE
RST_DEFINE = 303, // DEFINE
RST_STRUCT = 304, // STRUCT
RST_ASSIGN = 305, // ASSIGN
RST_ITERATE = 306, // ITERATE
RST_LP = 307, // LP
RST_RP = 308, // RP
RST_LC = 309, // LC
RST_RC = 310, // RC
RST_LS = 311, // LS
RST_RS = 312, // RS
RST_BAR = 313, // BAR
RST_COMMA = 314, // COMMA
RST_SEMICOLON = 315 // SEMICOLON
};
/// Backward compatibility alias (Bison 3.6).
typedef token_kind_type yytokentype;
};
/// Token kind, as returned by yylex.
typedef token::yytokentype token_kind_type;
/// Backward compatibility alias (Bison 3.6).
typedef token_kind_type token_type;
/// Symbol kinds.
struct symbol_kind
{
enum symbol_kind_type
{
YYNTOKENS = 61, ///< Number of tokens.
S_YYEMPTY = -2,
S_YYEOF = 0, // "end of file"
S_YYerror = 1, // error
S_YYUNDEF = 2, // "invalid token"
S_LOCAL = 3, // LOCAL
S_GLOBAL = 4, // GLOBAL
S_FUNCTION = 5, // FUNCTION
S_PREDICATE = 6, // PREDICATE
S_RADICAL = 7, // RADICAL
S_INTEGER = 8, // INTEGER
S_INTSET = 9, // INTSET
S_EMPTYSET = 10, // EMPTYSET
S_PLUS = 11, // PLUS
S_MINUS = 12, // MINUS
S_MULTIPLY = 13, // MULTIPLY
S_GREATER = 14, // GREATER
S_LESSER = 15, // LESSER
S_GREATER_OR_EQ = 16, // GREATER_OR_EQ
S_LESSER_OR_EQ = 17, // LESSER_OR_EQ
S_EQUAL = 18, // EQUAL
S_NOTEQUAL = 19, // NOTEQUAL
S_FORALL = 20, // FORALL
S_EXISTS = 21, // EXISTS
S_NOT = 22, // NOT
S_EQUIVALENT = 23, // EQUIVALENT
S_IMPLICATION = 24, // IMPLICATION
S_OR = 25, // OR
S_AND = 26, // AND
S_IN = 27, // IN
S_NOTIN = 28, // NOTIN
S_SUBSET = 29, // SUBSET
S_SUBOR_EQ = 30, // SUBOR_EQ
S_NOTSUBSET = 31, // NOTSUBSET
S_DECART = 32, // DECART
S_UNION = 33, // UNION
S_INTERSECTION = 34, // INTERSECTION
S_SET_MINUS = 35, // SET_MINUS
S_SYMMINUS = 36, // SYMMINUS
S_BOOLEAN = 37, // BOOLEAN
S_BIGPR = 38, // BIGPR
S_SMALLPR = 39, // SMALLPR
S_FILTER = 40, // FILTER
S_CARD = 41, // CARD
S_BOOL = 42, // BOOL
S_DEBOOL = 43, // DEBOOL
S_RED = 44, // RED
S_DECLARATIVE = 45, // DECLARATIVE
S_RECURSIVE = 46, // RECURSIVE
S_IMPERATIVE = 47, // IMPERATIVE
S_DEFINE = 48, // DEFINE
S_STRUCT = 49, // STRUCT
S_ASSIGN = 50, // ASSIGN
S_ITERATE = 51, // ITERATE
S_LP = 52, // LP
S_RP = 53, // RP
S_LC = 54, // LC
S_RC = 55, // RC
S_LS = 56, // LS
S_RS = 57, // RS
S_BAR = 58, // BAR
S_COMMA = 59, // COMMA
S_SEMICOLON = 60, // SEMICOLON
S_YYACCEPT = 61, // $accept
S_expression = 62, // expression
S_global_declaration = 63, // global_declaration
S_function_name = 64, // function_name
S_logic_or_setexpr = 65, // logic_or_setexpr
S_function_decl = 66, // function_decl
S_arguments = 67, // arguments
S_declaration = 68, // declaration
S_variable = 69, // variable
S_var_enum = 70, // var_enum
S_var_all = 71, // var_all
S_logic = 72, // logic
S_logic_all = 73, // logic_all
S_logic_par = 74, // logic_par
S_logic_predicates = 75, // logic_predicates
S_binary_predicate = 76, // binary_predicate
S_logic_unary = 77, // logic_unary
S_logic_no_binary = 78, // logic_no_binary
S_quantifier = 79, // quantifier
S_quant_var = 80, // quant_var
S_quant_var_enum = 81, // quant_var_enum
S_logic_binary = 82, // logic_binary
S_setexpr = 83, // setexpr
S_operation_name = 84, // operation_name
S_setexpr_enum = 85, // setexpr_enum
S_setexpr_enum_min2 = 86, // setexpr_enum_min2
S_literal = 87, // literal
S_identifier = 88, // identifier
S_setexpr_binary = 89, // setexpr_binary
S_setexpr_generators = 90, // setexpr_generators
S_enumeration = 91, // enumeration
S_tuple = 92, // tuple
S_boolean = 93, // boolean
S_filter_expression = 94, // filter_expression
S_declarative = 95, // declarative
S_recursion = 96, // recursion
S_imperative = 97, // imperative
S_imp_blocks = 98, // imp_blocks
S_imp_block = 99, // imp_block
S_RPE = 100, // RPE
S_RCE = 101 // RCE
};
};
/// (External) token type, as returned by yylex.
typedef token::yytokentype token_type;
/// (Internal) symbol kind.
typedef symbol_kind::symbol_kind_type symbol_kind_type;
/// Symbol type: an internal symbol number.
typedef int symbol_number_type;
/// The symbol type number to denote an empty symbol.
enum { empty_symbol = -2 };
/// Internal symbol number for tokens (subsumed by symbol_number_type).
typedef unsigned char token_number_type;
/// The number of tokens.
static const symbol_kind_type YYNTOKENS = symbol_kind::YYNTOKENS;
/// A complete symbol.
///
/// Expects its Base type to provide access to the symbol type
/// via type_get ().
/// Expects its Base type to provide access to the symbol kind
/// via kind ().
///
/// Provide access to semantic value.
template <typename Base>
@ -316,7 +512,10 @@ namespace ccl { namespace rslang { namespace detail {
#if 201103L <= YY_CPLUSPLUS
/// Move constructor.
basic_symbol (basic_symbol&& that);
basic_symbol (basic_symbol&& that)
: Base (std::move (that))
, value (std::move (that.value))
{}
#endif
/// Copy constructor.
@ -340,6 +539,15 @@ namespace ccl { namespace rslang { namespace detail {
Base::clear ();
}
/// The user-facing name of this symbol.
std::string name () const YY_NOEXCEPT
{
return RSParserImpl::symbol_name (this->kind ());
}
/// Backward compatibility (Bison 3.6).
symbol_kind_type type_get () const YY_NOEXCEPT;
/// Whether empty.
bool empty () const YY_NOEXCEPT;
@ -357,52 +565,61 @@ namespace ccl { namespace rslang { namespace detail {
};
/// Type access provider for token (enum) based symbols.
struct by_type
struct by_kind
{
/// Default constructor.
by_type ();
by_kind ();
#if 201103L <= YY_CPLUSPLUS
/// Move constructor.
by_type (by_type&& that);
by_kind (by_kind&& that);
#endif
/// Copy constructor.
by_type (const by_type& that);
by_kind (const by_kind& that);
/// The symbol type as needed by the constructor.
typedef token_type kind_type;
/// The symbol kind as needed by the constructor.
typedef token_kind_type kind_type;
/// Constructor from (external) token numbers.
by_type (kind_type t);
by_kind (kind_type t);
/// Record that this symbol is empty.
void clear ();
/// Steal the symbol type from \a that.
void move (by_type& that);
/// Steal the symbol kind from \a that.
void move (by_kind& that);
/// The (internal) type number (corresponding to \a type).
/// \a empty when empty.
symbol_number_type type_get () const YY_NOEXCEPT;
symbol_kind_type kind () const YY_NOEXCEPT;
/// The token.
token_type token () const YY_NOEXCEPT;
/// Backward compatibility (Bison 3.6).
symbol_kind_type type_get () const YY_NOEXCEPT;
/// The symbol type.
/// \a empty_symbol when empty.
/// An int, not token_number_type, to be able to store empty_symbol.
int type;
/// The symbol kind.
/// \a S_YYEMPTY when empty.
symbol_kind_type kind_;
};
/// Backward compatibility for a private implementation detail (Bison 3.6).
typedef by_kind by_type;
/// "External" symbols: returned by the scanner.
struct symbol_type : basic_symbol<by_type>
struct symbol_type : basic_symbol<by_kind>
{};
/// Build a parser object.
RSParserImpl (ParserState* state_yyarg);
virtual ~RSParserImpl ();
#if 201103L <= YY_CPLUSPLUS
/// Non copyable.
RSParserImpl (const RSParserImpl&) = delete;
/// Non copyable.
RSParserImpl& operator= (const RSParserImpl&) = delete;
#endif
/// Parse. An alias for parse ().
/// \returns 0 iff parsing succeeded.
int operator() ();
@ -432,26 +649,51 @@ namespace ccl { namespace rslang { namespace detail {
/// Report a syntax error.
void error (const syntax_error& err);
/// The user-facing name of the symbol whose (internal) number is
/// YYSYMBOL. No bounds checking.
static std::string symbol_name (symbol_kind_type yysymbol);
class context
{
public:
context (const RSParserImpl& yyparser, const symbol_type& yyla);
const symbol_type& lookahead () const { return yyla_; }
symbol_kind_type token () const { return yyla_.kind (); }
/// Put in YYARG at most YYARGN of the expected tokens, and return the
/// number of tokens stored in YYARG. If YYARG is null, return the
/// number of expected tokens (guaranteed to be less than YYNTOKENS).
int expected_tokens (symbol_kind_type yyarg[], int yyargn) const;
private:
const RSParserImpl& yyparser_;
const symbol_type& yyla_;
};
private:
/// This class is not copyable.
#if YY_CPLUSPLUS < 201103L
/// Non copyable.
RSParserImpl (const RSParserImpl&);
/// Non copyable.
RSParserImpl& operator= (const RSParserImpl&);
#endif
/// State numbers.
typedef int state_type;
/// Stored state numbers (used for stacks).
typedef unsigned char state_type;
/// The arguments of the error message.
int yy_syntax_error_arguments_ (const context& yyctx,
symbol_kind_type yyarg[], int yyargn) const;
/// Generate an error message.
/// \param yystate the state where the error occurred.
/// \param yyla the lookahead token.
virtual std::string yysyntax_error_ (state_type yystate,
const symbol_type& yyla) const;
/// \param yyctx the context in which the error occurred.
virtual std::string yysyntax_error_ (const context& yyctx) const;
/// Compute post-reduction state.
/// \param yystate the current state
/// \param yysym the nonterminal to push on the stack
state_type yy_lr_goto_state_ (state_type yystate, int yysym);
static state_type yy_lr_goto_state_ (state_type yystate, int yysym);
/// Whether the given \c yypact_ value indicates a defaulted state.
/// \param yyvalue the value to check
@ -464,63 +706,66 @@ namespace ccl { namespace rslang { namespace detail {
static const signed char yypact_ninf_;
static const signed char yytable_ninf_;
/// Convert a scanner token number \a t to a symbol number.
static token_number_type yytranslate_ (int t);
// Tables.
// YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
// STATE-NUM.
static const short yypact_[];
// YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
// Performed when YYTABLE does not specify something else to do. Zero
// means the default is an error.
static const unsigned char yydefact_[];
// YYPGOTO[NTERM-NUM].
static const short yypgoto_[];
// YYDEFGOTO[NTERM-NUM].
static const short yydefgoto_[];
// YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
// positive, shift that token. If negative, reduce the rule whose
// number is the opposite. If YYTABLE_NINF, syntax error.
static const short yytable_[];
static const short yycheck_[];
// YYSTOS[STATE-NUM] -- The (internal number of the) accessing
// symbol of state STATE-NUM.
static const unsigned char yystos_[];
// YYR1[YYN] -- Symbol number of symbol that rule YYN derives.
static const unsigned char yyr1_[];
// YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.
static const unsigned char yyr2_[];
/// Convert a scanner token kind \a t to a symbol kind.
/// In theory \a t should be a token_kind_type, but character literals
/// are valid, yet not members of the token_type enum.
static symbol_kind_type yytranslate_ (int t);
/// Convert the symbol name \a n to a form suitable for a diagnostic.
static std::string yytnamerr_ (const char *n);
static std::string yytnamerr_ (const char *yystr);
/// For a symbol, its name in clear.
static const char* const yytname_[];
// Tables.
// YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
// STATE-NUM.
static const short yypact_[];
// YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
// Performed when YYTABLE does not specify something else to do. Zero
// means the default is an error.
static const signed char yydefact_[];
// YYPGOTO[NTERM-NUM].
static const short yypgoto_[];
// YYDEFGOTO[NTERM-NUM].
static const short yydefgoto_[];
// YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
// positive, shift that token. If negative, reduce the rule whose
// number is the opposite. If YYTABLE_NINF, syntax error.
static const short yytable_[];
static const short yycheck_[];
// YYSTOS[STATE-NUM] -- The (internal number of the) accessing
// symbol of state STATE-NUM.
static const signed char yystos_[];
// YYR1[YYN] -- Symbol number of symbol that rule YYN derives.
static const signed char yyr1_[];
// YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.
static const signed char yyr2_[];
#if YYDEBUG
// YYRLINE[YYN] -- Source line where rule number YYN was defined.
static const unsigned short yyrline_[];
// YYRLINE[YYN] -- Source line where rule number YYN was defined.
static const short yyrline_[];
/// Report on the debug stream that the rule \a r is going to be reduced.
virtual void yy_reduce_print_ (int r);
virtual void yy_reduce_print_ (int r) const;
/// Print the state stack on the debug stream.
virtual void yystack_print_ ();
virtual void yy_stack_print_ () const;
/// Debugging level.
int yydebug_;
/// Debug stream.
std::ostream* yycdebug_;
/// \brief Display a symbol type, value and location.
/// \brief Display a symbol kind, value and location.
/// \param yyo The output stream.
/// \param yysym The symbol.
template <typename Base>
@ -541,7 +786,7 @@ namespace ccl { namespace rslang { namespace detail {
/// Default constructor.
by_state () YY_NOEXCEPT;
/// The symbol type as needed by the constructor.
/// The symbol kind as needed by the constructor.
typedef state_type kind_type;
/// Constructor.
@ -553,15 +798,16 @@ namespace ccl { namespace rslang { namespace detail {
/// Record that this symbol is empty.
void clear () YY_NOEXCEPT;
/// Steal the symbol type from \a that.
/// Steal the symbol kind from \a that.
void move (by_state& that);
/// The (internal) type number (corresponding to \a state).
/// \a empty_symbol when empty.
symbol_number_type type_get () const YY_NOEXCEPT;
/// The symbol kind (corresponding to \a state).
/// \a symbol_kind::S_YYEMPTY when empty.
symbol_kind_type kind () const YY_NOEXCEPT;
/// The state number used to denote an empty symbol.
enum { empty_state = -1 };
/// We use the initial state, as it does not have a value.
enum { empty_state = 0 };
/// The state.
/// \a empty when empty.
@ -583,6 +829,10 @@ namespace ccl { namespace rslang { namespace detail {
/// Assignment, needed by push_back by some old implementations.
/// Moves the contents of that.
stack_symbol_type& operator= (stack_symbol_type& that);
/// Assignment, needed by push_back by other implementations.
/// Needed by some other old implementations.
stack_symbol_type& operator= (const stack_symbol_type& that);
#endif
};
@ -592,48 +842,38 @@ namespace ccl { namespace rslang { namespace detail {
{
public:
// Hide our reversed order.
typedef typename S::reverse_iterator iterator;
typedef typename S::const_reverse_iterator const_iterator;
typedef typename S::iterator iterator;
typedef typename S::const_iterator const_iterator;
typedef typename S::size_type size_type;
typedef typename std::ptrdiff_t index_type;
stack (size_type n = 200)
: seq_ (n)
{}
#if 201103L <= YY_CPLUSPLUS
/// Non copyable.
stack (const stack&) = delete;
/// Non copyable.
stack& operator= (const stack&) = delete;
#endif
/// Random access.
///
/// Index 0 returns the topmost element.
T&
operator[] (size_type i)
const T&
operator[] (index_type i) const
{
return seq_[size () - 1 - i];
return seq_[size_type (size () - 1 - i)];
}
/// Random access.
///
/// Index 0 returns the topmost element.
T&
operator[] (int i)
operator[] (index_type i)
{
return operator[] (size_type (i));
}
/// Random access.
///
/// Index 0 returns the topmost element.
const T&
operator[] (size_type i) const
{
return seq_[size () - 1 - i];
}
/// Random access.
///
/// Index 0 returns the topmost element.
const T&
operator[] (int i) const
{
return operator[] (size_type (i));
return seq_[size_type (size () - 1 - i)];
}
/// Steal the contents of \a t.
@ -648,7 +888,7 @@ namespace ccl { namespace rslang { namespace detail {
/// Pop elements from the stack.
void
pop (int n = 1) YY_NOEXCEPT
pop (std::ptrdiff_t n = 1) YY_NOEXCEPT
{
for (; 0 < n; --n)
seq_.pop_back ();
@ -662,49 +902,53 @@ namespace ccl { namespace rslang { namespace detail {
}
/// Number of elements on the stack.
size_type
index_type
size () const YY_NOEXCEPT
{
return seq_.size ();
return index_type (seq_.size ());
}
/// Iterator on top of the stack (going downwards).
const_iterator
begin () const YY_NOEXCEPT
{
return seq_.rbegin ();
return seq_.begin ();
}
/// Bottom of the stack.
const_iterator
end () const YY_NOEXCEPT
{
return seq_.rend ();
return seq_.end ();
}
/// Present a slice of the top of a stack.
class slice
{
public:
slice (const stack& stack, int range)
slice (const stack& stack, index_type range)
: stack_ (stack)
, range_ (range)
{}
const T&
operator[] (int i) const
operator[] (index_type i) const
{
return stack_[range_ - i];
}
private:
const stack& stack_;
int range_;
index_type range_;
};
private:
#if YY_CPLUSPLUS < 201103L
/// Non copyable.
stack (const stack&);
/// Non copyable.
stack& operator= (const stack&);
#endif
/// The wrapped container.
S seq_;
};
@ -737,24 +981,21 @@ namespace ccl { namespace rslang { namespace detail {
/// Constants.
enum
{
yyeof_ = 0,
yylast_ = 589, ///< Last index in yytable_.
yynnts_ = 41, ///< Number of nonterminal symbols.
yyfinal_ = 85, ///< Termination state number.
yyterror_ = 1,
yyerrcode_ = 256,
yyntokens_ = 61 ///< Number of tokens.
yyfinal_ = 85 ///< Termination state number.
};
// User arguments.
ParserState* state;
};
#line 11 "RSParserImpl.y" // lalr1.cc:401
#line 15 "RSParserImpl.y"
} } } // ccl::rslang::detail
#line 758 "../header/RSParserImpl.h" // lalr1.cc:401
#line 999 "../header/RSParserImpl.h"

View File

@ -154,7 +154,7 @@ private:
uint32_t counter{ 0 };
public:
explicit Iterator(const SDDecartian& decartaian, bool isCompleted = false);
explicit Iterator(const SDDecartian& base, bool isCompleted = false);
public:
using iterator_category = std::forward_iterator_tag;

View File

@ -5,6 +5,7 @@
#include "ccl/rslang/RSErrorCodes.hpp"
#include <functional>
#include <optional>
namespace ccl::rslang::detail {
@ -18,6 +19,8 @@ struct Node {
public:
explicit Node(Token token) noexcept
: token{ std::move(token) } {}
explicit Node(TokenID id, StrRange pos, TokenData val = {}) noexcept
: Node(Token(id, pos, std::move(val))) {}
};
struct ParserState {

View File

@ -14,7 +14,7 @@ enum class LexerEID : uint32_t {
//! Syntactic errors enumeration
enum class ParseEID : uint32_t {
syntax = 0x8400, // Неизвестная синтаксическая ошибка
missingParanthesis = 0x8406, // Пропущена скобка ')'
missingParenthesis = 0x8406, // Пропущена скобка ')'
missingCurlyBrace = 0x8407, // Пропущена скобка '}'
invalidQuantifier = 0x8408, // Некорректная кванторная декларация
expectedDeclaration = 0x8414, // Ожидалось объявление аргументов

View File

@ -2,6 +2,8 @@
#include "ccl/rslang/Interpreter.h"
#include <optional>
namespace ccl::rslang {
Interpreter::Interpreter(const TypeContext& types, SyntaxTreeContext ast, DataContext data)

View File

@ -17,6 +17,8 @@
#pragma warning( disable : 26418 26415 26440 )
#endif
#include <optional>
namespace ccl::rslang::detail {
RSParser::RSParser(std::optional<ErrorReporter> reporter)
@ -58,15 +60,13 @@ int yylex(RawNode* yylval, ParserState* state) {
void RSParserImpl::error(const std::string& /*msg*/) {}
RawNode AddNode(const TokenID token, RawNode son) {
auto result = std::make_shared<Node>(Token(token, son->token.pos));
auto result = std::make_shared<Node>(token, son->token.pos);
result->children.emplace_back(son);
return result;
}
RawNode AddNode(const TokenID token, RawNode son1, RawNode son2) {
auto result = std::make_shared<Node>(
Token{ token, StrRange{ son1->token.pos.start, son2->token.pos.finish } });
auto result = std::make_shared<Node>(token, StrRange{ son1->token.pos.start, son2->token.pos.finish });
result->children.emplace_back(son1);
result->children.emplace_back(son2);
return result;
@ -87,19 +87,19 @@ RawNode UnaryOperation(RawNode operation, RawNode operand) {
RawNode RemoveBrackets(RawNode br1, RawNode operand, RawNode br2) {
operand->token.pos = StrRange{ br1->token.pos.start, br2->token.pos.finish };
auto bracketNode = std::make_shared<Node>(Token(TokenID::PUNC_PL, operand->token.pos));
auto bracketNode = std::make_shared<Node>(TokenID::PUNC_PL, operand->token.pos);
bracketNode->children.emplace_back(operand);
return bracketNode;
}
RawNode ReplaceBrackets(const TokenID token, RawNode br1, RawNode argList, RawNode br2) {
auto result = std::make_shared<Node>(Token(token, StrRange{ br1->token.pos.start, br2->token.pos.finish }));
auto result = std::make_shared<Node>(token, StrRange{ br1->token.pos.start, br2->token.pos.finish });
result->children = argList->children;
return result;
}
RawNode Enumeration(const TokenID token, RawNode el1, RawNode el2) {
auto result = std::make_shared<Node>(Token(token, StrRange{ el1->token.pos.start, el2->token.pos.finish }));
auto result = std::make_shared<Node>(token, StrRange{ el1->token.pos.start, el2->token.pos.finish });
if (el1->token.id != token) {
result->children.emplace_back(el1);
} else {
@ -121,19 +121,27 @@ RawNode Quantifier(RawNode quant, RawNode declaration, RawNode domain, RawNode p
return quant;
}
RawNode FunctionDeclaration(RawNode start, RawNode argdecl, RawNode expr) {
RawNode FunctionDeclaration(RawNode start, RawNode argumentsDeclaration, RawNode expr) {
auto result = std::make_shared<Node>(
Token{ TokenID::NT_FUNC_DEFINITION, StrRange{ start->token.pos.start, expr->token.pos.finish } });
result->children.emplace_back(argdecl);
TokenID::NT_FUNC_DEFINITION,
StrRange{ start->token.pos.start, expr->token.pos.finish }
);
result->children.emplace_back(argumentsDeclaration);
result->children.emplace_back(expr);
return result;
}
RawNode FunctionCall(RawNode function, RawNode args, RawNode rs) {
auto result = std::make_shared<Node>(
Token{ TokenID::NT_FUNC_CALL, StrRange{ function->token.pos.start, rs->token.pos.finish } });
TokenID::NT_FUNC_CALL,
StrRange{ function->token.pos.start, rs->token.pos.finish }
);
result->children.emplace_back(function);
result->children.insert(end(result->children), begin(args->children), end(args->children));
result->children.insert(
end(result->children),
begin(args->children),
end(args->children)
);
return result;
}
@ -144,48 +152,71 @@ RawNode FilterCall(RawNode filter, RawNode params, RawNode argument, RawNode rp)
return filter;
}
RawNode TextOperator(RawNode oper, RawNode args, RawNode rp) {
oper->token.pos.finish = rp->token.pos.finish;
oper->children.emplace_back(args);
return oper;
RawNode TextOperator(RawNode operatorName, RawNode args, RawNode rp) {
operatorName->token.pos.finish = rp->token.pos.finish;
operatorName->children.emplace_back(args);
return operatorName;
}
RawNode Decartian(RawNode op1, RawNode decart, RawNode op2) {
RawNode Decartian(RawNode op1, RawNode decartian, RawNode op2) {
if (op1->token.id == TokenID::DECART) {
auto result = std::move(op1);
result->token.pos.finish = op2->token.pos.finish;
result->children.emplace_back(op2);
return result;
} else {
return BinaryOperation(std::move(op1), std::move(decart), std::move(op2));
return BinaryOperation(std::move(op1), std::move(decartian), std::move(op2));
}
}
RawNode TermDeclaration(RawNode lc, RawNode declaration, RawNode domain, RawNode predicate, RawNode rc) {
RawNode TermDeclaration(
RawNode lc,
RawNode declaration,
RawNode domain,
RawNode predicate,
RawNode rc
) {
auto result = std::make_shared<Node>(
Token{ TokenID::NT_DECLARATIVE_EXPR, StrRange{ lc->token.pos.start, rc->token.pos.finish } });
TokenID::NT_DECLARATIVE_EXPR,
StrRange{ lc->token.pos.start, rc->token.pos.finish }
);
result->children.emplace_back(declaration);
result->children.emplace_back(domain);
result->children.emplace_back(predicate);
return result;
}
RawNode FullRecursion(RawNode rec, RawNode localid,
RawNode domain, RawNode condition, RawNode iteration, RawNode rc) {
RawNode FullRecursion(
RawNode rec,
RawNode declaration,
RawNode domain,
RawNode condition,
RawNode iteration,
RawNode rc
) {
auto result = std::make_shared<Node>(
Token{ TokenID::NT_RECURSIVE_FULL, StrRange{ rec->token.pos.start, rc->token.pos.finish } });
result->children.emplace_back(localid);
TokenID::NT_RECURSIVE_FULL,
StrRange{ rec->token.pos.start, rc->token.pos.finish }
);
result->children.emplace_back(declaration);
result->children.emplace_back(domain);
result->children.emplace_back(condition);
result->children.emplace_back(iteration);
return result;
}
RawNode ShortRecursion(RawNode rec, RawNode localid,
RawNode domain, RawNode iteration, RawNode rc) {
RawNode ShortRecursion(
RawNode rec,
RawNode declaration,
RawNode domain,
RawNode iteration,
RawNode rc
) {
auto result = std::make_shared<Node>(
Token{ TokenID::NT_RECURSIVE_SHORT, StrRange{ rec->token.pos.start, rc->token.pos.finish } });
result->children.emplace_back(localid);
TokenID::NT_RECURSIVE_SHORT,
StrRange{ rec->token.pos.start, rc->token.pos.finish }
);
result->children.emplace_back(declaration);
result->children.emplace_back(domain);
result->children.emplace_back(iteration);
return result;
@ -193,7 +224,9 @@ RawNode ShortRecursion(RawNode rec, RawNode localid,
RawNode Imperative(RawNode imp, RawNode value, RawNode actions, RawNode rc) {
auto result = std::make_shared<Node>(
Token{ TokenID::NT_IMPERATIVE_EXPR, StrRange{ imp->token.pos.start, rc->token.pos.finish } });
TokenID::NT_IMPERATIVE_EXPR,
StrRange{ imp->token.pos.start, rc->token.pos.finish }
);
result->children.emplace_back(value);
result->children.insert(end(result->children), begin(actions->children), end(actions->children));
return result;

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,8 @@
%require "3.2"
%require "3.7"
///////////////////////////////////////////////////////////
// ------------- Generator Definitions --------------------
///////////////////////////////////////////////////////////
%output "RSParserImpl.cpp"
%defines "../header/RSParserImpl.h"
@ -13,10 +17,14 @@
%define api.parser.class {RSParserImpl}
%param {ParserState* state}
///////////////////////////////////////////////////////////
// ------------- Code Wrapper at FileStart ----------------
///////////////////////////////////////////////////////////
%code top {
#ifdef _MSC_VER
#pragma warning( push )
#pragma warning( disable : 26434 26438 26440 26446 26447 26448 26456 )
#pragma warning( disable : 4244 26434 26438 26440 26446 26447 26448 26456 )
#pragma warning( disable : 26460 26477 26481 26482 26493 26494 26495 26496 )
#endif
@ -33,6 +41,10 @@
}
///////////////////////////////////////////////////////////
// ------------- Semantic Actions -------------------------
///////////////////////////////////////////////////////////
%code requires{
#include "ccl/rslang/SyntaxTree.h"
#include "ccl/rslang/ParserState.hpp"
@ -42,292 +54,435 @@ namespace ccl::rslang::detail {
#define YYSTYPE RawNode
struct ParserState;
int yylex(RawNode* yylval, ParserState* state);
RawNode AddNode(TokenID token, RawNode son);
RawNode AddNode(TokenID token, RawNode son1, RawNode son2);
RawNode BinaryOperation(RawNode op1, RawNode operation, RawNode op2);
RawNode UnaryOperation(RawNode operation, RawNode operand);
RawNode RemoveBrackets(RawNode br1, RawNode operand, RawNode br2);
RawNode ReplaceBrackets(TokenID token, RawNode br1, RawNode argList, RawNode br2);
RawNode BinaryOperation(RawNode op1, RawNode operation, RawNode op2);
RawNode UnaryOperation(RawNode operation, RawNode operand);
RawNode Enumeration(TokenID token, RawNode el1, RawNode el2);
RawNode Decartian(RawNode op1, RawNode decart, RawNode op2);
RawNode Quantifier(RawNode quant, RawNode declaration, RawNode domain, RawNode predicate);
RawNode FunctionDeclaration(RawNode start, RawNode argdecl, RawNode expr);
RawNode FunctionCall(RawNode function, RawNode args, RawNode rs);
RawNode FilterCall(RawNode filter, RawNode params, RawNode argument, RawNode rp);
RawNode TextOperator(RawNode oper, RawNode args, RawNode rp);
RawNode TermDeclaration(RawNode lc, RawNode declaration, RawNode domain, RawNode predicate, RawNode rc);
RawNode FullRecursion(RawNode rec, RawNode localid, RawNode domain, RawNode condition, RawNode iteration, RawNode rc);
RawNode ShortRecursion(RawNode rec, RawNode localid, RawNode domain, RawNode iteration, RawNode rc);
RawNode Imperative(RawNode imp, RawNode value, RawNode actions, RawNode rc);
RawNode Decartian(
RawNode op1,
RawNode decartian,
RawNode op2
);
int yylex(RawNode* yylval, ParserState* state);
RawNode Quantifier(
RawNode quant,
RawNode declaration,
RawNode domain,
RawNode predicate
);
RawNode FunctionDeclaration(
RawNode start,
RawNode argumentsDeclaration,
RawNode expr
);
RawNode FunctionCall(
RawNode function,
RawNode args, RawNode
rs
);
RawNode FilterCall(
RawNode filter,
RawNode params,
RawNode argument,
RawNode rp
);
RawNode TextOperator(
RawNode operatorName,
RawNode args,
RawNode rp
);
RawNode TermDeclaration(
RawNode lc,
RawNode declaration,
RawNode domain,
RawNode predicate,
RawNode rc);
RawNode FullRecursion(
RawNode rec,
RawNode declaration,
RawNode domain,
RawNode condition,
RawNode iteration,
RawNode rc
);
RawNode ShortRecursion(
RawNode rec,
RawNode declaration,
RawNode domain,
RawNode iteration,
RawNode rc
);
RawNode Imperative(
RawNode imp,
RawNode value,
RawNode actions,
RawNode rc
);
} // namespace ccl::rslang::detail
}
//-------------- Идентификаторы -----------------------------------
%token LOCAL // Имя локальной переменной
GLOBAL // Имя глобальной переменной
FUNCTION // Терм-функция
PREDICATE // Пердикат-функция
RADICAL // Радикал для шаблонов функций и предикатов
INTEGER
INFINITY
EMPTYSET
//------------------ Арифметика ------------------------------
%left PLUS MINUS
%left MULTIPLY
///////////////////////////////////////////////////////////
// ------------- Terminal Tokens --------------------------
///////////////////////////////////////////////////////////
// ----------- Целочисленные предикаты -----------------------
%token GREATER
LESSER
GREATER_OR_EQ
LESSER_OR_EQ
// --------------- Сравнение ---------------------------------
%token EQUAL
NOTEQUAL
//------------- Логические предикаты ------------------------
%token FORALL // Квантор всеобщности
EXISTS // Квантор существования
%right NOT
%left EQUIVALENT
%left IMPLICATION
%left OR
%left AND
//-------------- Предикаты теории множеств -------------------
%token IN
NOTIN
SUBSET
SUBOR_EQ
NOTSUBSET
//-------------- Операции теории множеств -------------------
%left DECART UNION INTERSECTION SET_MINUS SYMMINUS
%right BOOLEAN // Булеан
//------------------ Родоструктурные операции -------------------
%token BIGPR // Большая проекция
SMALLPR // Малая проекция
FILTER // Фильтр
CARD // Кардинальность (мощность множества)
BOOL // синглетон
DEBOOL // десинглетон
RED // reduce (множество-сумма)
//------------------ Родоструктурные конструкции -------------------
%token DECLARATIVE // выражение терма
RECURSIVE // рекурсивное определение
IMPERATIVE // императивное определение
//-------------- Пунктуация ---------------------------------
%token DEFINE // Определение глобального идентификатора
STRUCT // Определение глобальной структуры
ASSIGN // Знак присвоения
ITERATE // Знак перебора
LP // Открывающая круглая скобка
RP // Закрывающая круглая скобка
LC // Открывающая фигурная скобка
RC // Закрывающая фигурная скобка
LS // Открывающая квадратная скобка
RS // Закрывающая квадратная скобка
BAR // Вертикальная черта
%left COMMA // Запятая
%left SEMICOLON // Точка с запятой
// ------------- Identifiers ------------------------------
%token
LOCAL // Local identifier
GLOBAL // Global identifier
FUNCTION // Term-function
PREDICATE // Predicate-function
RADICAL // Templated argument identifier
INTEGER // Integer literal
INTSET // Set of all integers
EMPTYSET // Empty set
// ------------- Arithmetic operations --------------------
%left PLUS MINUS // Add and Subtract
%left MULTIPLY // Multiply
// ------------- Integer predicates -----------------------
%token
GREATER // IsGreater
LESSER // IsLesser
GREATER_OR_EQ // IsGreater or IsEqual
LESSER_OR_EQ // IsLesser or IsEqual
// ------------- Equality predicate -----------------------
%token
EQUAL // IsEqual
NOTEQUAL // NotEqual
// ------------- First order logic ------------------------
%token
FORALL // UniversalQuantifier
EXISTS // ExistentialQuantifier
%right
NOT // Negation
%left
EQUIVALENT // IsEquivalent
%left
IMPLICATION // Implies
%left
OR // LogicDisjunction
%left
AND // LogicConjunction
// ------------- Set theory predicates --------------------
%token
IN // IsElement
NOTIN // NotElement
SUBSET // IsSubset and NotEqual
SUBOR_EQ // IsSubset
NOTSUBSET // NotSubset
// ------------- Set species operations -------------------
%left
DECART // CartesianProduct
UNION // SetDisjunction
INTERSECTION // SetConjunction
SET_MINUS // SetSubtraction
SYMMINUS // SetSymmetricDifference
%right
BOOLEAN // PowerSet
// ------------- Structural operations --------------------
%token
BIGPR // SetProjection
SMALLPR // CortegeProjection
FILTER // Filter
CARD // SetCardinality
BOOL // Singleton
DEBOOL // ExtractSingleElement
RED // SetReduction
// ------------- Definition constructions -----------------
%token
DECLARATIVE // DeclarativeDefinition
RECURSIVE // RecursiveDefinition
IMPERATIVE // ImperativeDefinition
// ------------- Punctuation and Syntactic sugar ----------
%token
DEFINE // Global definition separator
STRUCT // Global structure domain separator
ASSIGN // Assignment (IsEqual)
ITERATE // SetIteration (IsElement)
LP // (
RP // )
LC // {
RC // }
LS // [
RS // ]
BAR // |
%left
COMMA // ,
%left
SEMICOLON // ;
/////////////////////////////////////////////////////////////////////////////
//---------------- Правила грамматики ---------------------------------------
%%
///////////////////////////////////////////////////////////////////////////////
// ------------------------- Grammar Rules ------------------------------------
///////////////////////////////////////////////////////////////////////////////
//--------------- Выражение ------------------------------
expression : global_declaration
| term_or_logic { state->FinalizeExpression($1); }
| function_decl { state->FinalizeExpression($1); }
;
// ------------------------- Language Expression ------------------------------
expression
: global_declaration
| logic_or_setexpr { state->FinalizeExpression($1); }
| function_decl { state->FinalizeExpression($1); }
;
term_or_logic : logic
| term
;
global_declaration
: GLOBAL DEFINE { state->FinalizeCstEmpty($1, $2); }
| GLOBAL STRUCT setexpr { state->FinalizeCstExpression($1, $2, $3); }
| GLOBAL DEFINE logic_or_setexpr { state->FinalizeCstExpression($1, $2, $3); }
| function_name DEFINE function_decl { state->FinalizeCstExpression($1, $2, $3); }
;
function_name
: FUNCTION
| PREDICATE
;
function_decl : LS arg_declaration RS term_or_logic { $$ = FunctionDeclaration($1, $2, $4); }
| LS error { state->OnError(ParseEID::expectedDeclaration); YYABORT; }
;
logic_or_setexpr
: logic
| setexpr
;
arg_declaration : declaration { $$ = AddNode(TokenID::NT_ARGUMENTS, $1); }
| arg_declaration COMMA declaration { $$ = Enumeration(TokenID::NT_ARGUMENTS, $1, $3); }
| arg_declaration COMMA error { state->OnError(ParseEID::expectedLocal); YYABORT; }
;
declaration : LOCAL IN term { $$ = AddNode(TokenID::NT_ARG_DECL, $1, $3); }
| LOCAL error { state->OnError(ParseEID::expectedDeclaration); YYABORT; }
;
function_decl
: LS arguments RS logic_or_setexpr { $$ = FunctionDeclaration($1, $2, $4); }
| LS error { state->OnError(ParseEID::expectedDeclaration); YYABORT; }
;
//--------------- Выражение конституэнты ------------------------------
global_declaration : GLOBAL DEFINE { state->FinalizeCstEmpty($1, $2); }
| GLOBAL STRUCT term { state->FinalizeCstExpression($1, $2, $3); }
| GLOBAL DEFINE term_or_logic { state->FinalizeCstExpression($1, $2, $3); }
| function_name DEFINE function_decl { state->FinalizeCstExpression($1, $2, $3); }
;
// ------------------------- Variables and arguments -------------------------
arguments
: declaration { $$ = AddNode(TokenID::NT_ARGUMENTS, $1); }
| arguments COMMA declaration { $$ = Enumeration(TokenID::NT_ARGUMENTS, $1, $3); }
| arguments COMMA error { state->OnError(ParseEID::expectedLocal); YYABORT; }
;
declaration
: LOCAL IN setexpr { $$ = AddNode(TokenID::NT_ARG_DECL, $1, $3); }
| LOCAL error { state->OnError(ParseEID::expectedDeclaration); YYABORT; }
;
//--------------- Логическое выражение -----------------------------------------
logic : logic_predicates
| logic_unary
| logic_binary
;
logic_all : logic
| logic_par
;
logic_no_binary: logic_predicates
| logic_unary
| logic_par
;
logic_par : LP logic_binary RPE { $$ = RemoveBrackets($1, $2, $3); }
| LP logic_predicates RPE { $$ = RemoveBrackets($1, $2, $3); }
;
logic_unary : NOT logic_no_binary { $$ = UnaryOperation($1, $2);}
| quantifier quant_var IN term logic_no_binary
{ $$ = Quantifier($1, $2, $4, $5);}
| quantifier error { state->OnError(ParseEID::invalidQuantifier); YYABORT; }
| PREDICATE LS term_enum RS { $$ = FunctionCall($1, $3, $4); }
;
logic_predicates: term binary_predicate term { $$ = BinaryOperation($1, $2, $3); }
;
logic_binary : logic_all EQUIVALENT logic_all { $$ = BinaryOperation($1, $2, $3); }
| logic_all IMPLICATION logic_all { $$ = BinaryOperation($1, $2, $3); }
| logic_all OR logic_all { $$ = BinaryOperation($1, $2, $3); }
| logic_all AND logic_all { $$ = BinaryOperation($1, $2, $3); }
;
//--------------- Декларация локальной переменной -----------------------------
quant_var : variable
| quant_var_enum
| LP error { state->OnError(ParseEID::invalidQuantifier); YYABORT; }
;
quant_var_enum : quant_var COMMA quant_var { $$ = Enumeration(TokenID::NT_ENUM_DECL, $1, $3); }
| quant_var COMMA error { state->OnError(ParseEID::expectedLocal); YYABORT; }
;
variable
: LOCAL
| LP var_enum RPE { $$ = ReplaceBrackets(TokenID::NT_TUPLE_DECL, $1, $2, $3); }
;
var_enum
: var_all COMMA var_all { $$ = Enumeration(TokenID::INTERRUPT, $1, $3); }
| var_all COMMA error { state->OnError(ParseEID::expectedLocal); YYABORT; }
;
var_all
: variable
| var_enum
;
//-------------------- Термы РС -------------------------------------
term : literal
| identifier
| binary_operation
| typed_constructors
| FUNCTION LS term_enum RS { $$ = FunctionCall($1, $3, $4); }
| operation_name LP term RPE { $$ = TextOperator($1, $3, $4); }
;
//--------------- Двухместная операция ------------------------------
binary_operation: term PLUS term { $$ = BinaryOperation($1, $2, $3); }
| term MINUS term { $$ = BinaryOperation($1, $2, $3); }
| term MULTIPLY term { $$ = BinaryOperation($1, $2, $3); }
| term UNION term { $$ = BinaryOperation($1, $2, $3); }
| term SET_MINUS term { $$ = BinaryOperation($1, $2, $3); }
| term SYMMINUS term { $$ = BinaryOperation($1, $2, $3); }
| term INTERSECTION term { $$ = BinaryOperation($1, $2, $3); }
| term DECART term { $$ = Decartian($1, $2, $3);}
| LP binary_operation RPE { $$ = RemoveBrackets($1, $2, $3); }
;
//--------------- Структурные конструкции ------------------------------
typed_constructors : enumeration
| tuple
| boolean
| FILTER LS term_enum RS LP term RPE { $$ = FilterCall($1, $3, $6, $7); }
| declarative
| imperative
| recursion
;
enumeration : LC term_enum RC { $$ = ReplaceBrackets(TokenID::NT_ENUMERATION, $1, $2, $3); }
;
tuple : LP term_enum_min2 RPE { $$ = ReplaceBrackets(TokenID::NT_TUPLE, $1, $2, $3); }
;
boolean : BOOLEAN LP term RPE { $$ = TextOperator($1, $3, $4); }
| BOOLEAN boolean { $$ = UnaryOperation($1, $2); }
;
term_enum : term { $$ = AddNode(TokenID::INTERRUPT, $1); }
| term_enum_min2
;
term_enum_min2 : term_enum COMMA term { $$ = Enumeration(TokenID::INTERRUPT, $1, $3); }
;
declarative : LC LOCAL IN term BAR logic RCE { $$ = TermDeclaration($1, $2, $4, $6, $7); }
| DECLARATIVE LC variable IN term BAR logic RCE
{ $$ = TermDeclaration($1, $3, $5, $7, $8); }
;
recursion : RECURSIVE LC variable ASSIGN term BAR logic BAR term RCE
{ $$ = FullRecursion($1, $3, $5, $7, $9, $10); }
| RECURSIVE LC variable ASSIGN term BAR term RCE
{ $$ = ShortRecursion($1, $3, $5, $7, $8); }
;
imperative : IMPERATIVE LC term BAR imp_blocks RCE { $$ = Imperative($1, $3, $5, $6); }
;
imp_blocks : imp_block { $$ = AddNode(TokenID::INTERRUPT, $1); }
| imp_blocks SEMICOLON imp_blocks { $$ = Enumeration(TokenID::INTERRUPT, $1, $3); }
;
imp_block : LOCAL ITERATE term { $$ = AddNode(TokenID::NT_IMP_DECLARE, $1, $3); }
| LOCAL ASSIGN term { $$ = AddNode(TokenID::NT_IMP_ASSIGN, $1, $3); }
| logic { $$ = AddNode(TokenID::NT_IMP_LOGIC, $1); }
;
variable : LOCAL
| LP var_enum RPE { $$ = ReplaceBrackets(TokenID::NT_TUPLE_DECL, $1, $2, $3); }
;
var_enum : var_all COMMA var_all { $$ = Enumeration(TokenID::INTERRUPT, $1, $3); }
| var_all COMMA error { state->OnError(ParseEID::expectedLocal); YYABORT; }
;
var_all : variable
| var_enum
;
// ------------------------- Logic Expressions --------------------------------
logic
: logic_predicates
| logic_unary
| logic_binary
;
logic_all
: logic
| logic_par
;
logic_par
: LP logic_binary RPE { $$ = RemoveBrackets($1, $2, $3); }
| LP logic_predicates RPE { $$ = RemoveBrackets($1, $2, $3); }
;
//------------ Идентификаторы -------------------
function_name : FUNCTION
| PREDICATE
;
global_id : GLOBAL
| function_name
| RADICAL
;
identifier : global_id
| LOCAL
;
literal : INTEGER
| EMPTYSET
| INFINITY
;
//------------- Кванторы --------------------------
quantifier : FORALL
| EXISTS
;
//------------ Встроенные функции ----------------
operation_name : BOOL
| DEBOOL
| RED
| BIGPR
| SMALLPR
| CARD
;
//--------------- Двухместный предикат --------
binary_predicate : IN
| NOTIN
| SUBSET
| SUBOR_EQ
| NOTSUBSET
| NOTEQUAL
| EQUAL
| GREATER
| LESSER
| GREATER_OR_EQ
| LESSER_OR_EQ
;
//--------------- Скобки ----------------
RPE : RP
| error { state->OnError(ParseEID::missingParanthesis); YYABORT; }
;
RCE : RC
| error { state->OnError(ParseEID::missingCurlyBrace); YYABORT; }
;
logic_predicates
: setexpr binary_predicate setexpr { $$ = BinaryOperation($1, $2, $3); }
;
binary_predicate
: IN
| NOTIN
| SUBSET
| SUBOR_EQ
| NOTSUBSET
| NOTEQUAL
| EQUAL
| GREATER
| LESSER
| GREATER_OR_EQ
| LESSER_OR_EQ
;
logic_unary
: NOT logic_no_binary { $$ = UnaryOperation($1, $2);}
| quantifier quant_var IN setexpr logic_no_binary { $$ = Quantifier($1, $2, $4, $5);}
| quantifier error { state->OnError(ParseEID::invalidQuantifier); YYABORT; }
| PREDICATE LS setexpr_enum RS { $$ = FunctionCall($1, $3, $4); }
;
logic_no_binary
: logic_predicates
| logic_unary
| logic_par
;
quantifier
: FORALL
| EXISTS
;
quant_var
: variable
| quant_var_enum
| LP error { state->OnError(ParseEID::invalidQuantifier); YYABORT; }
;
quant_var_enum
: quant_var COMMA quant_var { $$ = Enumeration(TokenID::NT_ENUM_DECL, $1, $3); }
| quant_var COMMA error { state->OnError(ParseEID::expectedLocal); YYABORT; }
;
logic_binary
: logic_all EQUIVALENT logic_all { $$ = BinaryOperation($1, $2, $3); }
| logic_all IMPLICATION logic_all { $$ = BinaryOperation($1, $2, $3); }
| logic_all OR logic_all { $$ = BinaryOperation($1, $2, $3); }
| logic_all AND logic_all { $$ = BinaryOperation($1, $2, $3); }
;
// ------------------------- Set Expressions ----------------------------------
setexpr
: literal
| identifier
| setexpr_binary
| setexpr_generators
| FUNCTION LS setexpr_enum RS { $$ = FunctionCall($1, $3, $4); }
| operation_name LP setexpr RPE { $$ = TextOperator($1, $3, $4); }
;
operation_name
: BOOL
| DEBOOL
| RED
| BIGPR
| SMALLPR
| CARD
;
setexpr_enum
: setexpr { $$ = AddNode(TokenID::INTERRUPT, $1); }
| setexpr_enum_min2
;
setexpr_enum_min2
: setexpr_enum COMMA setexpr { $$ = Enumeration(TokenID::INTERRUPT, $1, $3); }
;
literal
: INTEGER
| EMPTYSET
| INTSET
;
identifier
: GLOBAL
| function_name
| RADICAL
| LOCAL
;
setexpr_binary
: setexpr PLUS setexpr { $$ = BinaryOperation($1, $2, $3); }
| setexpr MINUS setexpr { $$ = BinaryOperation($1, $2, $3); }
| setexpr MULTIPLY setexpr { $$ = BinaryOperation($1, $2, $3); }
| setexpr UNION setexpr { $$ = BinaryOperation($1, $2, $3); }
| setexpr SET_MINUS setexpr { $$ = BinaryOperation($1, $2, $3); }
| setexpr SYMMINUS setexpr { $$ = BinaryOperation($1, $2, $3); }
| setexpr INTERSECTION setexpr { $$ = BinaryOperation($1, $2, $3); }
| setexpr DECART setexpr { $$ = Decartian($1, $2, $3);}
| LP setexpr_binary RPE { $$ = RemoveBrackets($1, $2, $3); }
;
setexpr_generators
: enumeration
| tuple
| boolean
| filter_expression
| declarative
| imperative
| recursion
;
enumeration
: LC setexpr_enum RC { $$ = ReplaceBrackets(TokenID::NT_ENUMERATION, $1, $2, $3); }
;
tuple
: LP setexpr_enum_min2 RPE { $$ = ReplaceBrackets(TokenID::NT_TUPLE, $1, $2, $3); }
;
boolean
: BOOLEAN LP setexpr RPE { $$ = TextOperator($1, $3, $4); }
| BOOLEAN boolean { $$ = UnaryOperation($1, $2); }
;
filter_expression
: FILTER LS setexpr_enum RS LP setexpr RPE { $$ = FilterCall($1, $3, $6, $7); }
;
declarative
: LC LOCAL IN setexpr BAR logic RCE { $$ = TermDeclaration($1, $2, $4, $6, $7); }
| DECLARATIVE LC variable IN setexpr BAR logic RCE { $$ = TermDeclaration($1, $3, $5, $7, $8); }
;
recursion
: RECURSIVE LC variable ASSIGN setexpr BAR logic BAR setexpr RCE { $$ = FullRecursion($1, $3, $5, $7, $9, $10); }
| RECURSIVE LC variable ASSIGN setexpr BAR setexpr RCE { $$ = ShortRecursion($1, $3, $5, $7, $8); }
;
imperative
: IMPERATIVE LC setexpr BAR imp_blocks RCE { $$ = Imperative($1, $3, $5, $6); }
;
imp_blocks
: imp_block { $$ = AddNode(TokenID::INTERRUPT, $1); }
| imp_blocks SEMICOLON imp_blocks { $$ = Enumeration(TokenID::INTERRUPT, $1, $3); }
;
imp_block
: LOCAL ITERATE setexpr { $$ = AddNode(TokenID::NT_IMP_DECLARE, $1, $3); }
| LOCAL ASSIGN setexpr { $$ = AddNode(TokenID::NT_IMP_ASSIGN, $1, $3); }
| logic { $$ = AddNode(TokenID::NT_IMP_LOGIC, $1); }
;
// ------------------------- Error helpers ------------------------------------
RPE
: RP
| error { state->OnError(ParseEID::missingParenthesis); YYABORT; }
;
RCE
: RC
| error { state->OnError(ParseEID::missingCurlyBrace); YYABORT; }
;
///////////////////////////////////////////////////////////
// ------------- Code Wrapper at FileEnd ----------------
///////////////////////////////////////////////////////////
%%
#ifdef _MSC_VER

View File

@ -147,8 +147,8 @@ bool SDPowerSet::Contains(StructuredData element) const {
return element.B().IsSubsetOrEq(base.B());
}
SDDecartian::Iterator::Iterator(const SDDecartian& decart, const bool completed)
: decartian{ &decart }, isCompleted{ completed || decartian->Cardinality() == 0 } {
SDDecartian::Iterator::Iterator(const SDDecartian& base, const bool completed)
: decartian{ &base }, isCompleted{ completed || base.Cardinality() == 0 } {
if (!isCompleted) {
componentIters.reserve(size(decartian->factors));
for (const auto& factor : decartian->factors) {

View File

@ -1,6 +1,10 @@
#include "ccl/rslang/SDataCompact.h"
#include "ccl/rslang/RSToken.h"
#include "ccl/rslang/Typification.h"
#include "ccl/rslang/StructuredData.h"
#include <optional>
namespace ccl::object {

View File

@ -309,20 +309,20 @@ TEST_F(UTStructuredData, SetProjection) {
TEST_F(UTStructuredData, DecartianCreate) {
const auto bSet1 = Factory::Set({ el1, el2 });
const auto bSet2 = Factory::Set({ el1, el2, el3 });
const auto decart = Factory::Decartian({ bSet1, bSet2 });
EXPECT_TRUE(decart.IsCollection());
EXPECT_TRUE(std::begin(decart.B())->IsTuple());
EXPECT_EQ(bSet1.B().Cardinality() * bSet2.B().Cardinality(), decart.B().Cardinality());
const auto decartian = Factory::Decartian({ bSet1, bSet2 });
EXPECT_TRUE(decartian.IsCollection());
EXPECT_TRUE(std::begin(decartian.B())->IsTuple());
EXPECT_EQ(bSet1.B().Cardinality() * bSet2.B().Cardinality(), decartian.B().Cardinality());
}
TEST_F(UTStructuredData, DecartianAddElement) {
const auto bSet1 = Factory::Set({ el1 });
const auto bSet2 = Factory::Set({ el1 });
auto decart = Factory::Decartian({ bSet1, bSet2 });
EXPECT_FALSE(decart.ModifyB().AddElement(Factory::Set({ el1 })));
EXPECT_FALSE(decart.ModifyB().AddElement(Factory::Tuple({ el1, el1 })));
EXPECT_FALSE(decart.ModifyB().AddElement(Factory::Tuple({ el1, el2 })));
EXPECT_FALSE(decart.ModifyB().AddElement(Factory::EmptySet()));
auto decartian = Factory::Decartian({ bSet1, bSet2 });
EXPECT_FALSE(decartian.ModifyB().AddElement(Factory::Set({ el1 })));
EXPECT_FALSE(decartian.ModifyB().AddElement(Factory::Tuple({ el1, el1 })));
EXPECT_FALSE(decartian.ModifyB().AddElement(Factory::Tuple({ el1, el2 })));
EXPECT_FALSE(decartian.ModifyB().AddElement(Factory::EmptySet()));
}
TEST_F(UTStructuredData, DecartianEmpty) {
@ -334,29 +334,29 @@ TEST_F(UTStructuredData, DecartianEmpty) {
TEST_F(UTStructuredData, DecartianAsymmetry) {
const auto bSet1 = Factory::Singleton(el1);
const auto bSet2 = Factory::Singleton(el3);
const auto decart12 = Factory::Decartian({ bSet1, bSet2 });
const auto decart21 = Factory::Decartian({ bSet2, bSet1 });
EXPECT_NE(decart12, decart21);
const auto decartian12 = Factory::Decartian({ bSet1, bSet2 });
const auto decartian21 = Factory::Decartian({ bSet2, bSet1 });
EXPECT_NE(decartian12, decartian21);
}
TEST_F(UTStructuredData, DecartianContains) {
const auto bSet1 = Factory::Set({ el1, el2 });
const auto bSet2 = Factory::Set({ el1, el2, el3 });
const auto decart = Factory::Decartian({ bSet1, bSet2 });
EXPECT_TRUE(decart.B().Contains(Factory::Tuple({ el1, el3 })));
EXPECT_FALSE(decart.B().Contains(Factory::Tuple({ el3, el3 })));
EXPECT_FALSE(decart.B().Contains(Factory::Tuple({ el1, el3, el3 })));
const auto decartian = Factory::Decartian({ bSet1, bSet2 });
EXPECT_TRUE(decartian.B().Contains(Factory::Tuple({ el1, el3 })));
EXPECT_FALSE(decartian.B().Contains(Factory::Tuple({ el3, el3 })));
EXPECT_FALSE(decartian.B().Contains(Factory::Tuple({ el1, el3, el3 })));
}
TEST_F(UTStructuredData, DecartianIteration) {
const auto bSet1 = Factory::Set({ el1, el2 });
const auto bSet2 = Factory::Set({ el1, el2, el3 });
const auto decart = Factory::Decartian({ bSet1, bSet2 });
const auto decartian = Factory::Decartian({ bSet1, bSet2 });
auto elements = std::set<StructuredData>{};
for (const auto& el : decart.B()) {
for (const auto& el : decartian.B()) {
elements.insert(el);
}
EXPECT_EQ(decart.B().Cardinality(), ssize(elements));
EXPECT_EQ(decartian.B().Cardinality(), ssize(elements));
}
TEST_F(UTStructuredData, BooleanCreate) {

View File

@ -1,6 +1,6 @@
# Generate lexers for RSlang
$bison = 'C:\GnuWin32\win_flex_bison3\win_bison.exe'
$bison = 'C:\ProgramData\chocolatey\bin\win_bison.exe'
$workDir = Resolve-Path -Path "${PSScriptRoot}\..\ccl\rslang\src"
$grammar = 'RSParserImpl.y'