diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g index 20e53c3b0fad1f5857b7c47b18889722dbc05c41..ae10dc4c8e11d0a7a8dfc7dc46d5480279130835 100644 --- a/libwccl/parser/grammar.g +++ b/libwccl/parser/grammar.g @@ -58,7 +58,10 @@ header { #include <libwccl/ops/functions/bool/iterations/leftlook.h> #include <libwccl/ops/functions/bool/iterations/rightlook.h> - // actions + // Rules, actions + #include <libwccl/ops/rule.h> + #include <libwccl/ops/rulesequence.h> + // #include <libwccl/ops/actions/unify.h> #include <libwccl/ops/actions/delete.h> #include <libwccl/ops/actions/select.h> @@ -204,6 +207,30 @@ parse_position_operator EOF ; +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// Rule for parsing single WCCL Rule +// Returns boost::shared_ptr<Rule> +parse_single_rule + [const Corpus2::Tagset &tagset] + returns [boost::shared_ptr<Rule> rle] +{ + Variables vars; +} + : rle = rule [tagset, vars] +; + +// Rule for parsing rules section in the wccl file +// Returns boost::shared_ptr<RuleSequence> +parse_rule_sequence + [const Corpus2::Tagset& tagset] + returns [boost::shared_ptr<RuleSequence> rule_seq] +{ + Variables vars; +} + : rule_seq = rules[tagset, vars] +; + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // VALUES @@ -1331,19 +1358,104 @@ symset_setvar // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- -// Tagging rules: +// Tagging actions and rules: // ---------------------------------------------------------------------------- -rule_action + +// ---------------------------------------------------------------------------- +// Single action such as select, delete, relabel or unify +action [const Corpus2::Tagset& tagset, Variables& vars] - returns [boost::shared_ptr<Action> action] - : action = action_select [tagset, vars] - | action = action_delete [tagset, vars] - | action = action_relabel [tagset, vars] + returns [boost::shared_ptr<Action> act] + : act = action_select [tagset, vars] + | act = action_delete [tagset, vars] + | act = action_relabel [tagset, vars] // - | action = action_unify [tagset, vars] + | act = action_unify [tagset, vars] // ; +// Action sequence - the actions are separated with commas: +// select(...), select(...), delete(...) +action_sequence + [const Corpus2::Tagset& tagset, Variables& vars] + returns [boost::shared_ptr<std::vector<boost::shared_ptr<Action> > > v_act] +{ + boost::shared_ptr<Action> act; + v_act.reset(new std::vector<boost::shared_ptr<Action> >); +} + : act = action[tagset, vars] { + v_act->push_back(act); + } + ( + COMMA act = action[tagset, vars] { + v_act->push_back(act); + } + )* +; + +// ---------------------------------------------------------------------------- +// Single rule: +// rule(NAME, ACTIONS) or rule(NAME, COND, ACTIONS) +rule + [const Corpus2::Tagset& tagset, Variables& vars] + returns [boost::shared_ptr<Rule> rle] +{ + boost::shared_ptr<Function<Bool> > condition; + boost::shared_ptr<std::vector<boost::shared_ptr<Action> > > actions; +} + : "rule" LPAREN name: STRING COMMA + ( + (bool_operator[tagset, vars]) => + ( + condition = bool_operator [tagset, vars] COMMA + actions = action_sequence [tagset, vars] { + // rule(NAME, COND, ACTIONS) + rle.reset( + new Rule(token_ref_to_std_string(name), vars, actions, condition)); + } + ) + | + ( + actions = action_sequence [tagset, vars] { + // rule(NAME, ACTIONS) + rle.reset(new Rule(token_ref_to_std_string(name), vars, actions)); + } + ) + ) + RPAREN +; + +// Rule sequence +rule_sequence + [const Corpus2::Tagset& tagset, Variables& vars] + returns [boost::shared_ptr<RuleSequence> rule_seq] +{ + // FIXME czy tutaj przypadkiem nie powinno byc shared_ptr? + std::vector<Rule> rls; + boost::shared_ptr<Rule> rle; + + rule_seq.reset(new RuleSequence(rls)); +} + : rle = rule [tagset, vars] { + rls.push_back(*rle); + } + ( + COMMA rle = rule [tagset, vars] { + rls.push_back(*rle); + } + )* +; + +// Temporary name. +// This is wrapper for rule_sequence in rules section in the wccl file +rules + [const Corpus2::Tagset& tagset, Variables& vars] + returns [boost::shared_ptr<RuleSequence> rule_seq] + : "rules" LPAREN rule_seq = rule_sequence [tagset, vars] RPAREN { + // + } +; + // ---------------------------------------------------------------------------- // Select action: // select(position, predicate) or select(predicate);