diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g index bb2dac0eb0563485985dbac36e7b1755f95488d0..157129f8288559069e2825d17d5c7aaf732b8990 100644 --- a/libwccl/parser/grammar.g +++ b/libwccl/parser/grammar.g @@ -38,6 +38,8 @@ header { #include <libwccl/ops/isinside.h> #include <libwccl/ops/isoutside.h> + #include <libwccl/ops/conditional.h> + // Unicode String #include <unicode/uniset.h> #include <unicode/unistr.h> @@ -77,9 +79,9 @@ private: } // TODO -// - jak utworzyc TSet (dodac element do TSet) -// - nie mozna utworzy Const::Value i na tym robic specjalizowany reset? // - base, orth +// - po dodaniu reguly condit_sym jest niejednoznacznosc w in/inter/equal!! +// - equal do bool /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -441,6 +443,7 @@ sym_set_operators [Wccl::Variables& vars] returns [boost::shared_ptr<Wccl::Function<Wccl::TSet> > ret] : ret = op_sym_set [vars] + | ret = condit_sym [vars] ; // Implementations of symbol set operators: // ---------------------------------------------------------------------------- @@ -451,6 +454,28 @@ op_sym_set | op = sym_set_value ; +// ---------------------------------------------------------------------------- +// if (Bool, TSet, TSet) +// ? TSet ? Bool : {} +condit_sym + [Wccl::Variables& vars] + returns [boost::shared_ptr<Wccl::Function<Wccl::TSet> > op] +{ + boost::shared_ptr<Wccl::Function<Wccl::Bool> > test; + boost::shared_ptr<Wccl::Function<Wccl::TSet> > p_true, p_false; +} + : "if" LPAREN test = logical_predicates [vars] COMMA + p_true = sym_set_operators [vars] COMMA + p_false = sym_set_operators [vars] { + op.reset(new Wccl::Conditional<Wccl::TSet>(test, p_true, p_false)); + } +/* + | Q_MARK p_true = sym_set_operators [vars] + Q_MARK test = logical_predicates [vars] { + op.reset(new Wccl::Conditional<Wccl::TSet>(test, p_true)); + } +*/ +; // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // Position operators @@ -484,6 +509,7 @@ string_operators | ret = op_upper [vars] | ret = op_affix [vars] | ret = op_str_set [vars] + | ret = condit_str [vars] ; // Implementations of string operators: // ---------------------------------------------------------------------------- @@ -548,6 +574,28 @@ op_str_set : op = str_set_variable [vars] | op = str_set_value ; +// ---------------------------------------------------------------------------- +// if (Bool, StrSet, StrSet) +// ? StrSet ? Bool : [] +condit_str + [Wccl::Variables& vars] + returns [boost::shared_ptr<Wccl::Function<Wccl::StrSet> > op] +{ + boost::shared_ptr<Wccl::Function<Wccl::Bool> > test; + boost::shared_ptr<Wccl::Function<Wccl::StrSet> > p_true, p_false; +} + : "if" LPAREN test = logical_predicates [vars] COMMA + p_true = string_operators [vars] COMMA + p_false = string_operators [vars] { + op.reset(new Wccl::Conditional<Wccl::StrSet>(test, p_true, p_false)); + } +/* + | Q_MARK p_true = string_operators [vars] + Q_MARK test = logical_predicates [vars] { + op.reset(new Wccl::Conditional<Wccl::StrSet>(test, p_true)); + } +*/ +; // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- @@ -567,6 +615,7 @@ logical_predicates | ret = lpred_regex [vars] | ret = setvar_op [vars] | ret = lpred_inout [vars] + | ret = condit_bool [vars] ; // ---------------------------------------------------------------------------- // comma-separated predicates @@ -647,11 +696,11 @@ lpred_in ss2 = string_operators [vars] RPAREN { op.reset(new Wccl::IsSubsetOf<Wccl::StrSet>(ss1, ss2)); } +/* | "in" LPAREN ts1 = sym_set_operators [vars] COMMA ts2 = sym_set_operators [vars] RPAREN { op.reset(new Wccl::IsSubsetOf<Wccl::TSet>(ts1, ts2)); } -/* | "in" LPAREN p1 = position_operators [vars] COMMA p2 = position_operators [vars] RPAREN { // op.reset(new Wccl::IsSubsetOf(*p1.get(), *p2.get())); @@ -666,23 +715,21 @@ lpred_inter { boost::shared_ptr<Wccl::Function<Wccl::StrSet> > ss1, ss2; boost::shared_ptr<Wccl::Function<Wccl::TSet> > ts1, ts2; - boost::shared_ptr<Wccl::Function<Wccl::Position> > p1, p2; - } - : "inter" LPAREN ss1 = string_operators [vars] COMMA - ss2 = string_operators [vars] RPAREN { - op.reset(new Wccl::Intersects<Wccl::StrSet>(ss1, ss2)); - } - | "inter" LPAREN ts1 = sym_set_operators [vars] COMMA - ts2 = sym_set_operators [vars] RPAREN { - op.reset(new Wccl::Intersects<Wccl::TSet>(ts1, ts2)); - } -/* - | "inter" LPAREN p1 = position_operators [vars] COMMA - p2 = position_operators [vars] RPAREN { - // op.reset(new Wccl::Intersects(*p1.get(), *p2.get())); + : "inter" LPAREN ( + (ss1 = string_operators [vars] COMMA ss2 = string_operators [vars] RPAREN) + (ts1 = sym_set_operators [vars] COMMA ts2 = sym_set_operators [vars] RPAREN) | + ) { + if (ss1) { + op.reset(new Wccl::Intersects<Wccl::StrSet>(ss1, ss2)); + } + else if (ts1) { + op.reset(new Wccl::Intersects<Wccl::TSet>(ts1, ts2)); + } + else { + assert(false); + } } -*/ ; // ---------------------------------------------------------------------------- @@ -698,11 +745,11 @@ lpred_eq ss2 = string_operators [vars] RPAREN { op.reset(new Wccl::Equals<Wccl::StrSet>(ss1, ss2)); } +/* | "equal" LPAREN ts1 = sym_set_operators [vars] COMMA ts2 = sym_set_operators [vars] RPAREN { op.reset(new Wccl::Equals<Wccl::TSet>(ts1, ts2)); } -/* | "equal" LPAREN p1 = position_operators [vars] COMMA p2 = position_operators [vars] RPAREN { op.reset(new Wccl::Equals<Wccl::Position>(p1, p2)); @@ -737,6 +784,26 @@ lpred_inout } ; +// ---------------------------------------------------------------------------- +// if (Bool, Bool, Bool) +// ? Bool ? Bool : False +condit_bool + [Wccl::Variables& vars] + returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op] +{ + boost::shared_ptr<Wccl::Function<Wccl::Bool> > test, p_true, p_false; +} + : "if" LPAREN test = logical_predicates [vars] COMMA + p_true = logical_predicates [vars] COMMA + p_false = logical_predicates [vars] { + op.reset(new Wccl::Conditional<Wccl::Bool>(test, p_true, p_false)); + } + | Q_MARK p_true = logical_predicates [vars] + Q_MARK test = logical_predicates [vars] { + op.reset(new Wccl::Conditional<Wccl::Bool>(test, p_true)); + } +; + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // ANTLR LEXER @@ -821,6 +888,13 @@ options { : "b:" ; +POS_PREFIX +options { + paraphrase = "Bool prefix"; +} + : "p:" +; + LBRACKET options { paraphrase = "'['";