From 42c6288cdde0ff094331fbf9a06900fa7efd4c1b Mon Sep 17 00:00:00 2001 From: Jeffrey Kegler Date: Sat, 16 Jun 2012 21:10:42 -0700 Subject: [PATCH] Separating general pattern functions: t+ --- r2/libmarpa/dev/api.texi | 4 +- r2/libmarpa/dev/marpa.w | 24 ++-- r2/pod/Advanced/Thin.pod | 4 + r2/xs/R2.xs | 252 +-------------------------------------- r2/xs/gp_generate.pl | 21 +++- 5 files changed, 38 insertions(+), 267 deletions(-) diff --git a/r2/libmarpa/dev/api.texi b/r2/libmarpa/dev/api.texi index d61ccf948..45c92589b 100644 --- a/r2/libmarpa/dev/api.texi +++ b/r2/libmarpa/dev/api.texi @@ -1628,7 +1628,7 @@ Return value: On success, the rule length. On failure, -2. @end deftypefun -@deftypefun Marpa_Symbol_ID marpa_g_rule_rh_symbol ( @ +@deftypefun Marpa_Symbol_ID marpa_g_rule_rhs ( @ Marpa_Grammar @var{g}, @ Marpa_Rule_ID @var{rule_id}, @ int @var{ix}) @@ -4014,7 +4014,7 @@ Return value: On success, the IRL length. On failure, -2. @end deftypefun -@deftypefun Marpa_Symbol_ID _marpa_g_irl_rh_symbol ( @ +@deftypefun Marpa_Symbol_ID _marpa_g_irl_rhs ( @ Marpa_Grammar @var{g}, @ Marpa_IRL_ID @var{irl_id}, @ int @var{ix}) diff --git a/r2/libmarpa/dev/marpa.w b/r2/libmarpa/dev/marpa.w index cc1c7b7fe..ef080eab5 100644 --- a/r2/libmarpa/dev/marpa.w +++ b/r2/libmarpa/dev/marpa.w @@ -1947,7 +1947,7 @@ PRIVATE Marpa_Symbol_ID* rule_rhs_get(RULE rule) { return rule->t_symbols+1; } @ @ = -Marpa_Symbol_ID marpa_g_rule_rh_symbol(Marpa_Grammar g, Marpa_Rule_ID xrl_id, int ix) { +Marpa_Symbol_ID marpa_g_rule_rhs(Marpa_Grammar g, Marpa_Rule_ID xrl_id, int ix) { RULE rule; @@; @@; @@ -2255,7 +2255,7 @@ Marpa_ISY_ID _marpa_g_irl_lhs(Marpa_Grammar g, Marpa_IRL_ID irl_id) { @ @d RHSID_of_IRL(irl, position) ((irl)->t_isyid_array[(position)+1]) @ @d RHS_of_IRL(irl, position) ISY_by_ID(RHSID_of_IRL((irl), (position))) @ = -Marpa_ISY_ID _marpa_g_irl_rh_symbol(Marpa_Grammar g, Marpa_IRL_ID irl_id, int ix) { +Marpa_ISY_ID _marpa_g_irl_rhs(Marpa_Grammar g, Marpa_IRL_ID irl_id, int ix) { IRL irl; @@; @@; @@ -2510,7 +2510,11 @@ int marpa_g_precompute(Marpa_Grammar g) @@; } return_value = G_EVENT_COUNT(g); - FAILURE:; + goto CLEANUP; + SOFT_FAILURE:; + return_value = -1; + goto CLEANUP; + CLEANUP:; my_obstack_free(obs_precompute); return return_value; } @@ -2569,7 +2573,7 @@ a lot of useless diagnostics. @ @ = if (UNLIKELY(xrl_count <= 0)) { MARPA_ERROR(MARPA_ERR_NO_RULES); - return failure_indicator; + goto SOFT_FAILURE; } @ Loop over the rules, producing boolean vector of LHS symbols, and of @@ -2581,17 +2585,17 @@ While at it, set a flag to indicate if there are empty rules. if (UNLIKELY(start_xsyid < 0)) { MARPA_ERROR (MARPA_ERR_NO_START_SYMBOL); - return failure_indicator; + goto SOFT_FAILURE; } if (UNLIKELY(!xsyid_is_valid (g, start_xsyid))) { MARPA_ERROR (MARPA_ERR_INVALID_START_SYMBOL); - return failure_indicator; + goto SOFT_FAILURE; } if (UNLIKELY(!SYM_is_LHS (SYM_by_ID (start_xsyid)))) { MARPA_ERROR (MARPA_ERR_START_NOT_LHS); - return failure_indicator; + goto SOFT_FAILURE; } } @@ -2803,7 +2807,7 @@ RULEID** xrl_list_x_lh_sym = NULL; if (UNLIKELY(counted_nullables)) { MARPA_ERROR (MARPA_ERR_COUNTED_NULLABLE); - goto FAILURE; + goto SOFT_FAILURE; } } @@ -2832,7 +2836,7 @@ RULEID** xrl_list_x_lh_sym = NULL; if (UNLIKELY(!bv_bit_test(productive_v, (unsigned int)start_xsyid))) { MARPA_ERROR(MARPA_ERR_UNPRODUCTIVE_START); - goto FAILURE; + goto SOFT_FAILURE; } @ @ = Bit_Vector productive_v = NULL; @@ -2940,7 +2944,7 @@ reach a terminal symbol. if (UNLIKELY (nulling_terminal_found)) { MARPA_ERROR (MARPA_ERR_NULLING_TERMINAL); - goto FAILURE; + goto SOFT_FAILURE; } } diff --git a/r2/pod/Advanced/Thin.pod b/r2/pod/Advanced/Thin.pod index 7cdd4aa81..e239fa5b8 100644 --- a/r2/pod/Advanced/Thin.pod +++ b/r2/pod/Advanced/Thin.pod @@ -355,6 +355,10 @@ An exception is thrown if there is a version mismatch, which should not happen -- it indicates a problem with the way that the library was built. +=head2 precompute() + +The C method follows the general pattern. + =head1 Example =for Marpa::R2::Display diff --git a/r2/xs/R2.xs b/r2/xs/R2.xs index ed00a0014..3ba46e5b2 100644 --- a/r2/xs/R2.xs +++ b/r2/xs/R2.xs @@ -429,243 +429,6 @@ PPCODE: XPUSHs( sv_2mortal( newSViv(new_rule_id) ) ); } -Marpa_Symbol_ID -rule_lhs( g_wrapper, rule_id ) - G_Wrapper *g_wrapper; - Marpa_Rule_ID rule_id; -PPCODE: -{ - Marpa_Grammar g = g_wrapper->g; - int result = marpa_g_rule_lhs(g, rule_id); - if (result < -1) { - croak ("Problem in g->rule_lhs(%d): %s", rule_id, xs_g_error (g_wrapper)); - } - if (result < 0) { XSRETURN_UNDEF; } - XPUSHs( sv_2mortal( newSViv(result) ) ); -} - -Marpa_Symbol_ID -rule_rhs( g_wrapper, rule_id, ix ) - G_Wrapper *g_wrapper; - Marpa_Rule_ID rule_id; - int ix; -PPCODE: -{ - Marpa_Grammar g = g_wrapper->g; - int result = marpa_g_rule_rh_symbol(g, rule_id, ix); - if (result < -1) { - croak ("Problem in g->rule_rhs(%d, %d): %s", rule_id, ix, xs_g_error (g_wrapper)); - } - if (result < 0) { XSRETURN_UNDEF; } - XPUSHs( sv_2mortal( newSViv(result) ) ); -} - -int -rule_length( g_wrapper, rule_id ) - G_Wrapper *g_wrapper; - Marpa_Rule_ID rule_id; -PPCODE: -{ - Marpa_Grammar g = g_wrapper->g; - int result = marpa_g_rule_length (g, rule_id); - if (result < -1) - { - croak ("Problem in g->rule_length(%d): %s", rule_id, - xs_g_error (g_wrapper)); - } - if (result < 0) - { - XSRETURN_UNDEF; - } - XPUSHs (sv_2mortal (newSViv (result))); -} - -void -rule_is_nullable( g_wrapper, rule_id ) - G_Wrapper *g_wrapper; - Marpa_Rule_ID rule_id; -PPCODE: -{ - Marpa_Grammar g = g_wrapper->g; - int result = marpa_g_rule_is_nullable (g, rule_id); - if (result < -1) - { - croak ("Problem in g->rule_is_nullable(%d): %s", rule_id, - xs_g_error (g_wrapper)); - } - if (result < 0) - { - croak ("Invalid rule %d", rule_id); - } - if (result) - XSRETURN_YES; - XSRETURN_NO; -} - -void -rule_is_nulling( g_wrapper, rule_id ) - G_Wrapper *g_wrapper; - Marpa_Rule_ID rule_id; -PPCODE: -{ - Marpa_Grammar g = g_wrapper->g; - int result = marpa_g_rule_is_nulling (g, rule_id); - if (result < -1) - { - croak ("Problem in g->rule_is_nulling(%d): %s", rule_id, - xs_g_error (g_wrapper)); - } - if (result < 0) - { - croak ("Invalid rule %d", rule_id); - } - if (result) - XSRETURN_YES; - XSRETURN_NO; -} - -void -rule_is_accessible( g_wrapper, rule_id ) - G_Wrapper *g_wrapper; - Marpa_Rule_ID rule_id; -PPCODE: -{ - Marpa_Grammar g = g_wrapper->g; - int result = marpa_g_rule_is_accessible (g, rule_id); - if (result < -1) - { - croak ("Problem in g->rule_is_accessible(%d): %s", rule_id, - xs_g_error (g_wrapper)); - } - if (result < 0) - { - croak ("Invalid rule %d", rule_id); - } - if (result) - XSRETURN_YES; - XSRETURN_NO; -} - -void -rule_is_productive( g_wrapper, rule_id ) - G_Wrapper *g_wrapper; - Marpa_Rule_ID rule_id; -PPCODE: -{ - Marpa_Grammar g = g_wrapper->g; - int result = marpa_g_rule_is_productive (g, rule_id); - if (result < -1) - { - croak ("Problem in g->rule_is_productive(%d): %s", rule_id, - xs_g_error (g_wrapper)); - } - if (result < 0) - { - croak ("Invalid rule %d", rule_id); - } - if (result) - XSRETURN_YES; - XSRETURN_NO; -} - -void -rule_is_loop( g_wrapper, rule_id ) - G_Wrapper *g_wrapper; - Marpa_Rule_ID rule_id; -PPCODE: -{ - Marpa_Grammar g = g_wrapper->g; - int result = marpa_g_rule_is_loop (g, rule_id); - if (result < -1) - { - croak ("Problem in g->rule_is_loop(%d): %s", rule_id, - xs_g_error (g_wrapper)); - } - if (result < 0) - { - croak ("Invalid rule %d", rule_id); - } - if (result) - XSRETURN_YES; - XSRETURN_NO; -} - -void -rule_is_sequence( g_wrapper, rule_id ) - G_Wrapper *g_wrapper; - Marpa_Rule_ID rule_id; -PPCODE: -{ - Marpa_Grammar g = g_wrapper->g; - int result = marpa_g_rule_is_sequence (g, rule_id); - if (result < -1) - { - croak ("Problem in g->rule_is_sequence(%d): %s", rule_id, - xs_g_error (g_wrapper)); - } - if (result < 0) - { - croak ("Invalid rule %d", rule_id); - } - if (result) - XSRETURN_YES; - XSRETURN_NO; -} - -void -rule_is_keep_separation( g_wrapper, rule_id ) - G_Wrapper *g_wrapper; - Marpa_Rule_ID rule_id; -PPCODE: -{ - Marpa_Grammar g = g_wrapper->g; - int result = marpa_g_rule_is_keep_separation (g, rule_id); - if (result < 0) - { - croak ("Problem in g->rule_is_keep_separation(%d): %s", rule_id, - xs_g_error (g_wrapper)); - } - if (result) - XSRETURN_YES; - XSRETURN_NO; -} - -int -rule_count( g_wrapper ) - G_Wrapper *g_wrapper; -PPCODE: -{ - Marpa_Grammar g = g_wrapper->g; - int result = marpa_g_rule_count (g); - if (result < -1) - { - croak ("Problem in g->rule_count(): %s", xs_g_error (g_wrapper)); - } - if (result < 0) - { - XSRETURN_UNDEF; - } - XPUSHs (sv_2mortal (newSViv (result))); -} - -int -symbol_count( g_wrapper ) - G_Wrapper *g_wrapper; -PPCODE: -{ - Marpa_Grammar g = g_wrapper->g; - int count = marpa_g_symbol_count (g); - if (count < -1) - { - croak ("Problem in g->symbol_count(): %s", xs_g_error (g_wrapper)); - } - if (count < 0) - { - XSRETURN_UNDEF; - } - XPUSHs (sv_2mortal (newSViv (count))); -} - void error( g_wrapper ) G_Wrapper *g_wrapper; @@ -688,19 +451,6 @@ PPCODE: XPUSHs (sv_2mortal (newSViv (error_code))); } -void precompute( g_wrapper ) - G_Wrapper *g_wrapper; -PPCODE: -{ - const Marpa_Grammar g = g_wrapper->g; - int result = marpa_g_precompute (g); - if (result < 0) - { - XSRETURN_UNDEF; - } - XPUSHs (sv_2mortal (newSViv (result))); -} - MODULE = Marpa::R2 PACKAGE = Marpa::R2::Thin::R void @@ -2263,7 +2013,7 @@ _marpa_g_irl_rhs( g_wrapper, irl_id, ix ) PPCODE: { Marpa_Grammar g = g_wrapper->g; - int result = _marpa_g_irl_rh_symbol(g, irl_id, ix); + int result = _marpa_g_irl_rhs(g, irl_id, ix); if (result < -1) { croak ("Problem in g->_marpa_g_irl_rhs(%d, %d): %s", irl_id, ix, xs_g_error (g_wrapper)); } diff --git a/r2/xs/gp_generate.pl b/r2/xs/gp_generate.pl index 1e63ba07e..c96580b8c 100644 --- a/r2/xs/gp_generate.pl +++ b/r2/xs/gp_generate.pl @@ -122,16 +122,29 @@ sub gp_generate { $main::LIBMARPA_CLASS = 'Marpa_Grammar'; print {$out} 'MODULE = Marpa::R2 PACKAGE = Marpa::R2::Thin::G', "\n\n"; +say {$out} gp_generate(qw(has_cycle)); +say {$out} gp_generate(qw(is_precomputed)); +say {$out} gp_generate(qw(precompute)); +say {$out} gp_generate(qw(rule_count)); +say {$out} gp_generate(qw(rule_is_accessible Marpa_Rule_ID rule_id)); +say {$out} gp_generate(qw(rule_is_keep_separation Marpa_Rule_ID rule_id)); +say {$out} gp_generate(qw(rule_is_loop Marpa_Rule_ID rule_id)); +say {$out} gp_generate(qw(rule_is_nullable Marpa_Rule_ID rule_id)); +say {$out} gp_generate(qw(rule_is_nulling Marpa_Rule_ID rule_id)); +say {$out} gp_generate(qw(rule_is_productive Marpa_Rule_ID rule_id)); +say {$out} gp_generate(qw(rule_is_sequence Marpa_Rule_ID rule_id)); +say {$out} gp_generate(qw(rule_length Marpa_Rule_ID rule_id)); +say {$out} gp_generate(qw(rule_lhs Marpa_Rule_ID rule_id)); +say {$out} gp_generate(qw(rule_rhs Marpa_Rule_ID rule_id int ix)); say {$out} gp_generate(qw(start_symbol)); say {$out} gp_generate(qw(start_symbol_set Marpa_Symbol_ID id)); -say {$out} gp_generate(qw(is_precomputed)); -say {$out} gp_generate(qw(has_cycle)); -say {$out} gp_generate(qw(symbol_new)); +say {$out} gp_generate(qw(symbol_count)); say {$out} gp_generate(qw(symbol_is_accessible Marpa_Symbol_ID symbol_id )); say {$out} gp_generate(qw(symbol_is_counted Marpa_Symbol_ID symbol_id )); say {$out} gp_generate(qw(symbol_is_nullable Marpa_Symbol_ID symbol_id )); say {$out} gp_generate(qw(symbol_is_nulling Marpa_Symbol_ID symbol_id )); -say {$out} gp_generate(qw(symbol_is_terminal Marpa_Symbol_ID symbol_id)); say {$out} gp_generate(qw(symbol_is_productive Marpa_Symbol_ID symbol_id)); say {$out} gp_generate(qw(symbol_is_start Marpa_Symbol_ID symbol_id)); +say {$out} gp_generate(qw(symbol_is_terminal Marpa_Symbol_ID symbol_id)); say {$out} gp_generate(qw(symbol_is_terminal_set Marpa_Symbol_ID symbol_id int boolean)); +say {$out} gp_generate(qw(symbol_new));