diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g index cfedac62d97befb1278f79e1315aff755edfc200..fc0cd5d00b92300edb6fa2db82ce6d3335c9b979 100644 --- a/libwccl/parser/grammar.g +++ b/libwccl/parser/grammar.g @@ -50,7 +50,7 @@ options { // ---------------------------------------------------------------------------- class ANTLRParser extends Parser; options { - k = 6; + k = 4; exportVocab = ANTLRExpr; buildAST = false; defaultErrorHandler = false; @@ -77,9 +77,6 @@ private: // - nie mozna utworzy Const::Value i na tym robic specjalizowany reset? // - base, orth -// Bylo boolean_v TRUE_VALUE. FALSE_VALE, a jest "True", "False" - bylo z -// regula lexera, a teraz jest wstawione na "sztywno" do gramatyki - /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // "GLOBAL" RULES @@ -108,23 +105,11 @@ parse_predicates res.reset(new ANTLRParserResult<Wccl::Bool>()); boost::shared_ptr<Wccl::Function<Wccl::Bool> > op; } - : op = predicates [*res->variables.get()] { + : op = logical_predicates [*res->variables.get()] { res->op = op; } ; -// ---------------------------------------------------------------------------- -// Rules for parsing values in scope (variables). -// Returns boost::shared_ptr<Wccl::Function<Wccl::Value> > -/* -parse_values - returns [boost::shared_ptr<Wccl::Function<Wccl::Value> > res] -{ - Wccl::Variables vars; -} - : res = values [vars] -; -*/ // ---------------------------------------------------------------------------- // Rules for parsing tagset (symbol set) operators // Returns boost::shared_ptr<Wccl::Function<Wccl::TSet> > @@ -138,26 +123,7 @@ parse_sym_set_operator res->op = op; } ; -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// All values: -// Values can be use for setvar(...,..) -// ---------------------------------------------------------------------------- -/* -values - [Wccl::Variables& vars] - returns [boost::shared_ptr<Wccl::Function<Wccl::Value> > res] -{ - boost::shared_ptr<Wccl::Constant<Wccl::StrSet> > r_StrSet; - boost::shared_ptr<Wccl::Constant<Wccl::TSet> > r_TSet; - boost::shared_ptr<Wccl::Constant<Wccl::Bool> > r_Bool; - boost::shared_ptr<Wccl::Constant<Wccl::Position> > r_Pos; -} - : r_Pos = position [vars] // TODO { res = r_Pos; } - | r_TSet = sym_set [vars] - | r_Bool = boolean [vars] -; -*/ + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // VALUES @@ -165,18 +131,18 @@ values /////////////////////////////////////////////////////////////////////////////// // ---------------------------------------------------------------------------- // Single or muliple values in string set -str_set_v_in +str_set_value_in [boost::shared_ptr<Wccl::StrSet>& s_set] : v1: STRING { s_set->insert(token_ref_to_ustring(v1)); } - | v2: STRING COMMA str_set_v_in [s_set] { + | v2: STRING COMMA str_set_value_in [s_set] { s_set->insert(token_ref_to_ustring(v2)); } ; // string set, called as unnamed (temporary) StrSet: // calls: [] ['a'] ['a', 'b'] ["a"] ["a", "b"] ['a', "b"] or variable $A -str_set_v +str_set_value returns [boost::shared_ptr<Wccl::Constant<Wccl::StrSet> > val] { boost::shared_ptr<Wccl::StrSet> set(new Wccl::StrSet); @@ -184,7 +150,7 @@ str_set_v : LBRACKET RBRACKET { val.reset(new Wccl::Constant<Wccl::StrSet>(*set.get())); } - | LBRACKET str_set_v_in [set] RBRACKET { + | LBRACKET str_set_value_in [set] RBRACKET { val.reset(new Wccl::Constant<Wccl::StrSet>(*set.get())); } ; @@ -208,12 +174,12 @@ sym_set_elem ; // sym set in -sym_set_in +sym_set_value_in [boost::shared_ptr<Wccl::TSet> &set] : sym_set_elem [set] ; // sym set {} {a} {a, b} -sym_set_v +sym_set_value returns [boost::shared_ptr<Wccl::Constant<Wccl::TSet> > val] { boost::shared_ptr<Wccl::TSet> set(new Wccl::TSet); @@ -221,20 +187,20 @@ sym_set_v : LCURLY RCURLY { val.reset(new Wccl::Constant<Wccl::TSet>(*set.get())); } - | LCURLY sym_set_in [set] RCURLY { + | LCURLY sym_set_value_in [set] RCURLY { val.reset(new Wccl::Constant<Wccl::TSet>(*set.get())); } ; // ---------------------------------------------------------------------------- // boolean value: -boolean_v +boolean_value returns [boost::shared_ptr<Wccl::Constant<Wccl::Bool> > val] - : TRUE_VALUE { val.reset(new Wccl::Constant<Wccl::Bool>(Wccl::Bool(true ))); } - | FALSE_VALUE { val.reset(new Wccl::Constant<Wccl::Bool>(Wccl::Bool(false))); } + : "True" { val.reset(new Wccl::Constant<Wccl::Bool>(Wccl::Bool(true ))); } + | "False" { val.reset(new Wccl::Constant<Wccl::Bool>(Wccl::Bool(false))); } ; // ---------------------------------------------------------------------------- // position value: -position_v +position_value returns [boost::shared_ptr<Wccl::Constant<Wccl::Position> > val] : i: INT { val.reset( @@ -271,10 +237,10 @@ position_v /////////////////////////////////////////////////////////////////////////////// // Position: $name // ---------------------------------------------------------------------------- -position +position_variable [Wccl::Variables& vars] returns [boost::shared_ptr<Wccl::VarGetter<Wccl::Position> > op] - : DOLLAR n: VAR_NAME { + : DOLLAR n: SYMBOL { vars.get_put<Wccl::Position>(token_ref_to_std_string(n)); Wccl::VariableAccesor<Wccl::Position> acc = @@ -286,9 +252,9 @@ position // ---------------------------------------------------------------------------- // Position reference: $(0-9)+name // !! Cannot use for setvar(...,...) !! -position_ref +position_ref_variable [Wccl::Variables& vars] - : DOLLAR p_ref: INT n: VAR_NAME { + : DOLLAR p_ref: INT n: SYMBOL { // TODO } ; @@ -296,13 +262,13 @@ position_ref // String set, call examples: $name, $sName, $s_name, $s_Name etc. // This expression gets variable of tyme StrSet from string-named variable // Returns Wccl::VarGetter<Wccl::StrSet> from Set-variables -str_set +str_set_variable [Wccl::Variables& vars] returns [boost::shared_ptr<Wccl::VarGetter<Wccl::StrSet> > op] - : DOLLAR STR_PREFIX n: VAR_NAME { + : DOLLAR STR_PREFIX n: SYMBOL { // get/put variable to variables vars.get_put<Wccl::StrSet>(token_ref_to_std_string(n)); - + // makes accesor for value Wccl::VariableAccesor<Wccl::StrSet> acc = vars.create_accesor<Wccl::StrSet>(token_ref_to_std_string(n)); @@ -312,10 +278,10 @@ str_set ; // ---------------------------------------------------------------------------- // Symbol set: $tName -sym_set +sym_set_variable [Wccl::Variables& vars] returns [boost::shared_ptr<Wccl::VarGetter<Wccl::TSet> > op] - : DOLLAR TST_PREFIX n: VAR_NAME { + : DOLLAR TST_PREFIX n: SYMBOL { vars.get_put<Wccl::TSet>(token_ref_to_std_string(n)); Wccl::VariableAccesor<Wccl::TSet> acc = @@ -326,10 +292,10 @@ sym_set ; // ---------------------------------------------------------------------------- // Bool: $bName -boolean +boolean_variable [Wccl::Variables& vars] - returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op] - : DOLLAR BOOL_PREFIX n: VAR_NAME { + returns [boost::shared_ptr<Wccl::VarGetter<Wccl::Bool> > op] + : DOLLAR BOOL_PREFIX n: SYMBOL { vars.get_put<Wccl::Bool>(token_ref_to_std_string(n)); Wccl::VariableAccesor<Wccl::Bool> acc = @@ -348,53 +314,86 @@ boolean // ---------------------------------------------------------------------------- // Setvar operator // ---------------------------------------------------------------------------- -/* setvar_op [Wccl::Variables& vars] returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > ret] - : setvar_pos [value] - | setvar_bool [value] - : ret = setvar_sset [vars] - | setvar_tset [value] + : ret = setvar_pos [vars] + | ret = setvar_bool [vars] + | ret = setvar_sset [vars] + | ret = setvar_tset [vars] ; -*/ // Implementations of setvar: // ---------------------------------------------------------------------------- -// setvar dla position przyjmuje position_ref -> TODO sprawdzic dlaczego -// gramatyka nie pokrywa "setvar" LPAREN position COMMA position_v RPAREN -/* -setvar_pos [std::string& value] - : "setvar" LPAREN position_ref [value] COMMA position_v [value] RPAREN -// : "setvar" LPAREN position [value] COMMA position_v [value] RPAREN - ; -*/ -/* -setvar_bool [std::string& value] - : "setvar" LPAREN boolean [value] COMMA boolean_v [value] RPAREN +// setvar dla position przyjmuje position_ref_variable -> TODO sprawdzic dlaczego +// gramatyka nie pokrywa "setvar" LPAREN position COMMA position_value RPAREN +setvar_pos + [Wccl::Variables& vars] + returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op] +{ + boost::shared_ptr<Wccl::Function<Wccl::Position> > ret_op; + boost::shared_ptr<Wccl::VarGetter<Wccl::Position> > ret_var; +} + : "setvar" LPAREN ret_var = position_variable [vars] COMMA + ret_op = op_position [vars] RPAREN { + + Wccl::VariableAccesor<Wccl::Position> acc = + vars.create_accesor<Wccl::Position>(ret_var->acc_name()); + + op.reset(new Wccl::VarSetter<Wccl::Position>(acc, ret_op)); + } + ; -*/ +// ---------------------------------------------------------------------------- +setvar_bool + [Wccl::Variables& vars] + returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op] +{ + boost::shared_ptr<Wccl::Function<Wccl::Bool> > ret_op; + boost::shared_ptr<Wccl::VarGetter<Wccl::Bool> > ret_var; +} + : "setvar" LPAREN ret_var = boolean_variable [vars] COMMA + ret_op = logical_predicates [vars] RPAREN { -/* + Wccl::VariableAccesor<Wccl::Bool> acc = + vars.create_accesor<Wccl::Bool>(ret_var->acc_name()); + + op.reset(new Wccl::VarSetter<Wccl::Bool>(acc, ret_op)); + } +; +// ---------------------------------------------------------------------------- setvar_sset [Wccl::Variables& vars] - returns [boost::shared_ptr<Wccl::VarSetter<Wccl::Bool> > op] + returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op] { - boost::shared_ptr<Wccl::VarGetter<Wccl::StrSet> > ret_str_var; - boost::shared_ptr<Wccl::Function<Wccl::StrSet> > ret_str_op; + boost::shared_ptr<Wccl::Function<Wccl::StrSet> > ret_op; + boost::shared_ptr<Wccl::VarGetter<Wccl::StrSet> > ret_var; } - : "setvar" LPAREN ret_str_var = str_set [vars] COMMA - ret_str_op = string_operators [vars] RPAREN { -// VariableAccesor<Bool> acc_t = cx.variables()->create_accesor<Bool>("True_bool"); -// VarSetter<Bool> var_setter(acc_t, false_constant); -// Wccl::VariableAccesor<Wccl::StrSet> acc_t = vars->create_accesor<Wccl::StrSet>("True_bool"); + : "setvar" LPAREN ret_var = str_set_variable [vars] COMMA + ret_op = string_operators [vars] RPAREN { + + Wccl::VariableAccesor<Wccl::StrSet> acc = + vars.create_accesor<Wccl::StrSet>(ret_var->acc_name()); + + op.reset(new Wccl::VarSetter<Wccl::StrSet>(acc, ret_op)); + } +; +// ---------------------------------------------------------------------------- +setvar_tset + [Wccl::Variables& vars] + returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op] +{ + boost::shared_ptr<Wccl::Function<Wccl::TSet> > ret_op; + boost::shared_ptr<Wccl::VarGetter<Wccl::TSet> > ret_var; +} + : "setvar" LPAREN ret_var = sym_set_variable [vars] COMMA + ret_op = sym_set_operators [vars] RPAREN { + + Wccl::VariableAccesor<Wccl::TSet> acc = + vars.create_accesor<Wccl::TSet>(ret_var->acc_name()); + + op.reset(new Wccl::VarSetter<Wccl::TSet>(acc, ret_op)); } ; -*/ -/* -setvar_tset [std::string& value] - : "setvar" LPAREN sym_set [value] COMMA sym_set_v [value] RPAREN - ; -*/ // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- @@ -411,8 +410,8 @@ sym_set_operators op_sym_set [Wccl::Variables& vars] returns [boost::shared_ptr<Wccl::Function<Wccl::TSet> > op] - : op = sym_set [vars] - | op = sym_set_v + : op = sym_set_variable [vars] + | op = sym_set_value ; // ---------------------------------------------------------------------------- @@ -430,8 +429,8 @@ position_operators op_position [Wccl::Variables& vars] returns [boost::shared_ptr<Wccl::Function<Wccl::Position> > op] - : op = position [vars] - | op = position_v + : op = position_variable [vars] + | op = position_value ; // ---------------------------------------------------------------------------- @@ -457,7 +456,7 @@ op_orth { // TODO } - : "orth" LBRACKET position_ref [vars] RBRACKET { + : "orth" LBRACKET position_ref_variable [vars] RBRACKET { // ret = TODO } ; @@ -468,7 +467,7 @@ op_base { // TODO } - : "base" LBRACKET position_ref [vars] RBRACKET { + : "base" LBRACKET position_ref_variable [vars] RBRACKET { // ret = TODO } ; @@ -509,8 +508,8 @@ op_affix op_str_set [Wccl::Variables& vars] returns [boost::shared_ptr<Wccl::Function<Wccl::StrSet> > op] - : op = str_set [vars] - | op = str_set_v + : op = str_set_variable [vars] + | op = str_set_value ; // ---------------------------------------------------------------------------- @@ -518,13 +517,6 @@ op_str_set // Logical predicates // Returns boost::shared_ptr<Wccl::Function<Wccl::Bool> > // ---------------------------------------------------------------------------- -predicates - [Wccl::Variables& vars] - returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > ret] - : ret = logical_predicates [vars] -; -// Implementations of predicates: -// ---------------------------------------------------------------------------- logical_predicates [Wccl::Variables& vars] returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > ret] @@ -536,7 +528,7 @@ logical_predicates | ret = lpred_inter [vars] | ret = lpred_eq [vars] | ret = lpred_regex [vars] -// | ret = setvar_op [vars] + | ret = setvar_op [vars] ; // ---------------------------------------------------------------------------- // comma-separated predicates @@ -601,8 +593,8 @@ lpred_nor lpred_bool [Wccl::Variables& vars] returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op] - : op = boolean [vars] - | op = boolean_v + : op = boolean_variable [vars] + | op = boolean_value ; // ---------------------------------------------------------------------------- lpred_in @@ -617,17 +609,19 @@ lpred_in : "in" LPAREN ss1 = string_operators [vars] COMMA ss2 = string_operators [vars] RPAREN { op.reset( -// new Wccl::IsSubsetOf(*ss1.get(), *ss2.get()) +// 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(*ts1.get(), *ts2.get())); } +/* | "in" LPAREN p1 = position_operators [vars] COMMA p2 = position_operators [vars] RPAREN { // op.reset(new Wccl::IsSubsetOf(*p1.get(), *p2.get())); } +*/ ; // ---------------------------------------------------------------------------- lpred_inter @@ -647,10 +641,12 @@ lpred_inter ts2 = sym_set_operators [vars] RPAREN { // op.reset(new Wccl::Intersects(*ts1.get(), *ts2.get())); } +/* | "inter" LPAREN p1 = position_operators [vars] COMMA p2 = position_operators [vars] RPAREN { // op.reset(new Wccl::Intersects(*p1.get(), *p2.get())); } +*/ ; // ---------------------------------------------------------------------------- lpred_eq @@ -669,10 +665,12 @@ lpred_eq 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)); } +*/ ; // ---------------------------------------------------------------------------- @@ -839,17 +837,20 @@ options { paraphrase = "Symbol"; testLiterals = true; } -// : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')* - : ('a'..'z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')* + : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')* +// : ('a'..'z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')* ; +/* VAR_NAME options { paraphrase = "Variable name"; } : ('A'..'Z') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')* ; +*/ +/* TRUE_VALUE options { paraphrase = "True value"; @@ -863,6 +864,7 @@ options { } : "False" ; +*/ WS : ( ' ' diff --git a/wcclparser/CMakeLists.txt b/wcclparser/CMakeLists.txt index df58345dc072aa5a1f8b5046fef5058fade7a9fa..8aa7e3f848f478196438ebc42d8c220c70f6df0c 100644 --- a/wcclparser/CMakeLists.txt +++ b/wcclparser/CMakeLists.txt @@ -4,19 +4,26 @@ include_directories( ${CMAKE_SOURCE_DIR} ) add_definitions(-DLIBWCCL_WCCLPARSER_DATA_DIR="${PROJECT_SOURCE_DIR}/") +# String operator add_executable(parser-strop - strop_main.cpp + strop_main.cpp ) target_link_libraries (parser-strop wccl ${Boost_LIBRARIES} antlr) -add_executable(parser-val - val_main.cpp +# Bool operator +add_executable(parser-boolop + bool_main.cpp ) -target_link_libraries (parser-val wccl ${Boost_LIBRARIES} antlr) +target_link_libraries (parser-boolop wccl ${Boost_LIBRARIES} antlr) + +# Tagset operator +add_executable(parser-tagop + tagset_main.cpp +) +target_link_libraries (parser-tagop wccl ${Boost_LIBRARIES} antlr) include_directories(${Boost_INCLUDE_DIR}) link_directories(${Boost_LIBRARY_DIRS}) #add_custom_target(test tests) #add_custom_target(test-verbose ./tests --log_level=message) - diff --git a/wcclparser/bool_main.cpp b/wcclparser/bool_main.cpp index d41f0f1f9cb6389be23e4a1dcf54afbf0928e958..68214133e9292687d22b612eb448cc52f5a40e8d 100644 --- a/wcclparser/bool_main.cpp +++ b/wcclparser/bool_main.cpp @@ -66,6 +66,12 @@ int main() catch (antlr::MismatchedTokenException &e) { std::cerr << e.getMessage() << std::endl; } + catch (Wccl::InvalidVariableName &e) { + std::cerr << "Wccl::InvalidVariableName" << std::endl; + } + catch (Wccl::VariableTypeMismatch &e) { + std::cerr << "Wccl::VariableTypeMismatch" << std::endl; + } catch (...) { std::cerr << "[N] Syntax error!" << std::endl; }