Subversion Repositories tendra.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Automatically generated from the files:
 *      parser.sid
 * and
 *      parser.act
 * by:
 *      ./sid
 */

/* BEGINNING OF HEADER */


/*
                 Crown Copyright (c) 1997
    
    This TenDRA(r) Computer Program is subject to Copyright
    owned by the United Kingdom Secretary of State for Defence
    acting through the Defence Evaluation and Research Agency
    (DERA).  It is made available to Recipients with a
    royalty-free licence for its use, reproduction, transfer
    to other parties and amendment for any purpose not excluding
    product development provided that any such use et cetera
    shall be deemed to be acceptance of the following conditions:-
    
        (1) Its Recipients shall ensure that this Notice is
        reproduced upon any copies or amended versions of it;
    
        (2) Any amended version of it shall be clearly marked to
        show both the nature of and the organisation responsible
        for the relevant amendment or amendments;
    
        (3) Its onward transfer from a recipient to another
        party shall be deemed to be that party's acceptance of
        these conditions;
    
        (4) DERA gives no warranty or assurance as to its
        quality or suitability for any purpose and DERA accepts
        no liability whatsoever in relation to any use to which
        it may be put.
*/


#include "parser.h"
#include "action.h"
#include "basic.h"
#include "bitvec.h"
#include "dalloc.h"
#include "dstring.h"
#include "gen-errors.h"
#include "grammar.h"
#include "lexer.h"
#include "non-local.h"
#include "rule.h"
#include "scope.h"
#include "table.h"
#include "types.h"

/*--------------------------------------------------------------------------*/

#define CURRENT_TERMINAL lexer_get_terminal (sid_current_stream)
#define ADVANCE_LEXER lexer_next_token (sid_current_stream)
#define SAVE_LEXER(x) (lexer_save_terminal (sid_current_stream, (LexerTokenT) (x)))
#define RESTORE_LEXER (lexer_restore_terminal (sid_current_stream))
#define ALT_LIMIT (UINT_MAX - 1)

/*--------------------------------------------------------------------------*/

LexerStreamP            sid_current_stream;
GrammarP                sid_current_grammar;

/*--------------------------------------------------------------------------*/

static TableP           sid_current_table;
static EntryListP       sid_current_entry_list;
static ScopeStackT      sid_scope_stack;
static ScopeStackT      sid_global_scope;
static ScopeStackP      sid_current_scope;
static EntryP           sid_current_entry;
static RuleP            sid_enclosing_rule;
static union {
    BasicP              basic;
    ActionP             action;
    RuleP               rule;
} sid_current;
static BoolT            sid_redefining_entry;
static NStringT         sid_maximum_scope;
static TypeTupleT       sid_saved_type;
static TypeTupleT       sid_current_type;
static EntryP           sid_saved_pred_id;
static EntryP           sid_current_pred_id;
static EntryP           sid_unique_pred_id = NIL (EntryP);
static EntryP           sid_predicate_type = NIL (EntryP);
static AltP             sid_current_alt;
static ItemP            sid_current_item;
static unsigned         sid_alternative;
static BoolT            sid_internal_rule;
static EntryP           sid_external_rule;
static unsigned         sid_num_alternatives = 0;
static NonLocalEntryP   sid_non_local;
static BoolT            sid_propagating_error = FALSE;
static BoolT            sid_finished_terminals = FALSE;

/* BEGINNING OF FUNCTION DECLARATIONS */

static void ZR235(void);
static void ZR230(void);
static void ZR137(void);
static void ZR232(void);
static void ZR171(void);
static void ZR239(void);
static void ZR146(void);
static void ZR163(void);
static void ZR147(void);
static void ZR175(void);
static void ZR221(void);
static void ZR281(NStringT *);
static void ZR149(void);
static void ZR283(void);
static void ZR183(void);
static void ZR192(void);
static void ZR284(NStringT *);
static void ZR285(NStringT *);
static void ZR165(void);
static void ZR161(void);
extern void sid_parse_grammar(void);
static void ZR140(void);
static void ZR142(void);
static void ZR177(void);
static void ZR199(void);
static void ZR219(void);
static void ZR153(void);
static void ZR196(void);
static void ZR185(void);
static void ZR253(void);
static void ZR186(void);
static void ZR128(void);
static void ZR259(void);
static void ZR126(void);
static void ZR208(void);
static void ZR217(void);
static void ZR155(void);
static void ZR187(void);
static void ZR228(void);
static void ZR261(void);
static void ZR168(void);
static void ZR246(void);
static void ZR248(void);
static void ZR249(void);
static void ZR180(void);
static void ZR251(void);
static void ZR252(void);

/* BEGINNING OF STATIC VARIABLES */

static BoolT ZI0;

/* BEGINNING OF FUNCTION DEFINITIONS */

static void
ZR235(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
  ZL2_235:;
    {
        ZR232 ();
        {
            switch (CURRENT_TERMINAL) {
              case 15:
                {
                    ADVANCE_LEXER;
                    goto ZL2_235;
                }
                /*UNREACHED*/
              case 26:
                RESTORE_LEXER;
                goto ZL1;
              default:
                break;
            }
        }
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR230(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        {

    if (sid_current_entry) {
        sid_current_alt = alt_create ();
    }
        }
        ZR228 ();
        if ((CURRENT_TERMINAL) == 26) {
            RESTORE_LEXER;
            goto ZL1;
        }
        {

    if ((sid_current_entry) && (sid_current_alt)) {
        if (types_check_names (rule_result (sid_current.rule),
                               alt_names (sid_current_alt))) {
            TypeTupleT used;

            types_copy (&used, rule_result (sid_current.rule));
            item_compute_minimal_dataflow (alt_item_head (sid_current_alt),
                                           &used);
            types_destroy (&used);
            rule_set_handler (sid_current.rule, sid_current_alt);
        } else {
            (void) alt_deallocate (sid_current_alt);
            E_handler_result_mismatch (entry_key (sid_external_rule));
        }
    }
        }
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR137(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
  ZL2_137:;
    {
        ZR128 ();
        {
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {
                {

    (ZI0) = ((CURRENT_TERMINAL == LEXER_TOK_CLOSE_TUPLE) ||
                  (CURRENT_TERMINAL == LEXER_TOK_EOF) ||
                  (sid_propagating_error));
                }
                if (!ZI0)
                    goto ZL5;
                goto ZL3;
            }
            /*UNREACHED*/
          ZL5:;
            switch (CURRENT_TERMINAL) {
              case 23:
                {
                    ADVANCE_LEXER;
                    goto ZL2_137;
                }
                /*UNREACHED*/
              default:
                goto ZL4;
            }
            /*UNREACHED*/
          ZL4:;
            {
                {

    if (!sid_propagating_error) {
        E_expected_separator ();
    }
                }
                goto ZL2_137;
            }
            /*UNREACHED*/
          ZL3:;
        }
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR232(void)
{
    switch (CURRENT_TERMINAL) {
      case 17:
        {
            {

    if ((++ sid_num_alternatives) == ALT_LIMIT) {
        E_too_many_alternatives ();
        UNREACHED;
    }
    if (!sid_internal_rule) {
        sid_alternative ++;
    }
    if (sid_current_entry) {
        if (rule_has_empty_alt (sid_current.rule)) {
            E_multiple_empty_alts (entry_key (sid_external_rule));
        } else if (!types_equal_zero_tuple (rule_result (sid_current.rule))) {
            E_alt_result_mismatch (entry_key (sid_external_rule),
                                   sid_alternative);
        } else {
            rule_add_empty_alt (sid_current.rule);
        }
    }
            }
            ADVANCE_LEXER;
            ZR252 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 4: case 6: case 10: case 13: case 18:
      case 19: case 24:
        {
            {

    if ((++ sid_num_alternatives) == ALT_LIMIT) {
        E_too_many_alternatives ();
        UNREACHED;
    }
    if (!sid_internal_rule) {
        sid_alternative ++;
    }
    if (sid_current_entry) {
        sid_current_alt = alt_create ();
    }
            }
            ZR228 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {

    if ((sid_current_entry) && (sid_current_alt)) {
        if (types_check_names (rule_result (sid_current.rule),
                               alt_names (sid_current_alt))) {
            TypeTupleT used;

            types_copy (&used, rule_result (sid_current.rule));
            item_compute_minimal_dataflow (alt_item_head (sid_current_alt),
                                           &used);
            types_destroy (&used);
            rule_add_alt (sid_current.rule, sid_current_alt);
        } else {
            (void) alt_deallocate (sid_current_alt);
            E_alt_result_mismatch (entry_key (sid_external_rule),
                                   sid_alternative);
        }
    }
            }
        }
        break;
      case 26:
        return;
      default:
        goto ZL1;
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_alternative ();
    }
        }
        {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_ALT_SEP) &&
           (CURRENT_TERMINAL != LEXER_TOK_HANDLER_SEP) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_SCOPE) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
        }
        {

    sid_propagating_error = FALSE;
        }
    }
}

static void
ZR171(void)
{
    switch (CURRENT_TERMINAL) {
      case 4: case 18: case 19: case 24:
        {
            ZR168 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 26:
        return;
      default:
        break;
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR239(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        NStringT ZI151;

        switch (CURRENT_TERMINAL) {
          case 4:
            {

    nstring_assign (&ZI151, lexer_string_value (sid_current_stream));
            }
            break;
          default:
            goto ZL1;
        }
        ADVANCE_LEXER;
        {
            switch (CURRENT_TERMINAL) {
              case 5:
                {
                    ADVANCE_LEXER;
                    ZR281 (&ZI151);
                    if ((CURRENT_TERMINAL) == 26) {
                        RESTORE_LEXER;
                        goto ZL3;
                    }
                }
                break;
              case 9: case 12: case 21:
                {
                    {

    types_init (&sid_saved_type);
    types_init (&sid_current_type);
    sid_saved_pred_id   = NIL (EntryP);
    sid_current_pred_id = NIL (EntryP);
                    }
                    {

    sid_current_entry = scope_stack_add_rule (sid_current_scope,
                                              sid_current_table, &(ZI151),
                                              sid_enclosing_rule,
                                              &sid_redefining_entry);
    if (sid_current_entry) {
        sid_current.rule = entry_get_rule (sid_current_entry);
    } else {
        E_duplicate_rule ((&ZI151));
        nstring_destroy (&(ZI151));
    }
                    }
                    ZR248 ();
                    if ((CURRENT_TERMINAL) == 26) {
                        RESTORE_LEXER;
                        goto ZL3;
                    }
                }
                break;
              default:
                goto ZL3;
            }
            goto ZL2;
          ZL3:;
            {
                {

    if (!sid_propagating_error) {
        E_expected_other_defn ();
    }
                }
                {

    nstring_destroy (&(ZI151));
                }
                {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_SCOPE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
                }
            }
          ZL2:;
        }
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR146(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        switch (CURRENT_TERMINAL) {
          case 8:
            break;
          default:
            goto ZL1;
        }
        ADVANCE_LEXER;
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_arrow ();
    }
        }
    }
}

static void
ZR163(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        {

    types_init (&sid_current_type);
    sid_current_pred_id = NIL (EntryP);
        }
        ZR185 ();
        ZR171 ();
        if ((CURRENT_TERMINAL) == 26) {
            RESTORE_LEXER;
            goto ZL1;
        }
        {

    sid_propagating_error = FALSE;
        }
        ZR186 ();
        if ((CURRENT_TERMINAL) == 26) {
            RESTORE_LEXER;
            goto ZL1;
        }
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR147(void)
{
  ZL2_147:;
    switch (CURRENT_TERMINAL) {
      case 4:
        {
            ZR149 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            } else {
                goto ZL2_147;
            }
        }
        /*UNREACHED*/
      case 26:
        return;
      default:
        break;
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR175(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        {

    types_init (&sid_current_type);
    sid_current_pred_id = NIL (EntryP);
        }
        ZR185 ();
        ZR183 ();
        if ((CURRENT_TERMINAL) == 26) {
            RESTORE_LEXER;
            goto ZL1;
        }
        {

    sid_propagating_error = FALSE;
        }
        ZR186 ();
        if ((CURRENT_TERMINAL) == 26) {
            RESTORE_LEXER;
            goto ZL1;
        }
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR221(void)
{
    switch (CURRENT_TERMINAL) {
      case 13:
        {
            EntryP ZI194;
            RuleP ZI67;
            AltP ZI223;
            BoolT ZI224;
            ItemP ZI225;

            ADVANCE_LEXER;
            {

    (ZI194)      = sid_current_entry;
    (ZI67)       = sid_current.rule;
    (ZI223)        = sid_current_alt;
    (ZI224)   = sid_internal_rule;
    (ZI225)             = NIL (ItemP);
    sid_internal_rule = TRUE;
    if ((sid_current_entry) && (sid_current_alt)) {
        sid_current_entry = table_add_generated_rule (sid_current_table,
                                                      FALSE);
        sid_current.rule  = entry_get_rule (sid_current_entry);
        (ZI225)             = item_create (sid_current_entry);
        rule_defined (sid_current.rule);
        item_inlinable ((ZI225));
        types_copy (item_param ((ZI225)), rule_param ((ZI67)));
        types_append_copy (item_param ((ZI225)), alt_names ((ZI223)));
        types_copy (rule_param (sid_current.rule), item_param ((ZI225)));
        types_make_references (rule_param (sid_current.rule),
                               item_param ((ZI225)));
        alt_add_item ((ZI223), (ZI225));
    } else {
        sid_current_entry = NIL (EntryP);
    }
            }
            ZR219 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {

    if (((ZI194)) && ((ZI223))) {
        rule_compute_result_intersect (sid_current.rule);
        types_copy (item_result ((ZI225)), rule_result (sid_current.rule));
        types_add_new_names (alt_names ((ZI223)), item_result ((ZI225)),
                             sid_unique_pred_id);
    }
    sid_internal_rule = (ZI224);
    sid_current_alt   = (ZI223);
    sid_current.rule  = (ZI67);
    sid_current_entry = (ZI194);
            }
            ZR251 ();
            ZR252 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 4: case 6: case 10: case 18: case 19:
      case 24:
        {
            ZR208 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {

    sid_propagating_error = FALSE;
            }
        }
        break;
      case 26:
        return;
      default:
        goto ZL1;
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR281(NStringT *ZI151)
{
    switch (CURRENT_TERMINAL) {
      case 6:
        {
            ZR142 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {

    types_assign (&sid_saved_type, &sid_current_type);
    sid_saved_pred_id = sid_current_pred_id;
            }
            ZR146 ();
            ZR142 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {

    sid_current_entry = scope_stack_add_rule (sid_current_scope,
                                              sid_current_table, &(*ZI151),
                                              sid_enclosing_rule,
                                              &sid_redefining_entry);
    if (sid_current_entry) {
        sid_current.rule = entry_get_rule (sid_current_entry);
    } else {
        E_duplicate_rule ((ZI151));
        nstring_destroy (&(*ZI151));
    }
            }
            ZR248 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 4:
        {
            {
                {
                    NStringT ZI133;

                    switch (CURRENT_TERMINAL) {
                      case 4:
                        {

    nstring_assign (&ZI133, lexer_string_value (sid_current_stream));
                        }
                        break;
                      default:
                        goto ZL3;
                    }
                    ADVANCE_LEXER;
                    {

    sid_non_local = NIL (NonLocalEntryP);
    if ((sid_enclosing_rule == NIL (RuleP)) ||
        (sid_current_scope == &sid_global_scope)) {
        E_global_scope_non_local ((ZI151));
        nstring_destroy (&(*ZI151));
    } else {
        EntryP type = table_get_type (sid_current_table, (&ZI133));

        if (type == NIL (EntryP)) {
            E_unknown_type ((&ZI133));
            nstring_destroy (&(*ZI151));
        } else {
            EntryP name = scope_stack_add_non_local (sid_current_scope,
                                                     sid_current_table,
                                                     &(*ZI151), type,
                                                     sid_enclosing_rule);

            if (name) {
                NonLocalListP non_locals = rule_non_locals (sid_enclosing_rule);
                sid_non_local = non_local_list_add (non_locals, name, type);
            } else {
                E_duplicate_non_local ((ZI151));
                nstring_destroy (&(*ZI151));
            }
        }
    }
    nstring_destroy (&(ZI133));
                    }
                    {
                        switch (CURRENT_TERMINAL) {
                          case 12:
                            {
                                ADVANCE_LEXER;
                                {
                                    {
                                        switch (CURRENT_TERMINAL) {
                                          case 10:
                                            break;
                                          default:
                                            goto ZL7;
                                        }
                                        ADVANCE_LEXER;
                                    }
                                    goto ZL6;
                                  ZL7:;
                                    {
                                        {

    if (!sid_propagating_error) {
        E_expected_begin_action ();
    }
                                        }
                                    }
                                  ZL6:;
                                }
                                {
                                    {
                                        NStringT ZI49;

                                        switch (CURRENT_TERMINAL) {
                                          case 4:
                                            {

    nstring_assign (&ZI49, lexer_string_value (sid_current_stream));
                                            }
                                            break;
                                          default:
                                            goto ZL9;
                                        }
                                        ADVANCE_LEXER;
                                        {

    EntryP entry = scope_stack_get_action (&sid_scope_stack, sid_current_table,
                                           (&ZI49));

    if (entry == NIL (EntryP)) {
        E_unknown_action ((&ZI49));
    } else if (sid_non_local) {
        EntryP     type   = non_local_entry_get_type (sid_non_local);
        KeyP       name   = entry_key (non_local_entry_get_name (sid_non_local));
        ActionP    action = entry_get_action (entry);
        TypeTupleP param  = action_param (action);
        TypeTupleP result = action_result (action);
        TypeTupleT tuple;
        TypeTupleT ref_tuple;

        types_init (&tuple);
        types_init (&ref_tuple);
        types_add_type_entry (&tuple, type, FALSE);
        types_add_type_entry (&ref_tuple, type, TRUE);
        if ((!types_equal (param, &tuple)) &&
            (!types_equal (param, &ref_tuple)) &&
            (!types_equal_zero_tuple (param))) {
            E_initialiser_param_mismatch (name, &tuple, &ref_tuple, param);
        }
        if (!types_equal (result, &tuple)) {
            E_initialiser_result_mismatch (name, &tuple, result);
        }
        types_destroy (&ref_tuple);
        types_destroy (&tuple);
        non_local_entry_set_initialiser (sid_non_local, entry);
    }
    nstring_destroy (&(ZI49));
                                        }
                                        ZR246 ();
                                        ZR252 ();
                                        if ((CURRENT_TERMINAL) == 26) {
                                            RESTORE_LEXER;
                                            goto ZL9;
                                        }
                                    }
                                    goto ZL8;
                                  ZL9:;
                                    {
                                        {

    if (!sid_propagating_error) {
        E_expected_identifier ();
    }
                                        }
                                    }
                                  ZL8:;
                                }
                            }
                            break;
                          case 9:
                            {
                                ADVANCE_LEXER;
                            }
                            break;
                          default:
                            goto ZL5;
                        }
                        goto ZL4;
                      ZL5:;
                        {
                            {

    if (!sid_propagating_error) {
        E_expected_terminator_or_define ();
    }
                            }
                        }
                      ZL4:;
                    }
                }
                goto ZL2;
              ZL3:;
                {
                    {

    if (!sid_propagating_error) {
        E_expected_identifier ();
    }
                    }
                    {

    nstring_destroy (&(*ZI151));
                    }
                    {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_SCOPE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
                    }
                }
              ZL2:;
            }
        }
        break;
      case 26:
        return;
      default:
        goto ZL1;
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR149(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        NStringT ZI151;

        switch (CURRENT_TERMINAL) {
          case 4:
            {

    nstring_assign (&ZI151, lexer_string_value (sid_current_stream));
            }
            break;
          default:
            goto ZL1;
        }
        ADVANCE_LEXER;
        {

    if (table_add_type (sid_current_table, &(ZI151)) == NIL (EntryP)) {
        E_duplicate_type ((&ZI151));
        nstring_destroy (&(ZI151));
    }
        }
        ZR252 ();
        if ((CURRENT_TERMINAL) == 26) {
            RESTORE_LEXER;
            goto ZL1;
        }
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR283(void)
{
    switch (CURRENT_TERMINAL) {
      case 18:
        {
            {

    if (sid_current_pred_id) {
        E_multi_predicate_return ();
    } else if (sid_unique_pred_id == NIL (EntryP)) {
        sid_unique_pred_id = grammar_get_predicate_id (sid_current_grammar);
    }
    sid_current_pred_id = sid_unique_pred_id;
    types_add_name_entry (&sid_current_type, sid_current_pred_id);
            }
            ADVANCE_LEXER;
            {

    types_assign (&sid_saved_type, &sid_current_type);
    sid_saved_pred_id = sid_current_pred_id;
            }
            ZR249 ();
            ZR199 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 19:
        {
            {

    EntryP entry = table_add_generated_name (sid_current_table);

    types_add_name_entry (&sid_current_type, entry);
            }
            ADVANCE_LEXER;
            {

    types_assign (&sid_saved_type, &sid_current_type);
    sid_saved_pred_id = sid_current_pred_id;
            }
            ZR249 ();
            ZR199 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 10:
        {
            {

    types_assign (&sid_saved_type, &sid_current_type);
    sid_saved_pred_id = sid_current_pred_id;
            }
            ADVANCE_LEXER;
            ZR217 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 26:
        return;
      default:
        goto ZL1;
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR183(void)
{
    switch (CURRENT_TERMINAL) {
      case 4: case 24:
        {
            ZR180 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 26:
        return;
      default:
        break;
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR192(void)
{
    switch (CURRENT_TERMINAL) {
      case 21:
        {
            EntryP ZI194;
            RuleP ZI67;

            ADVANCE_LEXER;
            {

    (ZI194)       = sid_current_entry;
    (ZI67)        = sid_enclosing_rule;

    sid_enclosing_rule = sid_current.rule;
            }
            ZR161 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {

    sid_current_entry  = (ZI194);
    sid_current.rule   = sid_enclosing_rule;
    sid_enclosing_rule = (ZI67);
    sid_alternative    = 0;
    sid_internal_rule  = FALSE;
    sid_external_rule  = sid_current_entry;
    nstring_init (&sid_maximum_scope);
            }
            {
                {
                    switch (CURRENT_TERMINAL) {
                      case 22:
                        break;
                      default:
                        goto ZL3;
                    }
                    ADVANCE_LEXER;
                }
                goto ZL2;
              ZL3:;
                {
                    {

    if (!sid_propagating_error) {
        E_expected_end_scope ();
    }
                    }
                }
              ZL2:;
            }
        }
        break;
      case 26:
        return;
      default:
        break;
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR284(NStringT *ZI151)
{
    switch (CURRENT_TERMINAL) {
      case 12:
        {
            {

    NStringT scope;
    EntryP   non_local_entry = scope_stack_get_non_local (&sid_scope_stack,
                                                          sid_current_table,
                                                          (ZI151), &scope);
    EntryP   name_entry      = table_get_entry (sid_current_table, (ZI151));

    if (name_entry) {
        if ((sid_current_entry) && (sid_current_alt)) {
            if ((!types_contains (alt_names (sid_current_alt), name_entry)) &&
                (!types_contains (rule_param (sid_current.rule),
                                  name_entry))) {
                name_entry = NIL (EntryP);
            }
        } else {
            name_entry = NIL (EntryP);
        }
    }
    if (name_entry) {
        types_add_name_and_type (&sid_current_type, name_entry, NIL (EntryP),
                                 FALSE);
        if (non_local_entry) {
            nstring_destroy (&scope);
        }
        nstring_destroy (&(*ZI151));
    } else if (non_local_entry) {
        types_add_name_and_type (&sid_current_type, non_local_entry,
                                 NIL (EntryP), FALSE);
        if (nstring_length (&scope) > nstring_length (&sid_maximum_scope)) {
            nstring_destroy (&sid_maximum_scope);
            nstring_assign (&sid_maximum_scope, &scope);
        } else {
            nstring_destroy (&scope);
        }
        nstring_destroy (&(*ZI151));
    } else {
        types_add_name (&sid_current_type, sid_current_table, &(*ZI151), FALSE);
    }
            }
            {

    types_assign (&sid_saved_type, &sid_current_type);
    sid_saved_pred_id = sid_current_pred_id;
            }
            ADVANCE_LEXER;
            ZR199 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 6: case 9:
        {
            {

    types_assign (&sid_saved_type, &sid_current_type);
    sid_saved_pred_id = sid_current_pred_id;
            }
            ZR285 (ZI151);
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 26:
        return;
      default:
        goto ZL1;
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR285(NStringT *ZI151)
{
    switch (CURRENT_TERMINAL) {
      case 6:
        {
            ZR175 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {

    TypeTupleP param  = NIL (TypeTupleP);
    TypeTupleP result = NIL (TypeTupleP);
    EntryP     entry  = NIL (EntryP);
    RuleP      rule;
    BasicP     basic;

    if ((sid_current_entry) && (sid_current_alt)) {
        entry = scope_stack_get_rule (&sid_scope_stack, sid_current_table,
                                      (ZI151));
        if (entry) {
            sid_current_item = item_create (entry);
            rule             = entry_get_rule (entry);
            param            = rule_param (rule);
            result           = rule_result (rule);
        } else {
            entry = table_get_basic (sid_current_table, (ZI151));
            if (entry) {
                sid_current_item = item_create (entry);
                basic            = entry_get_basic (entry);
                param            = NIL (TypeTupleP);
                result           = basic_result (basic);
                if (basic_get_ignored (basic)) {
                    E_ignored_basic_call ((ZI151));
                }
            } else {
                E_unknown_rule_or_basic ((ZI151));
                sid_current_item = NIL (ItemP);
            }
        }
    } else {
        sid_current_item = NIL (ItemP);
    }
    nstring_destroy (&(*ZI151));
    if (sid_current_item) {
        BoolT errored = FALSE;
        KeyP  key     = entry_key (entry);

        if (types_resolve (&sid_current_type, rule_param (sid_current.rule),
                           alt_names (sid_current_alt), E_undefined_name,
                           entry_key (sid_external_rule), sid_alternative)) {
            if (param) {
                if (types_equal (&sid_current_type, param)) {
                    item_add_param (sid_current_item, &sid_current_type);
                } else {
                    E_rule_param_call_mismatch (key, param, &sid_current_type);
                    types_destroy (&sid_current_type);
                    errored = TRUE;
                }
            } else {
                if (!types_equal_zero_tuple (&sid_current_type)) {
                    E_basic_param_call_mismatch (key, &sid_current_type);
                    types_destroy (&sid_current_type);
                    errored = TRUE;
                }
            }
        } else {
            types_destroy (&sid_current_type);
            errored = TRUE;
        }
        if (types_disjoint_names (&sid_saved_type)) {
            if (types_check_undefined (&sid_saved_type,
                                       rule_param (sid_current.rule),
                                       alt_names (sid_current_alt),
                                       E_redefined_name,
                                       entry_key (sid_external_rule),
                                       sid_alternative)) {
                if (types_fillin_types (&sid_saved_type, result)) {
                    types_add_new_names (alt_names (sid_current_alt),
                                         &sid_saved_type, sid_unique_pred_id);
                    if (sid_saved_pred_id) {
                        E_predicate ();
                    }
                    item_add_result (sid_current_item, &sid_saved_type);
                } else {
                    if (param) {
                        E_rule_result_call_mismatch (key, result,
                                                     &sid_saved_type);
                    } else {
                        E_basic_result_call_mismatch (key, result,
                                                      &sid_saved_type);
                    }
                    types_destroy (&sid_saved_type);
                    errored = TRUE;
                }
            } else {
                types_destroy (&sid_saved_type);
                errored = TRUE;
            }
        } else {
            if (param) {
                E_rule_result_call_clash (key, &sid_saved_type);
            } else {
                E_basic_result_call_clash (key, &sid_saved_type);
            }
            types_destroy (&sid_saved_type);
            errored = TRUE;
        }
        if (errored) {
            (void) item_deallocate (sid_current_item);
            sid_current_item = NIL (ItemP);
            (void) alt_deallocate (sid_current_alt);
            sid_current_alt  = NIL (AltP);
        } else {
            alt_add_item (sid_current_alt, sid_current_item);
        }
    } else {
        if (sid_current_alt) {
            (void) alt_deallocate (sid_current_alt);
            sid_current_alt = NIL (AltP);
        }
        types_destroy (&sid_saved_type);
        types_destroy (&sid_current_type);
    }
            }
            ZR252 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 9:
        {
            {

    types_init (&sid_current_type);
    sid_current_pred_id = NIL (EntryP);
            }
            {

    TypeTupleP param  = NIL (TypeTupleP);
    TypeTupleP result = NIL (TypeTupleP);
    EntryP     entry  = NIL (EntryP);
    RuleP      rule;
    BasicP     basic;

    if ((sid_current_entry) && (sid_current_alt)) {
        entry = scope_stack_get_rule (&sid_scope_stack, sid_current_table,
                                      (ZI151));
        if (entry) {
            sid_current_item = item_create (entry);
            rule             = entry_get_rule (entry);
            param            = rule_param (rule);
            result           = rule_result (rule);
        } else {
            entry = table_get_basic (sid_current_table, (ZI151));
            if (entry) {
                sid_current_item = item_create (entry);
                basic            = entry_get_basic (entry);
                param            = NIL (TypeTupleP);
                result           = basic_result (basic);
                if (basic_get_ignored (basic)) {
                    E_ignored_basic_call ((ZI151));
                }
            } else {
                E_unknown_rule_or_basic ((ZI151));
                sid_current_item = NIL (ItemP);
            }
        }
    } else {
        sid_current_item = NIL (ItemP);
    }
    nstring_destroy (&(*ZI151));
    if (sid_current_item) {
        BoolT errored = FALSE;
        KeyP  key     = entry_key (entry);

        if (types_resolve (&sid_current_type, rule_param (sid_current.rule),
                           alt_names (sid_current_alt), E_undefined_name,
                           entry_key (sid_external_rule), sid_alternative)) {
            if (param) {
                if (types_equal (&sid_current_type, param)) {
                    item_add_param (sid_current_item, &sid_current_type);
                } else {
                    E_rule_param_call_mismatch (key, param, &sid_current_type);
                    types_destroy (&sid_current_type);
                    errored = TRUE;
                }
            } else {
                if (!types_equal_zero_tuple (&sid_current_type)) {
                    E_basic_param_call_mismatch (key, &sid_current_type);
                    types_destroy (&sid_current_type);
                    errored = TRUE;
                }
            }
        } else {
            types_destroy (&sid_current_type);
            errored = TRUE;
        }
        if (types_disjoint_names (&sid_saved_type)) {
            if (types_check_undefined (&sid_saved_type,
                                       rule_param (sid_current.rule),
                                       alt_names (sid_current_alt),
                                       E_redefined_name,
                                       entry_key (sid_external_rule),
                                       sid_alternative)) {
                if (types_fillin_types (&sid_saved_type, result)) {
                    types_add_new_names (alt_names (sid_current_alt),
                                         &sid_saved_type, sid_unique_pred_id);
                    if (sid_saved_pred_id) {
                        E_predicate ();
                    }
                    item_add_result (sid_current_item, &sid_saved_type);
                } else {
                    if (param) {
                        E_rule_result_call_mismatch (key, result,
                                                     &sid_saved_type);
                    } else {
                        E_basic_result_call_mismatch (key, result,
                                                      &sid_saved_type);
                    }
                    types_destroy (&sid_saved_type);
                    errored = TRUE;
                }
            } else {
                types_destroy (&sid_saved_type);
                errored = TRUE;
            }
        } else {
            if (param) {
                E_rule_result_call_clash (key, &sid_saved_type);
            } else {
                E_basic_result_call_clash (key, &sid_saved_type);
            }
            types_destroy (&sid_saved_type);
            errored = TRUE;
        }
        if (errored) {
            (void) item_deallocate (sid_current_item);
            sid_current_item = NIL (ItemP);
            (void) alt_deallocate (sid_current_alt);
            sid_current_alt  = NIL (AltP);
        } else {
            alt_add_item (sid_current_alt, sid_current_item);
        }
    } else {
        if (sid_current_alt) {
            (void) alt_deallocate (sid_current_alt);
            sid_current_alt = NIL (AltP);
        }
        types_destroy (&sid_saved_type);
        types_destroy (&sid_current_type);
    }
            }
            ADVANCE_LEXER;
        }
        break;
      case 26:
        return;
      default:
        goto ZL1;
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR165(void)
{
    switch (CURRENT_TERMINAL) {
      case 4:
        {
            NStringT ZI151;

            {

    nstring_assign (&ZI151, lexer_string_value (sid_current_stream));
            }
            ADVANCE_LEXER;
            {

    NStringT scope;
    EntryP   non_local_entry = scope_stack_get_non_local (&sid_scope_stack,
                                                          sid_current_table,
                                                          (&ZI151), &scope);
    EntryP   name_entry      = table_get_entry (sid_current_table, (&ZI151));

    if (name_entry) {
        if ((sid_current_entry) && (sid_current_alt)) {
            if ((!types_contains (alt_names (sid_current_alt), name_entry)) &&
                (!types_contains (rule_param (sid_current.rule),
                                  name_entry))) {
                name_entry = NIL (EntryP);
            }
        } else {
            name_entry = NIL (EntryP);
        }
    }
    if (name_entry) {
        types_add_name_and_type (&sid_current_type, name_entry, NIL (EntryP),
                                 FALSE);
        if (non_local_entry) {
            nstring_destroy (&scope);
        }
        nstring_destroy (&(ZI151));
    } else if (non_local_entry) {
        types_add_name_and_type (&sid_current_type, non_local_entry,
                                 NIL (EntryP), FALSE);
        if (nstring_length (&scope) > nstring_length (&sid_maximum_scope)) {
            nstring_destroy (&sid_maximum_scope);
            nstring_assign (&sid_maximum_scope, &scope);
        } else {
            nstring_destroy (&scope);
        }
        nstring_destroy (&(ZI151));
    } else {
        types_add_name (&sid_current_type, sid_current_table, &(ZI151), FALSE);
    }
            }
        }
        break;
      case 19:
        {
            ADVANCE_LEXER;
            {

    EntryP entry = table_add_generated_name (sid_current_table);

    types_add_name_entry (&sid_current_type, entry);
            }
        }
        break;
      case 18:
        {
            ADVANCE_LEXER;
            {

    if (sid_current_pred_id) {
        E_multi_predicate_return ();
    } else if (sid_unique_pred_id == NIL (EntryP)) {
        sid_unique_pred_id = grammar_get_predicate_id (sid_current_grammar);
    }
    sid_current_pred_id = sid_unique_pred_id;
    types_add_name_entry (&sid_current_type, sid_current_pred_id);
            }
        }
        break;
      case 24:
        {
            ADVANCE_LEXER;
            {
                {
                    NStringT ZI151;

                    switch (CURRENT_TERMINAL) {
                      case 4:
                        {

    nstring_assign (&ZI151, lexer_string_value (sid_current_stream));
                        }
                        break;
                      default:
                        goto ZL3;
                    }
                    ADVANCE_LEXER;
                    {

    NStringT scope;
    EntryP   non_local_entry = scope_stack_get_non_local (&sid_scope_stack,
                                                          sid_current_table,
                                                          (&ZI151), &scope);
    EntryP   name_entry      = table_get_entry (sid_current_table, (&ZI151));

    if (name_entry) {
        if ((sid_current_entry) && (sid_current_alt)) {
            if ((!types_contains (alt_names (sid_current_alt), name_entry)) &&
                (!types_contains (rule_param (sid_current.rule),
                                  name_entry))) {
                name_entry = NIL (EntryP);
            }
        } else {
            name_entry = NIL (EntryP);
        }
    }
    if (name_entry) {
        types_add_name_and_type_var (&sid_current_type, name_entry,
                                     NIL (EntryP));
        if (non_local_entry) {
            nstring_destroy (&scope);
        }
        nstring_destroy (&(ZI151));
    } else if (non_local_entry) {
        types_add_name_and_type_var (&sid_current_type, non_local_entry,
                                     NIL (EntryP));
        if (nstring_length (&scope) > nstring_length (&sid_maximum_scope)) {
            nstring_destroy (&sid_maximum_scope);
            nstring_assign (&sid_maximum_scope, &scope);
        } else {
            nstring_destroy (&scope);
        }
        nstring_destroy (&(ZI151));
    } else {
        E_undefined_assignment ((&ZI151));
        types_add_name (&sid_current_type, sid_current_table, &(ZI151), FALSE);
    }
                    }
                }
                goto ZL2;
              ZL3:;
                {
                    {

    if (!sid_propagating_error) {
        E_expected_identifier ();
    }
                    }
                }
              ZL2:;
            }
        }
        break;
      case 26:
        return;
      default:
        goto ZL1;
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_lhs_name ();
    }
        }
        {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
        }
    }
}

static void
ZR161(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
  ZL2_161:;
    {
        ZR253 ();
        if ((CURRENT_TERMINAL) == 26) {
            RESTORE_LEXER;
            goto ZL1;
        }
        {

    sid_propagating_error = FALSE;
        }
        {
            {
                {

    (ZI0) = ((CURRENT_TERMINAL == LEXER_TOK_EOF) ||
                  (CURRENT_TERMINAL == LEXER_TOK_END_SCOPE) ||
                  (CURRENT_TERMINAL == LEXER_TOK_BLT_ENTRY));
                }
                if (!ZI0)
                    goto ZL4;
                goto ZL3;
            }
            /*UNREACHED*/
          ZL4:;
            switch (CURRENT_TERMINAL) {
              case 4: case 10: case 20:
                {
                    goto ZL2_161;
                }
                /*UNREACHED*/
              default:
                goto ZL1;
            }
          ZL3:;
        }
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_production_defn ();
    }
        }
        {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_SCOPE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
        }
        {

    sid_propagating_error = FALSE;
        }
        {
            {
                {

    (ZI0) = ((CURRENT_TERMINAL == LEXER_TOK_EOF) ||
                  (CURRENT_TERMINAL == LEXER_TOK_END_SCOPE) ||
                  (CURRENT_TERMINAL == LEXER_TOK_BLT_ENTRY));
                }
                if (!ZI0)
                    goto ZL7;
            }
            goto ZL6;
          ZL7:;
            {
                goto ZL2_161;
            }
            /*UNREACHED*/
          ZL6:;
        }
    }
}

void
sid_parse_grammar(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        {

sid_current_table      = grammar_table (sid_current_grammar);
sid_current_entry_list = grammar_entry_list (sid_current_grammar);
scope_stack_init (&sid_scope_stack);
scope_stack_init (&sid_global_scope);
        }
        {
            {
                switch (CURRENT_TERMINAL) {
                  case 0:
                    break;
                  default:
                    goto ZL3;
                }
                ADVANCE_LEXER;
            }
            goto ZL2;
          ZL3:;
            {
                {

    if (!sid_propagating_error) {
        E_expected_blt_types ();
    }
                }
            }
          ZL2:;
        }
        ZR147 ();
        {
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {
                switch (CURRENT_TERMINAL) {
                  case 1:
                    break;
                  default:
                    goto ZL5;
                }
                ADVANCE_LEXER;
            }
            goto ZL4;
          ZL5:;
            {
                {

    if (!sid_propagating_error) {
        E_expected_blt_terminals ();
    }
                }
            }
          ZL4:;
        }
        ZR153 ();
        if ((CURRENT_TERMINAL) == 26) {
            RESTORE_LEXER;
            goto ZL1;
        }
        {

    unsigned max_terminal = grammar_max_terminal (sid_current_grammar);

    bitvec_set_size (max_terminal);
    sid_finished_terminals = TRUE;
        }
        {
            {
                switch (CURRENT_TERMINAL) {
                  case 2:
                    break;
                  default:
                    goto ZL7;
                }
                ADVANCE_LEXER;
            }
            goto ZL6;
          ZL7:;
            {
                {

    if (!sid_propagating_error) {
        E_expected_blt_productions ();
    }
                }
            }
          ZL6:;
        }
        ZR161 ();
        {
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {
                switch (CURRENT_TERMINAL) {
                  case 3:
                    break;
                  default:
                    goto ZL9;
                }
                ADVANCE_LEXER;
            }
            goto ZL8;
          ZL9:;
            {
                {

    if (!sid_propagating_error) {
        E_expected_blt_entry ();
    }
                }
            }
          ZL8:;
        }
        ZR259 ();
        ZR252 ();
        {
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {
                switch (CURRENT_TERMINAL) {
                  case 25:
                    break;
                  default:
                    goto ZL11;
                }
                ADVANCE_LEXER;
            }
            goto ZL10;
          ZL11:;
            {
                {

    if (!sid_propagating_error) {
        E_expected_eof ();
    }
                }
            }
          ZL10:;
        }
    }
    return;
  ZL1:;
    {
        {

    UNREACHED;
        }
    }
}

static void
ZR140(void)
{
    switch (CURRENT_TERMINAL) {
      case 4: case 5:
        {
            ZR137 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 26:
        return;
      default:
        break;
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR142(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        {

    types_init (&sid_current_type);
    sid_current_pred_id = NIL (EntryP);
        }
        ZR185 ();
        ZR140 ();
        if ((CURRENT_TERMINAL) == 26) {
            RESTORE_LEXER;
            goto ZL1;
        }
        {

    sid_propagating_error = FALSE;
        }
        ZR186 ();
        if ((CURRENT_TERMINAL) == 26) {
            RESTORE_LEXER;
            goto ZL1;
        }
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR177(void)
{
    switch (CURRENT_TERMINAL) {
      case 4:
        {
            NStringT ZI151;

            {

    nstring_assign (&ZI151, lexer_string_value (sid_current_stream));
            }
            ADVANCE_LEXER;
            {

    NStringT scope;
    EntryP   non_local_entry = scope_stack_get_non_local (&sid_scope_stack,
                                                          sid_current_table,
                                                          (&ZI151), &scope);
    EntryP   name_entry      = table_get_entry (sid_current_table, (&ZI151));

    if (name_entry) {
        if ((sid_current_entry) && (sid_current_alt)) {
            if ((!types_contains (alt_names (sid_current_alt), name_entry)) &&
                (!types_contains (rule_param (sid_current.rule),
                                  name_entry))) {
                name_entry = NIL (EntryP);
            }
        } else {
            name_entry = NIL (EntryP);
        }
    }
    if (name_entry) {
        types_add_name_and_type (&sid_current_type, name_entry, NIL (EntryP),
                                 FALSE);
        if (non_local_entry) {
            nstring_destroy (&scope);
        }
        nstring_destroy (&(ZI151));
    } else if (non_local_entry) {
        types_add_name_and_type (&sid_current_type, non_local_entry,
                                 NIL (EntryP), FALSE);
        if (nstring_length (&scope) > nstring_length (&sid_maximum_scope)) {
            nstring_destroy (&sid_maximum_scope);
            nstring_assign (&sid_maximum_scope, &scope);
        } else {
            nstring_destroy (&scope);
        }
        nstring_destroy (&(ZI151));
    } else {
        types_add_name (&sid_current_type, sid_current_table, &(ZI151), FALSE);
    }
            }
        }
        break;
      case 24:
        {
            ADVANCE_LEXER;
            {
                {
                    NStringT ZI151;

                    switch (CURRENT_TERMINAL) {
                      case 4:
                        {

    nstring_assign (&ZI151, lexer_string_value (sid_current_stream));
                        }
                        break;
                      default:
                        goto ZL3;
                    }
                    ADVANCE_LEXER;
                    {

    NStringT scope;
    EntryP   non_local_entry = scope_stack_get_non_local (&sid_scope_stack,
                                                          sid_current_table,
                                                          (&ZI151), &scope);
    EntryP   name_entry      = table_get_entry (sid_current_table, (&ZI151));

    if (name_entry) {
        if ((sid_current_entry) && (sid_current_alt)) {
            if ((!types_contains (alt_names (sid_current_alt), name_entry)) &&
                (!types_contains (rule_param (sid_current.rule),
                                  name_entry))) {
                name_entry = NIL (EntryP);
            }
        } else {
            name_entry = NIL (EntryP);
        }
    }
    if (name_entry) {
        types_add_name_and_type (&sid_current_type, name_entry, NIL (EntryP),
                                 TRUE);
        if (non_local_entry) {
            nstring_destroy (&scope);
        }
        nstring_destroy (&(ZI151));
    } else if (non_local_entry) {
        types_add_name_and_type (&sid_current_type, non_local_entry,
                                 NIL (EntryP), TRUE);
        if (nstring_length (&scope) > nstring_length (&sid_maximum_scope)) {
            nstring_destroy (&sid_maximum_scope);
            nstring_assign (&sid_maximum_scope, &scope);
        } else {
            nstring_destroy (&scope);
        }
        nstring_destroy (&(ZI151));
    } else {
        types_add_name (&sid_current_type, sid_current_table, &(ZI151), TRUE);
    }
                    }
                }
                goto ZL2;
              ZL3:;
                {
                    {

    if (!sid_propagating_error) {
        E_expected_identifier ();
    }
                    }
                    {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
                    }
                }
              ZL2:;
            }
        }
        break;
      case 26:
        return;
      default:
        goto ZL1;
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_rhs_name ();
    }
        }
        {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
        }
    }
}

static void
ZR199(void)
{
    switch (CURRENT_TERMINAL) {
      case 10:
        {
            ADVANCE_LEXER;
            ZR217 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 4:
        {
            NStringT ZI151;

            {

    nstring_assign (&ZI151, lexer_string_value (sid_current_stream));
            }
            ADVANCE_LEXER;
            {
                switch (CURRENT_TERMINAL) {
                  case 6:
                    {
                        ZR175 ();
                        if ((CURRENT_TERMINAL) == 26) {
                            RESTORE_LEXER;
                            goto ZL3;
                        }
                        {

    TypeTupleP param  = NIL (TypeTupleP);
    TypeTupleP result = NIL (TypeTupleP);
    EntryP     entry  = NIL (EntryP);
    RuleP      rule;
    BasicP     basic;

    if ((sid_current_entry) && (sid_current_alt)) {
        entry = scope_stack_get_rule (&sid_scope_stack, sid_current_table,
                                      (&ZI151));
        if (entry) {
            sid_current_item = item_create (entry);
            rule             = entry_get_rule (entry);
            param            = rule_param (rule);
            result           = rule_result (rule);
        } else {
            entry = table_get_basic (sid_current_table, (&ZI151));
            if (entry) {
                sid_current_item = item_create (entry);
                basic            = entry_get_basic (entry);
                param            = NIL (TypeTupleP);
                result           = basic_result (basic);
                if (basic_get_ignored (basic)) {
                    E_ignored_basic_call ((&ZI151));
                }
            } else {
                E_unknown_rule_or_basic ((&ZI151));
                sid_current_item = NIL (ItemP);
            }
        }
    } else {
        sid_current_item = NIL (ItemP);
    }
    nstring_destroy (&(ZI151));
    if (sid_current_item) {
        BoolT errored = FALSE;
        KeyP  key     = entry_key (entry);

        if (types_resolve (&sid_current_type, rule_param (sid_current.rule),
                           alt_names (sid_current_alt), E_undefined_name,
                           entry_key (sid_external_rule), sid_alternative)) {
            if (param) {
                if (types_equal (&sid_current_type, param)) {
                    item_add_param (sid_current_item, &sid_current_type);
                } else {
                    E_rule_param_call_mismatch (key, param, &sid_current_type);
                    types_destroy (&sid_current_type);
                    errored = TRUE;
                }
            } else {
                if (!types_equal_zero_tuple (&sid_current_type)) {
                    E_basic_param_call_mismatch (key, &sid_current_type);
                    types_destroy (&sid_current_type);
                    errored = TRUE;
                }
            }
        } else {
            types_destroy (&sid_current_type);
            errored = TRUE;
        }
        if (types_disjoint_names (&sid_saved_type)) {
            if (types_check_undefined (&sid_saved_type,
                                       rule_param (sid_current.rule),
                                       alt_names (sid_current_alt),
                                       E_redefined_name,
                                       entry_key (sid_external_rule),
                                       sid_alternative)) {
                if (types_fillin_types (&sid_saved_type, result)) {
                    types_add_new_names (alt_names (sid_current_alt),
                                         &sid_saved_type, sid_unique_pred_id);
                    if (sid_saved_pred_id) {
                        E_predicate ();
                    }
                    item_add_result (sid_current_item, &sid_saved_type);
                } else {
                    if (param) {
                        E_rule_result_call_mismatch (key, result,
                                                     &sid_saved_type);
                    } else {
                        E_basic_result_call_mismatch (key, result,
                                                      &sid_saved_type);
                    }
                    types_destroy (&sid_saved_type);
                    errored = TRUE;
                }
            } else {
                types_destroy (&sid_saved_type);
                errored = TRUE;
            }
        } else {
            if (param) {
                E_rule_result_call_clash (key, &sid_saved_type);
            } else {
                E_basic_result_call_clash (key, &sid_saved_type);
            }
            types_destroy (&sid_saved_type);
            errored = TRUE;
        }
        if (errored) {
            (void) item_deallocate (sid_current_item);
            sid_current_item = NIL (ItemP);
            (void) alt_deallocate (sid_current_alt);
            sid_current_alt  = NIL (AltP);
        } else {
            alt_add_item (sid_current_alt, sid_current_item);
        }
    } else {
        if (sid_current_alt) {
            (void) alt_deallocate (sid_current_alt);
            sid_current_alt = NIL (AltP);
        }
        types_destroy (&sid_saved_type);
        types_destroy (&sid_current_type);
    }
                        }
                        ZR252 ();
                        if ((CURRENT_TERMINAL) == 26) {
                            RESTORE_LEXER;
                            goto ZL3;
                        }
                    }
                    break;
                  case 9:
                    {
                        {

    types_init (&sid_current_type);
    sid_current_pred_id = NIL (EntryP);
                        }
                        {

    EntryP     name_entry = table_get_entry (sid_current_table, (&ZI151));
    EntryP     entry      = NIL (EntryP);
    TypeTupleP param      = NIL (TypeTupleP);
    TypeTupleP result     = NIL (TypeTupleP);
    RuleP      rule;
    BasicP     basic;

    if ((sid_current_entry) && (sid_current_alt)) {
        if ((name_entry != NIL (EntryP)) &&
            (!types_contains (alt_names (sid_current_alt), name_entry)) &&
            (!types_contains (rule_param (sid_current.rule), name_entry))) {
            name_entry = NIL (EntryP);
        }
        entry = scope_stack_get_rule (&sid_scope_stack, sid_current_table,
                                      (&ZI151));
        if (entry) {
            sid_current_item = item_create (entry);
            rule             = entry_get_rule (entry);
            param            = rule_param (rule);
            result           = rule_result (rule);
        } else {
            entry = table_get_basic (sid_current_table, (&ZI151));
            if (entry) {
                sid_current_item = item_create (entry);
                basic            = entry_get_basic (entry);
                param            = NIL (TypeTupleP);
                result           = basic_result (basic);
                if ((name_entry == NIL (EntryP)) &&
                    basic_get_ignored (basic)) {
                    E_ignored_basic_call ((&ZI151));
                }
            }
        }
        if ((entry == NIL (EntryP)) && (name_entry == NIL (EntryP))) {
            NStringT scope;

            name_entry = scope_stack_get_non_local (&sid_scope_stack,
                                                    sid_current_table,
                                                    (&ZI151), &scope);
            if (name_entry) {
                if (nstring_length (&scope) >
                    nstring_length (&sid_maximum_scope)) {
                    nstring_destroy (&sid_maximum_scope);
                    nstring_assign (&sid_maximum_scope, &scope);
                } else {
                    nstring_destroy (&scope);
                }
            } else {
                E_unknown_rule_or_basic ((&ZI151));
            }
        } else if ((entry != NIL (EntryP)) && (name_entry != NIL (EntryP))) {
            E_ambiguous_call ((&ZI151));
            entry      = NIL (EntryP);
            name_entry = NIL (EntryP);
        }
    } else {
        name_entry = NIL (EntryP);
    }
    nstring_destroy (&(ZI151));
    if (entry) {
        BoolT errored = FALSE;
        KeyP  key     = entry_key (entry);

        if (types_resolve (&sid_current_type, rule_param (sid_current.rule),
                           alt_names (sid_current_alt), E_undefined_name,
                           entry_key (sid_external_rule), sid_alternative)) {
            if (param) {
                if (types_equal (&sid_current_type, param)) {
                    item_add_param (sid_current_item, &sid_current_type);
                } else {
                    E_rule_param_call_mismatch (key, param, &sid_current_type);
                    types_destroy (&sid_current_type);
                    errored = TRUE;
                }
            } else {
                if (!types_equal_zero_tuple (&sid_current_type)) {
                    E_basic_param_call_mismatch (key, &sid_current_type);
                    types_destroy (&sid_current_type);
                    errored = TRUE;
                }
            }
        } else {
            types_destroy (&sid_current_type);
            errored = TRUE;
        }
        if (types_disjoint_names (&sid_saved_type)) {
            if (types_check_undefined (&sid_saved_type,
                                       rule_param (sid_current.rule),
                                       alt_names (sid_current_alt),
                                       E_redefined_name,
                                       entry_key (sid_external_rule),
                                       sid_alternative)) {
                if (types_fillin_types (&sid_saved_type, result)) {
                    types_add_new_names (alt_names (sid_current_alt),
                                         &sid_saved_type, sid_unique_pred_id);
                    if (sid_saved_pred_id) {
                        E_predicate ();
                    }
                    item_add_result (sid_current_item, &sid_saved_type);
                } else {
                    if (param) {
                        E_rule_result_call_mismatch (key, result,
                                                     &sid_saved_type);
                    } else {
                        E_basic_result_call_mismatch (key, result,
                                                      &sid_saved_type);
                    }
                    types_destroy (&sid_saved_type);
                    errored = TRUE;
                }
            } else {
                types_destroy (&sid_saved_type);
                errored = TRUE;
            }
        } else {
            if (param) {
                E_rule_result_call_clash (key, &sid_saved_type);
            } else {
                E_basic_result_call_clash (key, &sid_saved_type);
            }
            types_destroy (&sid_saved_type);
            errored = TRUE;
        }
        if (errored) {
            (void) item_deallocate (sid_current_item);
            sid_current_item = NIL (ItemP);
            (void) alt_deallocate (sid_current_alt);
            sid_current_alt  = NIL (AltP);
        } else {
            alt_add_item (sid_current_alt, sid_current_item);
        }
    } else if (name_entry) {
        types_add_name_entry (&sid_current_type, name_entry);
        entry = table_add_rename (sid_current_table);
        if (types_resolve (&sid_current_type, rule_param (sid_current.rule),
                           alt_names (sid_current_alt), E_undefined_name,
                           entry_key (sid_external_rule), sid_alternative)) {
            if (types_contains_references (&sid_current_type)) {
                E_identity_param_has_refs (&sid_current_type,
                                           entry_key (sid_external_rule),
                                           sid_alternative);
                types_destroy (&sid_current_type);
                sid_current_item = NIL (ItemP);
            } else {
                sid_current_item = item_create (entry);
                item_add_param (sid_current_item, &sid_current_type);
            }
        } else {
            types_destroy (&sid_current_type);
            sid_current_item = NIL (ItemP);
        }
        if (types_disjoint_names (&sid_saved_type)) {
            if (types_check_undefined (&sid_saved_type,
                                       rule_param (sid_current.rule),
                                       alt_names (sid_current_alt),
                                       E_redefined_name,
                                       entry_key (sid_external_rule),
                                       sid_alternative)) {
                if (sid_current_item) {
                    if (types_fillin_types (&sid_saved_type,
                                            item_param (sid_current_item))) {
                        types_add_new_names (alt_names (sid_current_alt),
                                             &sid_saved_type,
                                             sid_unique_pred_id);
                        if (sid_saved_pred_id) {
                            E_predicate ();
                        }
                        item_add_result (sid_current_item, &sid_saved_type);
                        alt_add_item (sid_current_alt, sid_current_item);
                    } else {
                        E_identity_mismatch (item_param (sid_current_item),
                                             &sid_saved_type);
                        types_destroy (&sid_saved_type);
                        (void) item_deallocate (sid_current_item);
                        sid_current_item = NIL (ItemP);
                    }
                }
            } else {
                types_destroy (&sid_saved_type);
                if (sid_current_item) {
                    (void) item_deallocate (sid_current_item);
                    sid_current_item = NIL (ItemP);
                }
            }
        } else {
            E_identity_result_clash (&sid_saved_type);
            types_destroy (&sid_saved_type);
            if (sid_current_item) {
                (void) item_deallocate (sid_current_item);
                sid_current_item = NIL (ItemP);
            }
        }
        if (sid_current_item == NIL (ItemP)) {
            (void) alt_deallocate (sid_current_alt);
            sid_current_alt = NIL (AltP);
        }
    } else {
        if (sid_current_alt) {
            (void) alt_deallocate (sid_current_alt);
            sid_current_alt = NIL (AltP);
        }
        types_destroy (&sid_saved_type);
        types_destroy (&sid_current_type);
    }
                        }
                        ADVANCE_LEXER;
                    }
                    break;
                  default:
                    goto ZL3;
                }
                goto ZL2;
              ZL3:;
                {
                    {

    if (!sid_propagating_error) {
        E_expected_tuple_or_term ();
    }
                    }
                    {

    nstring_destroy (&(ZI151));
                    }
                    {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_ALT_SEP) &&
           (CURRENT_TERMINAL != LEXER_TOK_HANDLER_SEP) &&
           (CURRENT_TERMINAL != LEXER_TOK_BEGIN_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_SCOPE) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
                    }
                }
              ZL2:;
            }
        }
        break;
      case 6:
        {
            ZR175 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {

    if ((sid_current_entry) && (sid_current_alt)) {
        EntryP entry = table_add_rename (sid_current_table);

        if (types_resolve (&sid_current_type, rule_param (sid_current.rule),
                           alt_names (sid_current_alt), E_undefined_name,
                           entry_key (sid_external_rule), sid_alternative)) {
            if (types_contains_references (&sid_current_type)) {
                E_identity_param_has_refs (&sid_current_type,
                                           entry_key (sid_external_rule),
                                           sid_alternative);
                types_destroy (&sid_current_type);
                sid_current_item = NIL (ItemP);
            } else {
                sid_current_item = item_create (entry);
                item_add_param (sid_current_item, &sid_current_type);
            }
        } else {
            types_destroy (&sid_current_type);
            sid_current_item = NIL (ItemP);
        }
        if (types_disjoint_names (&sid_saved_type)) {
            if (types_check_undefined (&sid_saved_type,
                                       rule_param (sid_current.rule),
                                       alt_names (sid_current_alt),
                                       E_redefined_name,
                                       entry_key (sid_external_rule),
                                       sid_alternative)) {
                if (sid_current_item) {
                    if (types_fillin_types (&sid_saved_type,
                                            item_param (sid_current_item))) {
                        types_add_new_names (alt_names (sid_current_alt),
                                             &sid_saved_type,
                                             sid_unique_pred_id);
                        if (sid_saved_pred_id) {
                            E_predicate ();
                        }
                        item_add_result (sid_current_item, &sid_saved_type);
                        alt_add_item (sid_current_alt, sid_current_item);
                    } else {
                        E_identity_mismatch (item_param (sid_current_item),
                                             &sid_saved_type);
                        types_destroy (&sid_saved_type);
                        (void) item_deallocate (sid_current_item);
                        sid_current_item = NIL (ItemP);
                    }
                }
            } else {
                types_destroy (&sid_saved_type);
                if (sid_current_item) {
                    (void) item_deallocate (sid_current_item);
                    sid_current_item = NIL (ItemP);
                }
            }
        } else {
            E_identity_result_clash (&sid_saved_type);
            types_destroy (&sid_saved_type);
            if (sid_current_item) {
                (void) item_deallocate (sid_current_item);
                sid_current_item = NIL (ItemP);
            }
        }
        if (sid_current_item == NIL (ItemP)) {
            (void) alt_deallocate (sid_current_alt);
            sid_current_alt = NIL (AltP);
        }
    } else {
        types_destroy (&sid_saved_type);
        types_destroy (&sid_current_type);
    }
            }
            ZR252 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 24:
        {
            {

    types_init (&sid_current_type);
    sid_current_pred_id = NIL (EntryP);
            }
            ADVANCE_LEXER;
            {
                {
                    NStringT ZI151;

                    switch (CURRENT_TERMINAL) {
                      case 4:
                        {

    nstring_assign (&ZI151, lexer_string_value (sid_current_stream));
                        }
                        break;
                      default:
                        goto ZL5;
                    }
                    ADVANCE_LEXER;
                    {

    NStringT scope;
    EntryP   non_local_entry = scope_stack_get_non_local (&sid_scope_stack,
                                                          sid_current_table,
                                                          (&ZI151), &scope);
    EntryP   name_entry      = table_get_entry (sid_current_table, (&ZI151));

    if (name_entry) {
        if ((sid_current_entry) && (sid_current_alt)) {
            if ((!types_contains (alt_names (sid_current_alt), name_entry)) &&
                (!types_contains (rule_param (sid_current.rule),
                                  name_entry))) {
                name_entry = NIL (EntryP);
            }
        } else {
            name_entry = NIL (EntryP);
        }
    }
    if (name_entry) {
        types_add_name_and_type (&sid_current_type, name_entry, NIL (EntryP),
                                 TRUE);
        if (non_local_entry) {
            nstring_destroy (&scope);
        }
        nstring_destroy (&(ZI151));
    } else if (non_local_entry) {
        types_add_name_and_type (&sid_current_type, non_local_entry,
                                 NIL (EntryP), TRUE);
        if (nstring_length (&scope) > nstring_length (&sid_maximum_scope)) {
            nstring_destroy (&sid_maximum_scope);
            nstring_assign (&sid_maximum_scope, &scope);
        } else {
            nstring_destroy (&scope);
        }
        nstring_destroy (&(ZI151));
    } else {
        types_add_name (&sid_current_type, sid_current_table, &(ZI151), TRUE);
    }
                    }
                    {

    if ((sid_current_entry) && (sid_current_alt)) {
        EntryP entry = table_add_rename (sid_current_table);

        if (types_resolve (&sid_current_type, rule_param (sid_current.rule),
                           alt_names (sid_current_alt), E_undefined_name,
                           entry_key (sid_external_rule), sid_alternative)) {
            if (types_contains_references (&sid_current_type)) {
                E_identity_param_has_refs (&sid_current_type,
                                           entry_key (sid_external_rule),
                                           sid_alternative);
                types_destroy (&sid_current_type);
                sid_current_item = NIL (ItemP);
            } else {
                sid_current_item = item_create (entry);
                item_add_param (sid_current_item, &sid_current_type);
            }
        } else {
            types_destroy (&sid_current_type);
            sid_current_item = NIL (ItemP);
        }
        if (types_disjoint_names (&sid_saved_type)) {
            if (types_check_undefined (&sid_saved_type,
                                       rule_param (sid_current.rule),
                                       alt_names (sid_current_alt),
                                       E_redefined_name,
                                       entry_key (sid_external_rule),
                                       sid_alternative)) {
                if (sid_current_item) {
                    if (types_fillin_types (&sid_saved_type,
                                            item_param (sid_current_item))) {
                        types_add_new_names (alt_names (sid_current_alt),
                                             &sid_saved_type,
                                             sid_unique_pred_id);
                        if (sid_saved_pred_id) {
                            E_predicate ();
                        }
                        item_add_result (sid_current_item, &sid_saved_type);
                        alt_add_item (sid_current_alt, sid_current_item);
                    } else {
                        E_identity_mismatch (item_param (sid_current_item),
                                             &sid_saved_type);
                        types_destroy (&sid_saved_type);
                        (void) item_deallocate (sid_current_item);
                        sid_current_item = NIL (ItemP);
                    }
                }
            } else {
                types_destroy (&sid_saved_type);
                if (sid_current_item) {
                    (void) item_deallocate (sid_current_item);
                    sid_current_item = NIL (ItemP);
                }
            }
        } else {
            E_identity_result_clash (&sid_saved_type);
            types_destroy (&sid_saved_type);
            if (sid_current_item) {
                (void) item_deallocate (sid_current_item);
                sid_current_item = NIL (ItemP);
            }
        }
        if (sid_current_item == NIL (ItemP)) {
            (void) alt_deallocate (sid_current_alt);
            sid_current_alt = NIL (AltP);
        }
    } else {
        types_destroy (&sid_saved_type);
        types_destroy (&sid_current_type);
    }
                    }
                    ZR252 ();
                    if ((CURRENT_TERMINAL) == 26) {
                        RESTORE_LEXER;
                        goto ZL5;
                    }
                }
                goto ZL4;
              ZL5:;
                {
                    {

    if (!sid_propagating_error) {
        E_expected_identifier ();
    }
                    }
                    {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_ALT_SEP) &&
           (CURRENT_TERMINAL != LEXER_TOK_HANDLER_SEP) &&
           (CURRENT_TERMINAL != LEXER_TOK_BEGIN_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_SCOPE) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
                    }
                }
              ZL4:;
            }
        }
        break;
      case 26:
        return;
      default:
        goto ZL1;
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_item_rhs ();
    }
        }
        {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_ALT_SEP) &&
           (CURRENT_TERMINAL != LEXER_TOK_HANDLER_SEP) &&
           (CURRENT_TERMINAL != LEXER_TOK_BEGIN_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_SCOPE) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
        }
    }
}

static void
ZR219(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        ZR235 ();
        {
            switch (CURRENT_TERMINAL) {
              case 16:
                {
                    ADVANCE_LEXER;
                    ZR230 ();
                    if ((CURRENT_TERMINAL) == 26) {
                        RESTORE_LEXER;
                        goto ZL1;
                    }
                }
                break;
              case 26:
                RESTORE_LEXER;
                goto ZL1;
              default:
                break;
            }
        }
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR153(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
  ZL2_153:;
    {
        ZR155 ();
        if ((CURRENT_TERMINAL) == 26) {
            RESTORE_LEXER;
            goto ZL1;
        }
        {

    sid_propagating_error = FALSE;
        }
        {
            switch (CURRENT_TERMINAL) {
              case 4: case 19:
                {
                    goto ZL2_153;
                }
                /*UNREACHED*/
              default:
                break;
            }
        }
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR196(void)
{
    switch (CURRENT_TERMINAL) {
      case 6:
        {
            ZR175 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {

    if (sid_current_item) {
        BoolT   errored = FALSE;
        EntryP  entry   = item_entry (sid_current_item);
        ActionP action  = entry_get_action (entry);

        if (types_resolve (&sid_current_type, rule_param (sid_current.rule),
                           alt_names (sid_current_alt), E_undefined_name,
                           entry_key (sid_external_rule), sid_alternative)) {
            if (types_equal (&sid_current_type, action_param (action))) {
                item_add_param (sid_current_item, &sid_current_type);
            } else {
                E_action_param_call_mismatch (entry_key (entry),
                                              action_param (action),
                                              &sid_current_type);
                types_destroy (&sid_current_type);
                errored = TRUE;
            }
        } else {
            types_destroy (&sid_current_type);
            errored = TRUE;
        }
        if (types_disjoint_names (&sid_saved_type)) {
            if (types_check_undefined (&sid_saved_type,
                                       rule_param (sid_current.rule),
                                       alt_names (sid_current_alt),
                                       E_redefined_name,
                                       entry_key (sid_external_rule),
                                       sid_alternative)) {
                if (types_fillin_types (&sid_saved_type,
                                        action_result (action))) {
                    types_add_new_names (alt_names (sid_current_alt),
                                         &sid_saved_type, sid_unique_pred_id);
                    if (sid_saved_pred_id) {
                        BoolT  reference;
                        EntryP type = types_find_name_type (&sid_saved_type,
                                                            sid_saved_pred_id,
                                                            &reference);

                        ASSERT ((type != NIL (EntryP)) && (!reference));
                        if (sid_predicate_type) {
                            if (type != sid_predicate_type) {
                                E_predicate_type (sid_predicate_type, type);
                            }
                        } else {
                            grammar_set_predicate_type (sid_current_grammar,
                                                        type);
                            sid_predicate_type = type;
                        }
                        item_to_predicate (sid_current_item);
                    }
                    item_add_result (sid_current_item, &sid_saved_type);
                } else {
                    E_action_result_call_mismatch (entry_key (entry),
                                                   action_result (action),
                                                   &sid_saved_type);
                    types_destroy (&sid_saved_type);
                    errored = TRUE;
                }
            } else {
                types_destroy (&sid_saved_type);
                errored = TRUE;
            }
        } else {
            E_action_result_call_clash (entry_key (entry), &sid_saved_type);
            types_destroy (&sid_saved_type);
            errored = TRUE;
        }
        if (errored) {
            (void) item_deallocate (sid_current_item);
            sid_current_item = NIL (ItemP);
            (void) alt_deallocate (sid_current_alt);
            sid_current_alt  = NIL (AltP);
        } else {
            alt_add_item (sid_current_alt, sid_current_item);
        }
    } else {
        types_destroy (&sid_saved_type);
        types_destroy (&sid_current_type);
    }
            }
            ZR252 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 9:
        {
            {

    types_init (&sid_current_type);
    sid_current_pred_id = NIL (EntryP);
            }
            {

    if (sid_current_item) {
        BoolT   errored = FALSE;
        EntryP  entry   = item_entry (sid_current_item);
        ActionP action  = entry_get_action (entry);

        if (types_resolve (&sid_current_type, rule_param (sid_current.rule),
                           alt_names (sid_current_alt), E_undefined_name,
                           entry_key (sid_external_rule), sid_alternative)) {
            if (types_equal (&sid_current_type, action_param (action))) {
                item_add_param (sid_current_item, &sid_current_type);
            } else {
                E_action_param_call_mismatch (entry_key (entry),
                                              action_param (action),
                                              &sid_current_type);
                types_destroy (&sid_current_type);
                errored = TRUE;
            }
        } else {
            types_destroy (&sid_current_type);
            errored = TRUE;
        }
        if (types_disjoint_names (&sid_saved_type)) {
            if (types_check_undefined (&sid_saved_type,
                                       rule_param (sid_current.rule),
                                       alt_names (sid_current_alt),
                                       E_redefined_name,
                                       entry_key (sid_external_rule),
                                       sid_alternative)) {
                if (types_fillin_types (&sid_saved_type,
                                        action_result (action))) {
                    types_add_new_names (alt_names (sid_current_alt),
                                         &sid_saved_type, sid_unique_pred_id);
                    if (sid_saved_pred_id) {
                        BoolT  reference;
                        EntryP type = types_find_name_type (&sid_saved_type,
                                                            sid_saved_pred_id,
                                                            &reference);

                        ASSERT ((type != NIL (EntryP)) && (!reference));
                        if (sid_predicate_type) {
                            if (type != sid_predicate_type) {
                                E_predicate_type (sid_predicate_type, type);
                            }
                        } else {
                            grammar_set_predicate_type (sid_current_grammar,
                                                        type);
                            sid_predicate_type = type;
                        }
                        item_to_predicate (sid_current_item);
                    }
                    item_add_result (sid_current_item, &sid_saved_type);
                } else {
                    E_action_result_call_mismatch (entry_key (entry),
                                                   action_result (action),
                                                   &sid_saved_type);
                    types_destroy (&sid_saved_type);
                    errored = TRUE;
                }
            } else {
                types_destroy (&sid_saved_type);
                errored = TRUE;
            }
        } else {
            E_action_result_call_clash (entry_key (entry), &sid_saved_type);
            types_destroy (&sid_saved_type);
            errored = TRUE;
        }
        if (errored) {
            (void) item_deallocate (sid_current_item);
            sid_current_item = NIL (ItemP);
            (void) alt_deallocate (sid_current_alt);
            sid_current_alt  = NIL (AltP);
        } else {
            alt_add_item (sid_current_alt, sid_current_item);
        }
    } else {
        types_destroy (&sid_saved_type);
        types_destroy (&sid_current_type);
    }
            }
            ADVANCE_LEXER;
        }
        break;
      case 26:
        return;
      default:
        goto ZL1;
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_tuple_or_term ();
    }
        }
        {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_ALT_SEP) &&
           (CURRENT_TERMINAL != LEXER_TOK_HANDLER_SEP) &&
           (CURRENT_TERMINAL != LEXER_TOK_BEGIN_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_SCOPE) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
        }
    }
}

static void
ZR185(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        switch (CURRENT_TERMINAL) {
          case 6:
            break;
          default:
            goto ZL1;
        }
        ADVANCE_LEXER;
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_open_tuple ();
    }
        }
    }
}

static void
ZR253(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        {
            switch (CURRENT_TERMINAL) {
              case 20:
                {
                    ADVANCE_LEXER;
                    {

    sid_current_scope = &sid_global_scope;
                    }
                }
                break;
              default:
                {
                    {

    sid_current_scope = &sid_scope_stack;
                    }
                }
                break;
            }
        }
        {
            switch (CURRENT_TERMINAL) {
              case 10:
                {
                    ZR187 ();
                    if ((CURRENT_TERMINAL) == 26) {
                        RESTORE_LEXER;
                        goto ZL1;
                    }
                }
                break;
              case 4:
                {
                    ZR239 ();
                    if ((CURRENT_TERMINAL) == 26) {
                        RESTORE_LEXER;
                        goto ZL1;
                    }
                }
                break;
              default:
                goto ZL1;
            }
        }
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR186(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        switch (CURRENT_TERMINAL) {
          case 7:
            break;
          default:
            goto ZL1;
        }
        ADVANCE_LEXER;
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_close_tuple ();
    }
        }
    }
}

static void
ZR128(void)
{
    switch (CURRENT_TERMINAL) {
      case 4:
        {
            NStringT ZI130;

            {

    nstring_assign (&ZI130, lexer_string_value (sid_current_stream));
            }
            ADVANCE_LEXER;
            {
                {
                    switch (CURRENT_TERMINAL) {
                      case 5:
                        break;
                      default:
                        goto ZL3;
                    }
                    ADVANCE_LEXER;
                }
                goto ZL2;
              ZL3:;
                {
                    {

    if (!sid_propagating_error) {
        E_expected_typemark ();
    }
                    }
                }
              ZL2:;
            }
            {
                {
                    NStringT ZI133;

                    switch (CURRENT_TERMINAL) {
                      case 4:
                        {

    nstring_assign (&ZI133, lexer_string_value (sid_current_stream));
                        }
                        break;
                      default:
                        goto ZL5;
                    }
                    ADVANCE_LEXER;
                    {
                        switch (CURRENT_TERMINAL) {
                          case 24:
                            {
                                ADVANCE_LEXER;
                                {

    if (!types_add_typed_name (&sid_current_type, sid_current_table, &(ZI130),
                               (&ZI133), TRUE)) {
        E_unknown_type ((&ZI133));
    }
    nstring_destroy (&(ZI133));
                                }
                            }
                            break;
                          default:
                            {
                                {

    if (!types_add_typed_name (&sid_current_type, sid_current_table, &(ZI130),
                               (&ZI133), FALSE)) {
        E_unknown_type ((&ZI133));
    }
    nstring_destroy (&(ZI133));
                                }
                            }
                            break;
                        }
                    }
                }
                goto ZL4;
              ZL5:;
                {
                    {

    if (!sid_propagating_error) {
        E_expected_identifier ();
    }
                    }
                    {

    nstring_destroy (&(ZI130));
                    }
                    {

    if (sid_finished_terminals) {
        while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
               (CURRENT_TERMINAL != LEXER_TOK_DEFINE) &&
               (CURRENT_TERMINAL != LEXER_TOK_BEGIN_SCOPE) &&
               (CURRENT_TERMINAL != LEXER_TOK_BEGIN_RULE) &&
               (CURRENT_TERMINAL != LEXER_TOK_SEPARATOR) &&
               (CURRENT_TERMINAL != LEXER_TOK_CLOSE_TUPLE) &&
               (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
               (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
            if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
                nstring_destroy (lexer_string_value (sid_current_stream));
            }
            ADVANCE_LEXER;
        }
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
            ADVANCE_LEXER;
        }
    } else {
        while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
               (CURRENT_TERMINAL != LEXER_TOK_SEPARATOR) &&
               (CURRENT_TERMINAL != LEXER_TOK_CLOSE_TUPLE) &&
               (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
               (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
               (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
            if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
                nstring_destroy (lexer_string_value (sid_current_stream));
            }
            ADVANCE_LEXER;
        }
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
            ADVANCE_LEXER;
        }
    }
    sid_propagating_error = TRUE;
                    }
                }
              ZL4:;
            }
        }
        break;
      case 5:
        {
            ADVANCE_LEXER;
            {
                {
                    NStringT ZI133;

                    switch (CURRENT_TERMINAL) {
                      case 4:
                        {

    nstring_assign (&ZI133, lexer_string_value (sid_current_stream));
                        }
                        break;
                      default:
                        goto ZL8;
                    }
                    ADVANCE_LEXER;
                    {
                        switch (CURRENT_TERMINAL) {
                          case 24:
                            {
                                ADVANCE_LEXER;
                                {

    if (!types_add_type (&sid_current_type, sid_current_table, (&ZI133), TRUE)) {
        E_unknown_type ((&ZI133));
    }
    nstring_destroy (&(ZI133));
                                }
                            }
                            break;
                          default:
                            {
                                {

    if (!types_add_type (&sid_current_type, sid_current_table, (&ZI133),
                         FALSE)) {
        E_unknown_type ((&ZI133));
    }
    nstring_destroy (&(ZI133));
                                }
                            }
                            break;
                        }
                    }
                }
                goto ZL7;
              ZL8:;
                {
                    {

    if (!sid_propagating_error) {
        E_expected_identifier ();
    }
                    }
                    {

    if (sid_finished_terminals) {
        while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
               (CURRENT_TERMINAL != LEXER_TOK_DEFINE) &&
               (CURRENT_TERMINAL != LEXER_TOK_BEGIN_SCOPE) &&
               (CURRENT_TERMINAL != LEXER_TOK_BEGIN_RULE) &&
               (CURRENT_TERMINAL != LEXER_TOK_SEPARATOR) &&
               (CURRENT_TERMINAL != LEXER_TOK_CLOSE_TUPLE) &&
               (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
               (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
            if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
                nstring_destroy (lexer_string_value (sid_current_stream));
            }
            ADVANCE_LEXER;
        }
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
            ADVANCE_LEXER;
        }
    } else {
        while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
               (CURRENT_TERMINAL != LEXER_TOK_SEPARATOR) &&
               (CURRENT_TERMINAL != LEXER_TOK_CLOSE_TUPLE) &&
               (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
               (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
               (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
            if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
                nstring_destroy (lexer_string_value (sid_current_stream));
            }
            ADVANCE_LEXER;
        }
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
            ADVANCE_LEXER;
        }
    }
    sid_propagating_error = TRUE;
                    }
                }
              ZL7:;
            }
        }
        break;
      case 26:
        return;
      default:
        goto ZL1;
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_tuple_defn ();
    }
        }
        {

    if (sid_finished_terminals) {
        while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
               (CURRENT_TERMINAL != LEXER_TOK_DEFINE) &&
               (CURRENT_TERMINAL != LEXER_TOK_BEGIN_SCOPE) &&
               (CURRENT_TERMINAL != LEXER_TOK_BEGIN_RULE) &&
               (CURRENT_TERMINAL != LEXER_TOK_SEPARATOR) &&
               (CURRENT_TERMINAL != LEXER_TOK_CLOSE_TUPLE) &&
               (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
               (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
            if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
                nstring_destroy (lexer_string_value (sid_current_stream));
            }
            ADVANCE_LEXER;
        }
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
            ADVANCE_LEXER;
        }
    } else {
        while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
               (CURRENT_TERMINAL != LEXER_TOK_SEPARATOR) &&
               (CURRENT_TERMINAL != LEXER_TOK_CLOSE_TUPLE) &&
               (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
               (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
               (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
            if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
                nstring_destroy (lexer_string_value (sid_current_stream));
            }
            ADVANCE_LEXER;
        }
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
            ADVANCE_LEXER;
        }
    }
    sid_propagating_error = TRUE;
        }
    }
}

static void
ZR259(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
  ZL2_259:;
    {
        ZR261 ();
        {
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {
                {

    (ZI0) = (CURRENT_TERMINAL == LEXER_TOK_TERMINATOR);
                }
                if (!ZI0)
                    goto ZL5;
                goto ZL3;
            }
            /*UNREACHED*/
          ZL5:;
            switch (CURRENT_TERMINAL) {
              case 23:
                {
                    ADVANCE_LEXER;
                    goto ZL2_259;
                }
                /*UNREACHED*/
              default:
                goto ZL4;
            }
            /*UNREACHED*/
          ZL4:;
            {
                {

    if (!sid_propagating_error) {
        E_expected_separator ();
    }
                }
                {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_SEPARATOR)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
                }
                {

    sid_propagating_error = FALSE;
                }
                {
                    {
                        {

    (ZI0) = (CURRENT_TERMINAL != LEXER_TOK_SEPARATOR);
                        }
                        if (!ZI0)
                            goto ZL7;
                    }
                    goto ZL6;
                  ZL7:;
                    {
                        goto ZL2_259;
                    }
                    /*UNREACHED*/
                  ZL6:;
                }
            }
          ZL3:;
        }
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR126(void)
{
    switch (CURRENT_TERMINAL) {
      case 5:
        {
            ADVANCE_LEXER;
            ZR142 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {

    types_assign (&sid_saved_type, &sid_current_type);
    sid_saved_pred_id = sid_current_pred_id;
            }
            ZR146 ();
            ZR142 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      default:
        {
            {

    types_init (&sid_saved_type);
    types_init (&sid_current_type);
    sid_saved_pred_id   = NIL (EntryP);
    sid_current_pred_id = NIL (EntryP);
            }
        }
        break;
      case 26:
        return;
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR208(void)
{
    switch (CURRENT_TERMINAL) {
      case 4:
        {
            NStringT ZI151;

            {

    nstring_assign (&ZI151, lexer_string_value (sid_current_stream));
            }
            ADVANCE_LEXER;
            {
                {
                    {

    types_init (&sid_current_type);
    sid_current_pred_id = NIL (EntryP);
                    }
                    ZR284 (&ZI151);
                    if ((CURRENT_TERMINAL) == 26) {
                        RESTORE_LEXER;
                        goto ZL3;
                    }
                }
                goto ZL2;
              ZL3:;
                {
                    {

    if (!sid_propagating_error) {
        E_expected_tuple_def_or_term ();
    }
                    }
                    {

    nstring_destroy (&(ZI151));
                    }
                    {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_ALT_SEP) &&
           (CURRENT_TERMINAL != LEXER_TOK_HANDLER_SEP) &&
           (CURRENT_TERMINAL != LEXER_TOK_BEGIN_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_SCOPE) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
                    }
                }
              ZL2:;
            }
        }
        break;
      case 24:
        {
            ADVANCE_LEXER;
            {
                {
                    NStringT ZI151;

                    switch (CURRENT_TERMINAL) {
                      case 4:
                        {

    nstring_assign (&ZI151, lexer_string_value (sid_current_stream));
                        }
                        break;
                      default:
                        goto ZL5;
                    }
                    ADVANCE_LEXER;
                    {

    types_init (&sid_current_type);
    sid_current_pred_id = NIL (EntryP);
                    }
                    {

    NStringT scope;
    EntryP   non_local_entry = scope_stack_get_non_local (&sid_scope_stack,
                                                          sid_current_table,
                                                          (&ZI151), &scope);
    EntryP   name_entry      = table_get_entry (sid_current_table, (&ZI151));

    if (name_entry) {
        if ((sid_current_entry) && (sid_current_alt)) {
            if ((!types_contains (alt_names (sid_current_alt), name_entry)) &&
                (!types_contains (rule_param (sid_current.rule),
                                  name_entry))) {
                name_entry = NIL (EntryP);
            }
        } else {
            name_entry = NIL (EntryP);
        }
    }
    if (name_entry) {
        types_add_name_and_type_var (&sid_current_type, name_entry,
                                     NIL (EntryP));
        if (non_local_entry) {
            nstring_destroy (&scope);
        }
        nstring_destroy (&(ZI151));
    } else if (non_local_entry) {
        types_add_name_and_type_var (&sid_current_type, non_local_entry,
                                     NIL (EntryP));
        if (nstring_length (&scope) > nstring_length (&sid_maximum_scope)) {
            nstring_destroy (&sid_maximum_scope);
            nstring_assign (&sid_maximum_scope, &scope);
        } else {
            nstring_destroy (&scope);
        }
        nstring_destroy (&(ZI151));
    } else {
        E_undefined_assignment ((&ZI151));
        types_add_name (&sid_current_type, sid_current_table, &(ZI151), FALSE);
    }
                    }
                    {

    types_assign (&sid_saved_type, &sid_current_type);
    sid_saved_pred_id = sid_current_pred_id;
                    }
                    ZR249 ();
                    ZR199 ();
                    if ((CURRENT_TERMINAL) == 26) {
                        RESTORE_LEXER;
                        goto ZL5;
                    }
                }
                goto ZL4;
              ZL5:;
                {
                    {

    if (!sid_propagating_error) {
        E_expected_identifier ();
    }
                    }
                }
              ZL4:;
            }
        }
        break;
      case 6:
        {
            ZR163 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {

    types_assign (&sid_saved_type, &sid_current_type);
    sid_saved_pred_id = sid_current_pred_id;
            }
            ZR249 ();
            ZR199 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 10: case 18: case 19:
        {
            {

    types_init (&sid_current_type);
    sid_current_pred_id = NIL (EntryP);
            }
            ZR283 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 26:
        return;
      default:
        goto ZL1;
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR217(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        NStringT ZI151;

        switch (CURRENT_TERMINAL) {
          case 4:
            {

    nstring_assign (&ZI151, lexer_string_value (sid_current_stream));
            }
            break;
          default:
            goto ZL1;
        }
        ADVANCE_LEXER;
        {

    if ((sid_current_entry) && (sid_current_alt)) {
        EntryP entry = scope_stack_get_action (&sid_scope_stack,
                                               sid_current_table, (&ZI151));

        if (entry) {
            sid_current_item = item_create (entry);
        } else {
            E_unknown_action ((&ZI151));
            sid_current_item = NIL (ItemP);
            (void) alt_deallocate (sid_current_alt);
            sid_current_alt  = NIL (AltP);
        }
    } else {
        sid_current_item = NIL (ItemP);
    }
    nstring_destroy (&(ZI151));
        }
        ZR246 ();
        ZR196 ();
        if ((CURRENT_TERMINAL) == 26) {
            RESTORE_LEXER;
            goto ZL1;
        }
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_identifier ();
    }
        }
        {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_ALT_SEP) &&
           (CURRENT_TERMINAL != LEXER_TOK_HANDLER_SEP) &&
           (CURRENT_TERMINAL != LEXER_TOK_BEGIN_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_SCOPE) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
        }
    }
}

static void
ZR155(void)
{
    switch (CURRENT_TERMINAL) {
      case 4:
        {
            NStringT ZI151;

            {

    nstring_assign (&ZI151, lexer_string_value (sid_current_stream));
            }
            ADVANCE_LEXER;
            {

    sid_current_entry = table_add_basic (sid_current_table, &(ZI151),
                                         sid_current_grammar, FALSE);
    if (sid_current_entry == NIL (EntryP)) {
        E_duplicate_basic ((&ZI151));
        nstring_destroy (&(ZI151));
    } else {
        sid_current.basic = entry_get_basic (sid_current_entry);
    }
            }
            ZR126 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {

    if (sid_current_entry) {
        KeyP key = entry_key (sid_current_entry);

        if (types_contains_names (&sid_saved_type)) {
            E_basic_param_has_names (key, &sid_saved_type);
        }
        if (types_contains_names (&sid_current_type)) {
            E_basic_result_has_names (key, &sid_current_type);
        }
        if (types_contains_references (&sid_current_type)) {
            E_basic_result_has_refs (key, &sid_current_type);
        }
        if (!types_equal_zero_tuple (&sid_saved_type)) {
            E_basic_param_mismatch (key, &sid_saved_type);
        }
        types_assign (basic_result (sid_current.basic), &sid_current_type);
    } else {
        types_destroy (&sid_current_type);
    }
    types_destroy (&sid_saved_type);
            }
            ZR252 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 19:
        {
            ADVANCE_LEXER;
            {
                {
                    NStringT ZI151;

                    switch (CURRENT_TERMINAL) {
                      case 4:
                        {

    nstring_assign (&ZI151, lexer_string_value (sid_current_stream));
                        }
                        break;
                      default:
                        goto ZL3;
                    }
                    ADVANCE_LEXER;
                    {

    sid_current_entry = table_add_basic (sid_current_table, &(ZI151),
                                         sid_current_grammar, TRUE);
    if (sid_current_entry == NIL (EntryP)) {
        E_duplicate_basic ((&ZI151));
        nstring_destroy (&(ZI151));
    } else {
        sid_current.basic = entry_get_basic (sid_current_entry);
    }
                    }
                    ZR126 ();
                    if ((CURRENT_TERMINAL) == 26) {
                        RESTORE_LEXER;
                        goto ZL3;
                    }
                    {

    if (sid_current_entry) {
        KeyP key = entry_key (sid_current_entry);

        if (types_contains_names (&sid_saved_type)) {
            E_basic_param_has_names (key, &sid_saved_type);
        }
        if (types_contains_names (&sid_current_type)) {
            E_basic_result_has_names (key, &sid_current_type);
        }
        if (types_contains_references (&sid_current_type)) {
            E_basic_result_has_refs (key, &sid_current_type);
        }
        if (!types_equal_zero_tuple (&sid_saved_type)) {
            E_basic_param_mismatch (key, &sid_saved_type);
        }
        types_assign (basic_result (sid_current.basic), &sid_current_type);
    } else {
        types_destroy (&sid_current_type);
    }
    types_destroy (&sid_saved_type);
                    }
                    ZR252 ();
                    if ((CURRENT_TERMINAL) == 26) {
                        RESTORE_LEXER;
                        goto ZL3;
                    }
                }
                goto ZL2;
              ZL3:;
                {
                    {

    if (!sid_propagating_error) {
        E_expected_identifier ();
    }
                    }
                    {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
                    }
                }
              ZL2:;
            }
        }
        break;
      case 26:
        return;
      default:
        goto ZL1;
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_terminal_decn ();
    }
        }
        {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
        }
    }
}

static void
ZR187(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        switch (CURRENT_TERMINAL) {
          case 10:
            break;
          default:
            goto ZL1;
        }
        ADVANCE_LEXER;
        {
            {
                NStringT ZI151;

                switch (CURRENT_TERMINAL) {
                  case 4:
                    {

    nstring_assign (&ZI151, lexer_string_value (sid_current_stream));
                    }
                    break;
                  default:
                    goto ZL3;
                }
                ADVANCE_LEXER;
                {

    sid_current_entry = scope_stack_add_action (sid_current_scope,
                                                sid_current_table, &(ZI151),
                                                sid_enclosing_rule,
                                                &sid_redefining_entry);
    if (sid_current_entry) {
        sid_current.action = entry_get_action (sid_current_entry);
    } else {
        E_duplicate_action ((&ZI151));
        nstring_destroy (&(ZI151));
    }
                }
                ZR246 ();
                ZR126 ();
                if ((CURRENT_TERMINAL) == 26) {
                    RESTORE_LEXER;
                    goto ZL3;
                }
                {

    if (sid_current_entry) {
        KeyP       key     = entry_key (sid_current_entry);
        TypeTupleP param   = action_param (sid_current.action);
        TypeTupleP result  = action_result (sid_current.action);
        BoolT      errored = FALSE;

        if (types_contains_names (&sid_saved_type)) {
            E_action_param_has_names (key, &sid_saved_type);
            errored = TRUE;
        }
        if (sid_redefining_entry) {
            if (!types_equal (param, &sid_saved_type)) {
                E_action_param_mismatch (key, param, &sid_saved_type);
                errored = TRUE;
            }
        }
        if (types_contains_names (&sid_current_type)) {
            E_action_result_has_names (key, &sid_current_type);
            errored = TRUE;
        }
        if (types_contains_references (&sid_current_type)) {
            E_action_result_has_refs (key, &sid_current_type);
            errored = TRUE;
        }
        if (sid_redefining_entry) {
            if (!types_equal (result, &sid_current_type)) {
                E_action_result_mismatch (key, result, &sid_current_type);
                errored = TRUE;
            }
        }
        if (errored || sid_redefining_entry) {
            types_destroy (&sid_saved_type);
            types_destroy (&sid_current_type);
        } else {
            types_assign (param, &sid_saved_type);
            types_assign (result, &sid_current_type);
        }
    } else {
        types_destroy (&sid_saved_type);
        types_destroy (&sid_current_type);
    }
                }
                ZR252 ();
                if ((CURRENT_TERMINAL) == 26) {
                    RESTORE_LEXER;
                    goto ZL3;
                }
            }
            goto ZL2;
          ZL3:;
            {
                {

    if (!sid_propagating_error) {
        E_expected_identifier ();
    }
                }
                {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_SCOPE) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
                }
            }
          ZL2:;
        }
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR228(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
  ZL2_228:;
    {
        ZR221 ();
        {
            switch (CURRENT_TERMINAL) {
              case 4: case 6: case 10: case 13: case 18:
              case 19: case 24:
                {
                    goto ZL2_228;
                }
                /*UNREACHED*/
              case 26:
                RESTORE_LEXER;
                goto ZL1;
              default:
                break;
            }
        }
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_item ();
    }
        }
        {

    while ((CURRENT_TERMINAL != LEXER_TOK_EOF) &&
           (CURRENT_TERMINAL != LEXER_TOK_TERMINATOR) &&
           (CURRENT_TERMINAL != LEXER_TOK_ALT_SEP) &&
           (CURRENT_TERMINAL != LEXER_TOK_HANDLER_SEP) &&
           (CURRENT_TERMINAL != LEXER_TOK_BEGIN_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_RULE) &&
           (CURRENT_TERMINAL != LEXER_TOK_END_SCOPE) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_PRODUCTIONS) &&
           (CURRENT_TERMINAL != LEXER_TOK_BLT_ENTRY)) {
        if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
            nstring_destroy (lexer_string_value (sid_current_stream));
        }
        ADVANCE_LEXER;
    }
    if (CURRENT_TERMINAL == LEXER_TOK_IDENTIFIER) {
        nstring_destroy (lexer_string_value (sid_current_stream));
    }
    if (CURRENT_TERMINAL != LEXER_TOK_EOF) {
        ADVANCE_LEXER;
    }
    sid_propagating_error = TRUE;
        }
        {

    sid_propagating_error = FALSE;
        }
    }
}

static void
ZR261(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        NStringT ZI151;

        switch (CURRENT_TERMINAL) {
          case 4:
            {

    nstring_assign (&ZI151, lexer_string_value (sid_current_stream));
            }
            break;
          default:
            goto ZL1;
        }
        ADVANCE_LEXER;
        {

    EntryP entry = table_get_rule (sid_current_table, (&ZI151));

    if (entry) {
        if (entry_list_contains (sid_current_entry_list, entry)) {
            E_mult_entry (entry_key (entry));
        } else {
            entry_list_add (sid_current_entry_list, entry);
            rule_required (entry_get_rule (entry));
        }
    } else {
        E_unknown_rule ((&ZI151));
    }
    nstring_destroy (&(ZI151));
        }
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_identifier ();
    }
        }
    }
}

static void
ZR168(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
  ZL2_168:;
    {
        ZR165 ();
        {
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {
                {

    (ZI0) = ((CURRENT_TERMINAL == LEXER_TOK_CLOSE_TUPLE) ||
                  (CURRENT_TERMINAL == LEXER_TOK_EOF) ||
                  (sid_propagating_error));
                }
                if (!ZI0)
                    goto ZL5;
                goto ZL3;
            }
            /*UNREACHED*/
          ZL5:;
            switch (CURRENT_TERMINAL) {
              case 23:
                {
                    ADVANCE_LEXER;
                    goto ZL2_168;
                }
                /*UNREACHED*/
              default:
                goto ZL4;
            }
            /*UNREACHED*/
          ZL4:;
            {
                {

    if (!sid_propagating_error) {
        E_expected_separator ();
    }
                }
                goto ZL2_168;
            }
            /*UNREACHED*/
          ZL3:;
        }
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR246(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        switch (CURRENT_TERMINAL) {
          case 11:
            break;
          default:
            goto ZL1;
        }
        ADVANCE_LEXER;
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_end_action ();
    }
        }
    }
}

static void
ZR248(void)
{
    switch (CURRENT_TERMINAL) {
      case 12: case 21:
        {
            {

    if (sid_current_entry) {
        KeyP key = entry_key (sid_current_entry);

        if (rule_is_defined (sid_current.rule)) {
            E_rule_already_defined (key);
            sid_current_entry = NIL (EntryP);
            types_destroy (&sid_saved_type);
            types_destroy (&sid_current_type);
        } else {
            TypeTupleP param   = rule_param (sid_current.rule);
            TypeTupleP result  = rule_result (sid_current.rule);
            BoolT      errored = FALSE;

            rule_defined (sid_current.rule);
            if (!types_disjoint_names (&sid_saved_type)) {
                E_rule_param_clash (key, &sid_saved_type);
                errored = TRUE;
            }
            if (types_check_shadowing (&sid_saved_type, &sid_scope_stack,
                                       sid_current.rule)) {
                errored = TRUE;
            }
            if (sid_redefining_entry) {
                if (!types_fillin_names (param, &sid_saved_type)) {
                    E_rule_param_mismatch (key, param, &sid_saved_type);
                    errored = TRUE;
                }
                types_destroy (&sid_saved_type);
            } else {
                types_assign (param, &sid_saved_type);
            }
            if (!types_disjoint_names (&sid_current_type)) {
                E_rule_result_clash (key, &sid_current_type);
                errored = TRUE;
            }
            if (types_check_shadowing (&sid_current_type, &sid_scope_stack,
                                       sid_current.rule)) {
                errored = TRUE;
            }
            if (types_contains_references (&sid_current_type)) {
                E_rule_result_has_refs (key, &sid_current_type);
                errored = TRUE;
            }
            if (sid_redefining_entry) {
                if (!types_fillin_names (result, &sid_current_type)) {
                    E_rule_result_mismatch (key, result, &sid_current_type);
                    errored = TRUE;
                }
                types_destroy (&sid_current_type);
            } else {
                types_assign (result, &sid_current_type);
            }
            if (errored) {
                sid_current_entry = NIL (EntryP);
            } else {
                if (types_intersect (param, result)) {
                    E_rule_formal_clash (key, param, result);
                    sid_current_entry = NIL (EntryP);
                }
            }
        }
    } else {
        types_destroy (&sid_saved_type);
        types_destroy (&sid_current_type);
    }
    sid_alternative   = 0;
    sid_internal_rule = FALSE;
    sid_external_rule = sid_current_entry;
    nstring_init (&sid_maximum_scope);
            }
            {

    if (sid_current_entry) {
        KeyP     key   = entry_key (sid_current_entry);
        NStringP scope = key_get_string (key);

        scope_stack_push (&sid_scope_stack, scope);
    }
            }
            ZR192 ();
            ZR249 ();
            {
                if ((CURRENT_TERMINAL) == 26) {
                    RESTORE_LEXER;
                    goto ZL1;
                }
                {
                    switch (CURRENT_TERMINAL) {
                      case 13:
                        break;
                      default:
                        goto ZL3;
                    }
                    ADVANCE_LEXER;
                }
                goto ZL2;
              ZL3:;
                {
                    {

    if (!sid_propagating_error) {
        E_expected_begin_rule ();
    }
                    }
                }
              ZL2:;
            }
            ZR219 ();
            ZR251 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {

    if (sid_current_entry) {
        scope_stack_pop (&sid_scope_stack);
    }
            }
            {

    if (sid_current_entry) {
        nstring_assign (rule_maximum_scope (sid_current.rule),
                        &sid_maximum_scope);
    } else {
        nstring_destroy (&sid_maximum_scope);
    }
            }
            ZR252 ();
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
        }
        break;
      case 9:
        {
            {

    if (sid_current_entry) {
        KeyP       key     = entry_key (sid_current_entry);
        TypeTupleP param   = rule_param (sid_current.rule);
        TypeTupleP result  = rule_result (sid_current.rule);
        BoolT      errored = FALSE;

        if (types_contains_names (&sid_saved_type)) {
            E_rule_param_has_names (key, &sid_saved_type);
            errored = TRUE;
        }
        if (sid_redefining_entry) {
            if (!types_equal (param, &sid_saved_type)) {
                E_rule_param_mismatch (key, param, &sid_saved_type);
                errored = TRUE;
            }
        }
        if (types_contains_names (&sid_current_type)) {
            E_rule_result_has_names (key, &sid_current_type);
            errored = TRUE;
        }
        if (types_contains_references (&sid_current_type)) {
            E_rule_result_has_refs (key, &sid_current_type);
            errored = TRUE;
        }
        if (sid_redefining_entry) {
            if (!types_equal (result, &sid_current_type)) {
                E_rule_result_mismatch (key, result, &sid_current_type);
                errored = TRUE;
            }
        }
        if (errored || sid_redefining_entry) {
            types_destroy (&sid_saved_type);
            types_destroy (&sid_current_type);
        } else {
            types_assign (param, &sid_saved_type);
            types_assign (result, &sid_current_type);
        }
    } else {
        types_destroy (&sid_saved_type);
        types_destroy (&sid_current_type);
    }
            }
            ADVANCE_LEXER;
        }
        break;
      case 26:
        return;
      default:
        goto ZL1;
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR249(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        switch (CURRENT_TERMINAL) {
          case 12:
            break;
          default:
            goto ZL1;
        }
        ADVANCE_LEXER;
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_define ();
    }
        }
    }
}

static void
ZR180(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
  ZL2_180:;
    {
        ZR177 ();
        {
            if ((CURRENT_TERMINAL) == 26) {
                RESTORE_LEXER;
                goto ZL1;
            }
            {
                {

    (ZI0) = ((CURRENT_TERMINAL == LEXER_TOK_CLOSE_TUPLE) ||
                  (CURRENT_TERMINAL == LEXER_TOK_EOF) ||
                  (sid_propagating_error));
                }
                if (!ZI0)
                    goto ZL5;
                goto ZL3;
            }
            /*UNREACHED*/
          ZL5:;
            switch (CURRENT_TERMINAL) {
              case 23:
                {
                    ADVANCE_LEXER;
                    goto ZL2_180;
                }
                /*UNREACHED*/
              default:
                goto ZL4;
            }
            /*UNREACHED*/
          ZL4:;
            {
                {

    if (!sid_propagating_error) {
        E_expected_separator ();
    }
                }
                goto ZL2_180;
            }
            /*UNREACHED*/
          ZL3:;
        }
    }
    return;
  ZL1:;
    SAVE_LEXER (26);
    return;
}

static void
ZR251(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        switch (CURRENT_TERMINAL) {
          case 14:
            break;
          default:
            goto ZL1;
        }
        ADVANCE_LEXER;
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_end_rule ();
    }
        }
    }
}

static void
ZR252(void)
{
    if ((CURRENT_TERMINAL) == 26) {
        return;
    }
    {
        switch (CURRENT_TERMINAL) {
          case 9:
            break;
          default:
            goto ZL1;
        }
        ADVANCE_LEXER;
    }
    return;
  ZL1:;
    {
        {

    if (!sid_propagating_error) {
        E_expected_terminator ();
    }
        }
    }
}

/* BEGINNING OF TRAILER */



/* END OF FILE */