/*
 * Automatically generated from the files:
 *	/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.sid
 * and
 *	/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act
 * by:
 *	/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj/utilities/sid/sid
 */

/* BEGINNING OF HEADER */

#line 57 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

/*
 * Copyright (c) 2004, The Tendra Project <http://www.ten15.org/>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice unmodified, this list of conditions, and the following
 *    disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 *  		 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.
 *
 * $TenDRA: tendra/src/utilities/calculus/syntax.act,v 1.4 2004/03/12 03:08:04 bp Exp $
 */


#include "config.h"
#include "calculus.h"
#include "common.h"
#include "cstring.h"
#include "extra.h"
#include "lex.h"
#include "msgcat.h"
#include "syntax.h"
#include "type_ops.h"


/*
 *    PARSER TYPES
 *
 *    These types give the implementations of the various types used
 *    in the syntax.
 */

typedef LIST ( ARGUMENT_P ) ARGUMENT_P_LIST;
typedef LIST ( COMPONENT_P ) COMPONENT_P_LIST;
typedef LIST ( ECONST_P ) ECONST_P_LIST;
typedef LIST ( ENUM_P ) ENUM_P_LIST;
typedef LIST ( FIELD_P ) FIELD_P_LIST;
typedef LIST ( IDENTITY_P ) IDENTITY_P_LIST;
typedef LIST ( MAP_P ) MAP_P_LIST;
typedef LIST ( PRIMITIVE_P ) PRIMITIVE_P_LIST;
typedef LIST ( STRUCTURE_P ) STRUCTURE_P_LIST;
typedef LIST ( UNION_P ) UNION_P_LIST;


/*
 *    COUNTER VARIABLES
 *
 *    The variable enum_value is used to determine the value of enumerators.
 *    enum_max is used to record the maximum value of enum_value.  Both are
 *    reset to zero at the end of each enumeration type.  no_fields is used
 *    to count the number of field in each union.  It is reset to zero at
 *    the end of each union type.
 */

static number enum_value = 0;
static number enum_max = 0;
static int no_fields = 0;
static LIST ( ECONST_P ) enum_list = NULL_list ( ECONST_P );


/*
 *    COMPILATION MODE
 *
 *    We allow unreached code in the automatically generated sections.
 */

#if FS_TENDRA
#pragma TenDRA begin
#ifndef OLD_PRODUCER
#pragma TenDRA unreachable code allow
#endif
#endif


#line 132 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"

/* BEGINNING OF FUNCTION DECLARATIONS */

static void ZR254 (number, number *);
static void ZRimport_Hitem (void);
static void ZR258 (number, number *);
static void ZRprimary_Hexp (number *);
static void ZR262 (number, number *);
static void ZR264 (int *);
static void ZR265 (int *);
static void ZR268 (CLASS_ID_P *);
static void ZR269 (string *);
static void ZRextra_Hlist (void);
static void ZRclass_Hid (CLASS_ID_P *);
static void ZRnew_Hitem_Hlist (void);
extern void extra_calculus (void);
static void ZRunion_Hlist (UNION_P_LIST *);
static void ZRshift_Hexp (number *);
static void ZRcomponent_Hdecl (TYPE_P, COMPONENT_P_LIST *);
static void ZRadd_Hexp (number *);
static void ZRstructure_Hsingle (STRUCTURE_P_LIST *);
static void ZRmap_Hlist (MAP_P_LIST *);
static void ZRprimitive_Hdefn (CLASS_ID_P, PRIMITIVE_P *);
static void ZRunary_Hexp (number *);
static void ZRand_Hexp (number *);
static void ZRargument_Hdecl (TYPE_P, ARGUMENT_P_LIST *);
static void ZRold_Hunit (void);
static void ZRenumerator_Hlist (ECONST_P_LIST *);
static void ZRcomponent_Hgroup (COMPONENT_P_LIST *);
static void ZRnew_Hunit (void);
static void ZRidentity_Hdefn (CLASS_ID_P, IDENTITY_P *);
static void ZRmult_Hexp (number *);
extern void read_calculus (void);
static void ZRtype (TYPE_P *);
static void ZRstructure_Hdefn (CLASS_ID_P, string, STRUCTURE_P *);
static void ZRcomponent_Hlist (COMPONENT_P_LIST *);
static void ZRextended_Htype (TYPE_P *);
static void ZRprimitive_Hlist (PRIMITIVE_P_LIST *);
static void ZR209 (string *);
static void ZRargument_Hlist (ARGUMENT_P_LIST *);
static void ZRexpression (number *);
static void ZRxor_Hexp (number *);
static void ZRidentity_Hlist (IDENTITY_P_LIST *);
static void ZRor_Hexp (number *);
static void ZRunion_Hsingle (UNION_P_LIST *);
static void ZRstructure_Hlist (STRUCTURE_P_LIST *);
static void ZRunion_Hdefn_Hold (CLASS_ID_P, UNION_P *);
static void ZRenum_Hsingle (ENUM_P_LIST *);
static void ZRfield_Hid_Hlist (int, FIELD_P_LIST *);
static void ZR242 (number, number *);
static void ZRfield_Hlist (FIELD_P_LIST *);
static void ZRunion_Hdefn_Hnew (CLASS_ID_P, UNION_P *);
static void ZR246 (number, number *);
static void ZR250 (number, number *);

/* BEGINNING OF STATIC VARIABLES */


/* BEGINNING OF FUNCTION DEFINITIONS */

static void
ZR254 (number ZI252, number *ZO253)
{
    number ZI253;

  ZL2_254:;
    switch (CURRENT_TERMINAL) {
      case lex_lshift:
	{
	    number ZIp;
	    number ZIn;

	    ADVANCE_LEXER;
	    ZRadd_Hexp (&ZIp);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: exp-lshift */
	    {
#line 483 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIn) = (ZI252) << (ZIp);
#line 216 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: exp-lshift */
	    /* BEGINNING OF INLINE: 254 */
	    ZI252 = ZIn;
	    goto ZL2_254;
	    /* END OF INLINE: 254 */
	}
	/*UNREACHED*/
      case lex_rshift:
	{
	    number ZIp;
	    number ZIn;

	    ADVANCE_LEXER;
	    ZRadd_Hexp (&ZIp);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: exp-rshift */
	    {
#line 487 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIn) = (ZI252) >> (ZIp);
#line 241 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: exp-rshift */
	    /* BEGINNING OF INLINE: 254 */
	    ZI252 = ZIn;
	    goto ZL2_254;
	    /* END OF INLINE: 254 */
	}
	/*UNREACHED*/
      default:
	{
	    ZI253 = ZI252;
	}
	break;
      case 49:
	return;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZO253 = ZI253;
}

static void
ZRimport_Hitem (void)
{
    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	string ZIa;

	switch (CURRENT_TERMINAL) {
	  case lex_identifier:
	    /* BEGINNING OF EXTRACT: identifier */
	    {
#line 222 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIa = string_copy ( token_buff );
#line 282 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF EXTRACT: identifier */
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	ZR269 (&ZIa);
	if ((CURRENT_TERMINAL) == 49) {
	    RESTORE_LEXER;
	    goto ZL1;
	}
    }
    return;
  ZL1:;
    SAVE_LEXER (49);
    return;
}

static void
ZR258 (number ZI256, number *ZO257)
{
    number ZI257;

  ZL2_258:;
    switch (CURRENT_TERMINAL) {
      case lex_minus:
	{
	    number ZIp;
	    number ZIn;

	    ADVANCE_LEXER;
	    ZRmult_Hexp (&ZIp);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: exp-minus */
	    {
#line 479 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIn) = (ZI256) - (ZIp);
#line 325 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: exp-minus */
	    /* BEGINNING OF INLINE: 258 */
	    ZI256 = ZIn;
	    goto ZL2_258;
	    /* END OF INLINE: 258 */
	}
	/*UNREACHED*/
      case lex_plus:
	{
	    number ZIp;
	    number ZIn;

	    ADVANCE_LEXER;
	    ZRmult_Hexp (&ZIp);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: exp-plus */
	    {
#line 475 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIn) = (ZI256) + (ZIp);
#line 350 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: exp-plus */
	    /* BEGINNING OF INLINE: 258 */
	    ZI256 = ZIn;
	    goto ZL2_258;
	    /* END OF INLINE: 258 */
	}
	/*UNREACHED*/
      default:
	{
	    ZI257 = ZI256;
	}
	break;
      case 49:
	return;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZO257 = ZI257;
}

static void
ZRprimary_Hexp (number *ZOn)
{
    number ZIn;

    switch (CURRENT_TERMINAL) {
      case lex_identifier:
	{
	    string ZIe;

	    /* BEGINNING OF EXTRACT: identifier */
	    {
#line 222 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIe = string_copy ( token_buff );
#line 390 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF EXTRACT: identifier */
	    ADVANCE_LEXER;
	    /* BEGINNING OF ACTION: exp-id */
	    {
#line 427 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    number n = 0;
    LIST ( ECONST_P ) p = enum_list;
    while ( !IS_NULL_list ( p ) ) {
	ECONST_P q = DEREF_ptr ( HEAD_list ( p ) );
	string s = DEREF_string ( ec_name ( q ) );
	if ( streq ( s, (ZIe) ) ) {
	    n = DEREF_number ( ec_value ( q ) );
	    break;
	}
	p = TAIL_list ( p );
    }
    if ( IS_NULL_list ( p ) ) {
	MSG_unknown_enumerator ((ZIe));
    }
    (ZIn) = n;
#line 413 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: exp-id */
	}
	break;
      case lex_number:
	{
	    /* BEGINNING OF EXTRACT: number */
	    {
#line 234 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIn = token_value;
#line 425 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF EXTRACT: number */
	    ADVANCE_LEXER;
	}
	break;
      case lex_open_Hround:
	{
	    ADVANCE_LEXER;
	    ZRexpression (&ZIn);
	    switch (CURRENT_TERMINAL) {
	      case lex_close_Hround:
		break;
	      case 49:
		RESTORE_LEXER;
		goto ZL1;
	      default:
		goto ZL1;
	    }
	    ADVANCE_LEXER;
	}
	break;
      case lex_question:
	{
	    ADVANCE_LEXER;
	    /* BEGINNING OF ACTION: exp-crt */
	    {
#line 423 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIn) = enum_value - 1;
#line 455 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: exp-crt */
	}
	break;
      case 49:
	return;
      default:
	goto ZL1;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOn = ZIn;
}

static void
ZR262 (number ZI260, number *ZO261)
{
    number ZI261;

  ZL2_262:;
    switch (CURRENT_TERMINAL) {
      case lex_div:
	{
	    number ZIp;
	    number ZIn;

	    ADVANCE_LEXER;
	    ZRunary_Hexp (&ZIp);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: exp-div */
	    {
#line 457 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    if ( (ZIp) == 0 ) {
	MSG_division_by_zero ();
	(ZIn) = 0;
    } else {
	(ZIn) = (ZI260) / (ZIp);
    }
#line 501 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: exp-div */
	    /* BEGINNING OF INLINE: 262 */
	    ZI260 = ZIn;
	    goto ZL2_262;
	    /* END OF INLINE: 262 */
	}
	/*UNREACHED*/
      case lex_rem:
	{
	    number ZIp;
	    number ZIn;

	    ADVANCE_LEXER;
	    ZRunary_Hexp (&ZIp);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: exp-rem */
	    {
#line 466 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    if ( (ZIp) == 0 ) {
	MSG_division_by_zero ();
	(ZIn) = 0;
    } else {
	(ZIn) = (ZI260) % (ZIp);
    }
#line 531 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: exp-rem */
	    /* BEGINNING OF INLINE: 262 */
	    ZI260 = ZIn;
	    goto ZL2_262;
	    /* END OF INLINE: 262 */
	}
	/*UNREACHED*/
      case lex_star:
	{
	    number ZIp;
	    number ZIn;

	    ADVANCE_LEXER;
	    ZRunary_Hexp (&ZIp);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: exp-mult */
	    {
#line 453 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIn) = (ZI260) * (ZIp);
#line 556 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: exp-mult */
	    /* BEGINNING OF INLINE: 262 */
	    ZI260 = ZIn;
	    goto ZL2_262;
	    /* END OF INLINE: 262 */
	}
	/*UNREACHED*/
      default:
	{
	    ZI261 = ZI260;
	}
	break;
      case 49:
	return;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZO261 = ZI261;
}

static void
ZR264 (int *ZOn)
{
    int ZIn;

    switch (CURRENT_TERMINAL) {
      case lex_colon:
	{
	    ADVANCE_LEXER;
	    /* BEGINNING OF ACTION: three */
	    {
#line 263 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"
 (ZIn) = 3; 
#line 594 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: three */
	}
	break;
      default:
	{
	    /* BEGINNING OF ACTION: one */
	    {
#line 261 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"
 (ZIn) = 1; 
#line 605 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: one */
	}
	break;
      case 49:
	return;
    }
    *ZOn = ZIn;
}

static void
ZR265 (int *ZOn)
{
    int ZIn;

    switch (CURRENT_TERMINAL) {
      case lex_hash:
	{
	    ADVANCE_LEXER;
	    /* BEGINNING OF ACTION: two */
	    {
#line 262 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"
 (ZIn) = 2; 
#line 629 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: two */
	}
	break;
      default:
	{
	    /* BEGINNING OF ACTION: one */
	    {
#line 261 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"
 (ZIn) = 1; 
#line 640 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: one */
	}
	break;
      case 49:
	return;
    }
    *ZOn = ZIn;
}

static void
ZR268 (CLASS_ID_P *ZI267)
{
    switch (CURRENT_TERMINAL) {
      case lex_identifier: case lex_list: case lex_ptr:
      case lex_stack: case lex_vec: case lex_vec_Hptr:
	{
	    IDENTITY_P ZIq;
	    IDENTITY_P_LIST ZIr;
	    IDENTITY_P_LIST ZIi;

	    ZRidentity_Hdefn (*ZI267, &ZIq);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: null-identity */
	    {
#line 600 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIr) = NULL_list ( IDENTITY_P );
#line 672 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: null-identity */
	    /* BEGINNING OF ACTION: join-identity */
	    {
#line 630 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    CONS_ptr ( (ZIq), (ZIr), (ZIi) );
#line 680 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: join-identity */
	    /* BEGINNING OF ACTION: add-identity */
	    {
#line 1139 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    algebra->identities = APPEND_list ( algebra->identities, (ZIi) );
#line 688 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: add-identity */
	}
	break;
      case lex_string:
	{
	    PRIMITIVE_P ZIq;
	    PRIMITIVE_P_LIST ZIr;
	    PRIMITIVE_P_LIST ZIp;

	    ZRprimitive_Hdefn (*ZI267, &ZIq);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: null-primitive */
	    {
#line 559 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIr) = NULL_list ( PRIMITIVE_P );
#line 709 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: null-primitive */
	    /* BEGINNING OF ACTION: join-primitive */
	    {
#line 589 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    CONS_ptr ( (ZIq), (ZIr), (ZIp) );
#line 717 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: join-primitive */
	    /* BEGINNING OF ACTION: add-primitive */
	    {
#line 1128 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    algebra->primitives = APPEND_list ( algebra->primitives, (ZIp) );
#line 725 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: add-primitive */
	}
	break;
      case 49:
	return;
      default:
	goto ZL1;
    }
    return;
  ZL1:;
    SAVE_LEXER (49);
    return;
}

static void
ZR269 (string *ZIa)
{
    switch (CURRENT_TERMINAL) {
      case lex_colon_Hcolon:
	{
	    string ZIi;

	    ADVANCE_LEXER;
	    switch (CURRENT_TERMINAL) {
	      case lex_identifier:
		/* BEGINNING OF EXTRACT: identifier */
		{
#line 222 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIi = string_copy ( token_buff );
#line 757 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		}
		/* END OF EXTRACT: identifier */
		break;
	      default:
		goto ZL1;
	    }
	    ADVANCE_LEXER;
	    /* BEGINNING OF ACTION: import-one */
	    {
#line 1088 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    import_type ( (*ZIa), (ZIi) );
#line 770 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: import-one */
	}
	break;
      default:
	{
	    /* BEGINNING OF ACTION: import-all */
	    {
#line 1077 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    import_algebra ( (*ZIa) );
#line 782 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: import-all */
	}
	break;
      case 49:
	return;
    }
    return;
  ZL1:;
    SAVE_LEXER (49);
    return;
}

static void
ZRextra_Hlist (void)
{
  ZL2_extra_Hlist:;
    switch (CURRENT_TERMINAL) {
      case lex_identifier: case lex_list: case lex_ptr:
      case lex_stack: case lex_vec: case lex_vec_Hptr:
	{
	    TYPE_P ZIt;

	    ZRtype (&ZIt);
	    switch (CURRENT_TERMINAL) {
	      case lex_semicolon:
		break;
	      case 49:
		RESTORE_LEXER;
		goto ZL1;
	      default:
		goto ZL1;
	    }
	    ADVANCE_LEXER;
	    /* BEGINNING OF ACTION: make-extra */
	    {
#line 1066 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    UNUSED ( (ZIt) );
#line 822 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: make-extra */
	    /* BEGINNING OF INLINE: extra-list */
	    goto ZL2_extra_Hlist;
	    /* END OF INLINE: extra-list */
	}
	/*UNREACHED*/
      case 49:
	return;
      default:
	break;
    }
    return;
  ZL1:;
    SAVE_LEXER (49);
    return;
}

static void
ZRclass_Hid (CLASS_ID_P *ZOi)
{
    CLASS_ID_P ZIi;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	int ZIn;
	string ZIc;
	string ZIa;

	/* BEGINNING OF INLINE: 157 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_colon:
		{
		    ADVANCE_LEXER;
		    /* BEGINNING OF ACTION: two */
		    {
#line 262 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"
 (ZIn) = 2; 
#line 864 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: two */
		}
		break;
	      case lex_hash:
		{
		    ADVANCE_LEXER;
		    ZR264 (&ZIn);
		    if ((CURRENT_TERMINAL) == 49) {
			RESTORE_LEXER;
			goto ZL1;
		    }
		}
		break;
	      default:
		{
		    /* BEGINNING OF ACTION: zero */
		    {
#line 260 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"
 (ZIn) = 0; 
#line 885 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: zero */
		}
		break;
	    }
	}
	/* END OF INLINE: 157 */
	switch (CURRENT_TERMINAL) {
	  case lex_identifier:
	    /* BEGINNING OF EXTRACT: identifier */
	    {
#line 222 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIc = string_copy ( token_buff );
#line 900 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF EXTRACT: identifier */
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF INLINE: 160 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_open_Hround:
		{
		    ADVANCE_LEXER;
		    switch (CURRENT_TERMINAL) {
		      case lex_identifier:
			/* BEGINNING OF EXTRACT: identifier */
			{
#line 222 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIa = string_copy ( token_buff );
#line 921 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
			}
			/* END OF EXTRACT: identifier */
			break;
		      default:
			goto ZL1;
		    }
		    ADVANCE_LEXER;
		    switch (CURRENT_TERMINAL) {
		      case lex_close_Hround:
			break;
		      default:
			goto ZL1;
		    }
		    ADVANCE_LEXER;
		}
		break;
	      default:
		{
		    /* BEGINNING OF ACTION: default-name */
		    {
#line 296 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIa) = (ZIc);
#line 945 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: default-name */
		}
		break;
	    }
	}
	/* END OF INLINE: 160 */
	/* BEGINNING OF ACTION: make-class-id */
	{
#line 308 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIi) = MAKE_ptr ( SIZE_cid );
    MAKE_cid ( (ZIc), (ZIa), (ZIn), ( string ) crt_file_name, crt_line_no, (ZIi) );
#line 959 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: make-class-id */
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOi = ZIi;
}

static void
ZRnew_Hitem_Hlist (void)
{
  ZL2_new_Hitem_Hlist:;
    switch (CURRENT_TERMINAL) {
      case lex_identifier: case lex_enum: case lex_struct:
      case lex_union: case lex_import: case lex_colon:
      case lex_hash:
	{
	    /* BEGINNING OF INLINE: 231 */
	    {
		switch (CURRENT_TERMINAL) {
		  case lex_import:
		    {
			ADVANCE_LEXER;
			ZRimport_Hitem ();
			switch (CURRENT_TERMINAL) {
			  case lex_semicolon:
			    break;
			  case 49:
			    RESTORE_LEXER;
			    goto ZL1;
			  default:
			    goto ZL1;
			}
			ADVANCE_LEXER;
		    }
		    break;
		  case lex_identifier: case lex_colon: case lex_hash:
		    {
			CLASS_ID_P ZI267;

			ZRclass_Hid (&ZI267);
			switch (CURRENT_TERMINAL) {
			  case lex_equal:
			    break;
			  case 49:
			    RESTORE_LEXER;
			    goto ZL1;
			  default:
			    goto ZL1;
			}
			ADVANCE_LEXER;
			ZR268 (&ZI267);
			if ((CURRENT_TERMINAL) == 49) {
			    RESTORE_LEXER;
			    goto ZL1;
			}
		    }
		    break;
		  case lex_enum:
		    {
			ENUM_P_LIST ZIe;

			ZRenum_Hsingle (&ZIe);
			if ((CURRENT_TERMINAL) == 49) {
			    RESTORE_LEXER;
			    goto ZL1;
			}
			/* BEGINNING OF ACTION: add-enum */
			{
#line 1150 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    algebra->enumerations = APPEND_list ( algebra->enumerations, (ZIe) );
#line 1035 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
			}
			/* END OF ACTION: add-enum */
		    }
		    break;
		  case lex_struct:
		    {
			STRUCTURE_P_LIST ZIs;

			ZRstructure_Hsingle (&ZIs);
			if ((CURRENT_TERMINAL) == 49) {
			    RESTORE_LEXER;
			    goto ZL1;
			}
			/* BEGINNING OF ACTION: add-structure */
			{
#line 1161 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    algebra->structures = APPEND_list ( algebra->structures, (ZIs) );
#line 1054 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
			}
			/* END OF ACTION: add-structure */
		    }
		    break;
		  case lex_union:
		    {
			UNION_P_LIST ZIu;

			ZRunion_Hsingle (&ZIu);
			if ((CURRENT_TERMINAL) == 49) {
			    RESTORE_LEXER;
			    goto ZL1;
			}
			/* BEGINNING OF ACTION: add-union */
			{
#line 1172 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    algebra->unions = APPEND_list ( algebra->unions, (ZIu) );
#line 1073 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
			}
			/* END OF ACTION: add-union */
		    }
		    break;
		  default:
		    goto ZL1;
		}
	    }
	    /* END OF INLINE: 231 */
	    /* BEGINNING OF INLINE: new-item-list */
	    goto ZL2_new_Hitem_Hlist;
	    /* END OF INLINE: new-item-list */
	}
	/*UNREACHED*/
      case 49:
	return;
      default:
	break;
    }
    return;
  ZL1:;
    SAVE_LEXER (49);
    return;
}

void
extra_calculus (void)
{
    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	ZRextra_Hlist ();
	switch (CURRENT_TERMINAL) {
	  case lex_eof:
	    break;
	  case 49:
	    RESTORE_LEXER;
	    goto ZL1;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
    }
    return;
  ZL1:;
    {
	/* BEGINNING OF ACTION: syntax-error */
	{
#line 283 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    MSG_syntax_error ();
#line 1126 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: syntax-error */
    }
}

static void
ZRunion_Hlist (UNION_P_LIST *ZOp)
{
    UNION_P_LIST ZIp;

    switch (CURRENT_TERMINAL) {
      case lex_identifier: case lex_colon: case lex_hash:
	{
	    CLASS_ID_P ZIi;
	    UNION_P ZIq;
	    UNION_P_LIST ZIr;

	    ZRclass_Hid (&ZIi);
	    ZRunion_Hdefn_Hold (ZIi, &ZIq);
	    ZRunion_Hlist (&ZIr);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: join-union */
	    {
#line 1054 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    CONS_ptr ( (ZIq), (ZIr), (ZIp) );
#line 1156 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: join-union */
	}
	break;
      default:
	{
	    /* BEGINNING OF ACTION: null-union */
	    {
#line 971 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIp) = NULL_list ( UNION_P );
#line 1168 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: null-union */
	}
	break;
      case 49:
	return;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRshift_Hexp (number *ZO253)
{
    number ZI253;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	number ZIn;

	ZRadd_Hexp (&ZIn);
	ZR254 (ZIn, &ZI253);
	if ((CURRENT_TERMINAL) == 49) {
	    RESTORE_LEXER;
	    goto ZL1;
	}
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZO253 = ZI253;
}

static void
ZRcomponent_Hdecl (TYPE_P ZIt, COMPONENT_P_LIST *ZOp)
{
    COMPONENT_P_LIST ZIp;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	string ZIi;
	string ZIv;
	COMPONENT_P ZIq;
	COMPONENT_P_LIST ZIr;

	switch (CURRENT_TERMINAL) {
	  case lex_identifier:
	    /* BEGINNING OF EXTRACT: identifier */
	    {
#line 222 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIi = string_copy ( token_buff );
#line 1231 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF EXTRACT: identifier */
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF INLINE: 196 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_equal:
		{
		    ADVANCE_LEXER;
		    switch (CURRENT_TERMINAL) {
		      case lex_string:
			/* BEGINNING OF EXTRACT: string */
			{
#line 246 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIv = string_copy ( token_buff );
#line 1252 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
			}
			/* END OF EXTRACT: string */
			break;
		      default:
			goto ZL1;
		    }
		    ADVANCE_LEXER;
		}
		break;
	      default:
		{
		    /* BEGINNING OF ACTION: null-string */
		    {
#line 272 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIv) = NULL;
#line 1269 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: null-string */
		}
		break;
	    }
	}
	/* END OF INLINE: 196 */
	/* BEGINNING OF ACTION: make-component */
	{
#line 722 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIq) = MAKE_ptr ( SIZE_cmp );
    MAKE_cmp ( (ZIi), (ZIt), (ZIv), (ZIq) );
#line 1283 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: make-component */
	/* BEGINNING OF INLINE: 198 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_comma:
		{
		    ADVANCE_LEXER;
		    ZRcomponent_Hdecl (ZIt, &ZIr);
		    if ((CURRENT_TERMINAL) == 49) {
			RESTORE_LEXER;
			goto ZL1;
		    }
		}
		break;
	      default:
		{
		    /* BEGINNING OF ACTION: null-component */
		    {
#line 710 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIr) = NULL_list ( COMPONENT_P );
#line 1306 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: null-component */
		}
		break;
	    }
	}
	/* END OF INLINE: 198 */
	/* BEGINNING OF ACTION: join-component */
	{
#line 735 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    CONS_ptr ( (ZIq), (ZIr), (ZIp) );
#line 1319 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: join-component */
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRadd_Hexp (number *ZO257)
{
    number ZI257;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	number ZIn;

	ZRmult_Hexp (&ZIn);
	ZR258 (ZIn, &ZI257);
	if ((CURRENT_TERMINAL) == 49) {
	    RESTORE_LEXER;
	    goto ZL1;
	}
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZO257 = ZI257;
}

static void
ZRstructure_Hsingle (STRUCTURE_P_LIST *ZOp)
{
    STRUCTURE_P_LIST ZIp;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	CLASS_ID_P ZIi;
	string ZIj;
	STRUCTURE_P ZIq;
	STRUCTURE_P_LIST ZIr;

	switch (CURRENT_TERMINAL) {
	  case lex_struct:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	ZRclass_Hid (&ZIi);
	switch (CURRENT_TERMINAL) {
	  case lex_equal:
	    break;
	  case 49:
	    RESTORE_LEXER;
	    goto ZL1;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	ZR209 (&ZIj);
	ZRstructure_Hdefn (ZIi, ZIj, &ZIq);
	if ((CURRENT_TERMINAL) == 49) {
	    RESTORE_LEXER;
	    goto ZL1;
	}
	/* BEGINNING OF ACTION: null-structure */
	{
#line 758 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIr) = NULL_list ( STRUCTURE_P );
#line 1400 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: null-structure */
	/* BEGINNING OF ACTION: join-structure */
	{
#line 801 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    CONS_ptr ( (ZIq), (ZIr), (ZIp) );
#line 1408 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: join-structure */
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRmap_Hlist (MAP_P_LIST *ZOp)
{
    MAP_P_LIST ZIp;

    switch (CURRENT_TERMINAL) {
      case lex_identifier: case lex_string: case lex_list:
      case lex_ptr: case lex_stack: case lex_vec:
      case lex_vec_Hptr:
	{
	    TYPE_P ZIt;
	    int ZIn;
	    string ZIi;
	    ARGUMENT_P_LIST ZIa;
	    MAP_P ZIq;
	    MAP_P_LIST ZIr;

	    ZRextended_Htype (&ZIt);
	    /* BEGINNING OF INLINE: 216 */
	    {
		switch (CURRENT_TERMINAL) {
		  case lex_hash:
		    {
			ADVANCE_LEXER;
			/* BEGINNING OF ACTION: one */
			{
#line 261 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"
 (ZIn) = 1; 
#line 1448 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
			}
			/* END OF ACTION: one */
		    }
		    break;
		  default:
		    {
			/* BEGINNING OF ACTION: zero */
			{
#line 260 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"
 (ZIn) = 0; 
#line 1459 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
			}
			/* END OF ACTION: zero */
		    }
		    break;
		  case 49:
		    RESTORE_LEXER;
		    goto ZL1;
		}
	    }
	    /* END OF INLINE: 216 */
	    switch (CURRENT_TERMINAL) {
	      case lex_identifier:
		/* BEGINNING OF EXTRACT: identifier */
		{
#line 222 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIi = string_copy ( token_buff );
#line 1477 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		}
		/* END OF EXTRACT: identifier */
		break;
	      default:
		goto ZL1;
	    }
	    ADVANCE_LEXER;
	    switch (CURRENT_TERMINAL) {
	      case lex_open_Hround:
		break;
	      default:
		goto ZL1;
	    }
	    ADVANCE_LEXER;
	    /* BEGINNING OF INLINE: 217 */
	    {
		switch (CURRENT_TERMINAL) {
		  case lex_identifier: case lex_string: case lex_list:
		  case lex_ptr: case lex_stack: case lex_vec:
		  case lex_vec_Hptr:
		    {
			ZRargument_Hlist (&ZIa);
			if ((CURRENT_TERMINAL) == 49) {
			    RESTORE_LEXER;
			    goto ZL1;
			}
		    }
		    break;
		  default:
		    {
			/* BEGINNING OF ACTION: null-argument */
			{
#line 889 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIa) = NULL_list ( ARGUMENT_P );
#line 1513 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
			}
			/* END OF ACTION: null-argument */
		    }
		    break;
		}
	    }
	    /* END OF INLINE: 217 */
	    switch (CURRENT_TERMINAL) {
	      case lex_close_Hround:
		break;
	      default:
		goto ZL1;
	    }
	    ADVANCE_LEXER;
	    /* BEGINNING OF ACTION: make-map */
	    {
#line 948 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIq) = MAKE_ptr ( SIZE_map );
    MAKE_map ( (ZIi), (ZIn), (ZIt), (ZIa), (ZIq) );
#line 1534 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: make-map */
	    ZRmap_Hlist (&ZIr);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: join-map */
	    {
#line 960 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    CONS_ptr ( (ZIq), (ZIr), (ZIp) );
#line 1547 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: join-map */
	}
	break;
      default:
	{
	    /* BEGINNING OF ACTION: null-map */
	    {
#line 936 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIp) = NULL_list ( MAP_P );
#line 1559 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: null-map */
	}
	break;
      case 49:
	return;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRprimitive_Hdefn (CLASS_ID_P ZIi, PRIMITIVE_P *ZOp)
{
    PRIMITIVE_P ZIp;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	string ZIs;

	switch (CURRENT_TERMINAL) {
	  case lex_string:
	    /* BEGINNING OF EXTRACT: string */
	    {
#line 246 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIs = string_copy ( token_buff );
#line 1593 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF EXTRACT: string */
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	switch (CURRENT_TERMINAL) {
	  case lex_semicolon:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF ACTION: make-primitive */
	{
#line 570 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    TYPE r;
    TYPE_P t;
    (ZIp) = MAKE_ptr ( SIZE_prim );
    MAKE_prim ( (ZIi), (ZIs), (ZIp) );
    t = MAKE_ptr ( SIZE_type );
    MAKE_type_primitive ( 0, (ZIp), r );
    COPY_type ( t, r );
    IGNORE register_type ( t );
#line 1620 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: make-primitive */
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRunary_Hexp (number *ZOn)
{
    number ZIn;

    switch (CURRENT_TERMINAL) {
      case lex_compl:
	{
	    number ZIm;

	    ADVANCE_LEXER;
	    switch (CURRENT_TERMINAL) {
	      case lex_number:
		/* BEGINNING OF EXTRACT: number */
		{
#line 234 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIm = token_value;
#line 1650 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		}
		/* END OF EXTRACT: number */
		break;
	      default:
		goto ZL1;
	    }
	    ADVANCE_LEXER;
	    /* BEGINNING OF ACTION: exp-compl */
	    {
#line 449 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIn) = ~(ZIm);
#line 1663 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: exp-compl */
	}
	break;
      case lex_minus:
	{
	    number ZIm;

	    ADVANCE_LEXER;
	    switch (CURRENT_TERMINAL) {
	      case lex_number:
		/* BEGINNING OF EXTRACT: number */
		{
#line 234 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIm = token_value;
#line 1680 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		}
		/* END OF EXTRACT: number */
		break;
	      default:
		goto ZL1;
	    }
	    ADVANCE_LEXER;
	    /* BEGINNING OF ACTION: exp-neg */
	    {
#line 445 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIn) = -(ZIm);
#line 1693 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: exp-neg */
	}
	break;
      case lex_plus:
	{
	    ADVANCE_LEXER;
	    switch (CURRENT_TERMINAL) {
	      case lex_number:
		/* BEGINNING OF EXTRACT: number */
		{
#line 234 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIn = token_value;
#line 1708 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		}
		/* END OF EXTRACT: number */
		break;
	      default:
		goto ZL1;
	    }
	    ADVANCE_LEXER;
	}
	break;
      case lex_identifier: case lex_number: case lex_open_Hround:
      case lex_question:
	{
	    ZRprimary_Hexp (&ZIn);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	}
	break;
      case 49:
	return;
      default:
	goto ZL1;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOn = ZIn;
}

static void
ZRand_Hexp (number *ZO249)
{
    number ZI249;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	number ZIn;

	ZRshift_Hexp (&ZIn);
	ZR250 (ZIn, &ZI249);
	if ((CURRENT_TERMINAL) == 49) {
	    RESTORE_LEXER;
	    goto ZL1;
	}
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZO249 = ZI249;
}

static void
ZRargument_Hdecl (TYPE_P ZIt, ARGUMENT_P_LIST *ZOp)
{
    ARGUMENT_P_LIST ZIp;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	string ZIi;
	ARGUMENT_P ZIq;
	ARGUMENT_P_LIST ZIr;

	switch (CURRENT_TERMINAL) {
	  case lex_identifier:
	    /* BEGINNING OF EXTRACT: identifier */
	    {
#line 222 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIi = string_copy ( token_buff );
#line 1787 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF EXTRACT: identifier */
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF ACTION: make-argument */
	{
#line 900 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIq) = MAKE_ptr ( SIZE_arg );
    MAKE_arg ( (ZIi), (ZIt), (ZIq) );
#line 1801 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: make-argument */
	/* BEGINNING OF INLINE: 212 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_comma:
		{
		    ADVANCE_LEXER;
		    ZRargument_Hdecl (ZIt, &ZIr);
		    if ((CURRENT_TERMINAL) == 49) {
			RESTORE_LEXER;
			goto ZL1;
		    }
		}
		break;
	      default:
		{
		    /* BEGINNING OF ACTION: null-argument */
		    {
#line 889 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIr) = NULL_list ( ARGUMENT_P );
#line 1824 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: null-argument */
		}
		break;
	    }
	}
	/* END OF INLINE: 212 */
	/* BEGINNING OF ACTION: join-argument */
	{
#line 913 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    CONS_ptr ( (ZIq), (ZIr), (ZIp) );
#line 1837 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: join-argument */
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRold_Hunit (void)
{
    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	string ZIm;
	PRIMITIVE_P_LIST ZIp;
	IDENTITY_P_LIST ZIi;
	STRUCTURE_P_LIST ZIs;
	UNION_P_LIST ZIu;

	switch (CURRENT_TERMINAL) {
	  case lex_identifier:
	    /* BEGINNING OF EXTRACT: identifier */
	    {
#line 222 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIm = string_copy ( token_buff );
#line 1869 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF EXTRACT: identifier */
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF ACTION: set-main */
	{
#line 1100 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    string nm = (ZIm);
    if ( !new_format ) MSG_old_style_algebra_syntax ();
    if ( find_algebra ( nm ) ) {
	MSG_algebra_already_defined (nm);
    }
    algebra->name = nm;
#line 1887 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: set-main */
	switch (CURRENT_TERMINAL) {
	  case lex_colon:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	switch (CURRENT_TERMINAL) {
	  case lex_primitives:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	switch (CURRENT_TERMINAL) {
	  case lex_colon:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	ZRprimitive_Hlist (&ZIp);
	if ((CURRENT_TERMINAL) == 49) {
	    RESTORE_LEXER;
	    goto ZL1;
	}
	/* BEGINNING OF ACTION: add-primitive */
	{
#line 1128 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    algebra->primitives = APPEND_list ( algebra->primitives, (ZIp) );
#line 1921 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: add-primitive */
	switch (CURRENT_TERMINAL) {
	  case lex_identities:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	switch (CURRENT_TERMINAL) {
	  case lex_colon:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	ZRidentity_Hlist (&ZIi);
	if ((CURRENT_TERMINAL) == 49) {
	    RESTORE_LEXER;
	    goto ZL1;
	}
	/* BEGINNING OF ACTION: add-identity */
	{
#line 1139 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    algebra->identities = APPEND_list ( algebra->identities, (ZIi) );
#line 1948 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: add-identity */
	switch (CURRENT_TERMINAL) {
	  case lex_structures:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	switch (CURRENT_TERMINAL) {
	  case lex_colon:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	ZRstructure_Hlist (&ZIs);
	if ((CURRENT_TERMINAL) == 49) {
	    RESTORE_LEXER;
	    goto ZL1;
	}
	/* BEGINNING OF ACTION: add-structure */
	{
#line 1161 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    algebra->structures = APPEND_list ( algebra->structures, (ZIs) );
#line 1975 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: add-structure */
	switch (CURRENT_TERMINAL) {
	  case lex_unions:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	switch (CURRENT_TERMINAL) {
	  case lex_colon:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	ZRunion_Hlist (&ZIu);
	if ((CURRENT_TERMINAL) == 49) {
	    RESTORE_LEXER;
	    goto ZL1;
	}
	/* BEGINNING OF ACTION: add-union */
	{
#line 1172 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    algebra->unions = APPEND_list ( algebra->unions, (ZIu) );
#line 2002 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: add-union */
	switch (CURRENT_TERMINAL) {
	  case lex_extras:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	switch (CURRENT_TERMINAL) {
	  case lex_colon:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	ZRextra_Hlist ();
	switch (CURRENT_TERMINAL) {
	  case lex_hash:
	    break;
	  case 49:
	    RESTORE_LEXER;
	    goto ZL1;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
    }
    return;
  ZL1:;
    SAVE_LEXER (49);
    return;
}

static void
ZRenumerator_Hlist (ECONST_P_LIST *ZOp)
{
    ECONST_P_LIST ZIp;

    switch (CURRENT_TERMINAL) {
      case lex_identifier:
	{
	    string ZIs;
	    ECONST_P ZIq;
	    ECONST_P_LIST ZIr;

	    /* BEGINNING OF EXTRACT: identifier */
	    {
#line 222 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIs = string_copy ( token_buff );
#line 2054 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF EXTRACT: identifier */
	    ADVANCE_LEXER;
	    /* BEGINNING OF INLINE: 187 */
	    {
		switch (CURRENT_TERMINAL) {
		  case lex_equal:
		    {
			number ZIn;

			ADVANCE_LEXER;
			ZRexpression (&ZIn);
			if ((CURRENT_TERMINAL) == 49) {
			    RESTORE_LEXER;
			    goto ZL1;
			}
			/* BEGINNING OF ACTION: set-econst */
			{
#line 548 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    enum_value = (ZIn);
#line 2076 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
			}
			/* END OF ACTION: set-econst */
		    }
		    break;
		  default:
		    break;
		}
	    }
	    /* END OF INLINE: 187 */
	    /* BEGINNING OF ACTION: make-econst */
	    {
#line 521 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    number v = enum_value++;
    if ( v > enum_max ) enum_max = v;
    (ZIq) = MAKE_ptr ( SIZE_ec );
    MAKE_ec ( (ZIs), v, (ZIq) );
    CONS_ptr ( (ZIq), enum_list, enum_list );
#line 2095 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: make-econst */
	    /* BEGINNING OF INLINE: 188 */
	    {
		switch (CURRENT_TERMINAL) {
		  case lex_comma:
		    {
			ADVANCE_LEXER;
			ZRenumerator_Hlist (&ZIr);
			if ((CURRENT_TERMINAL) == 49) {
			    RESTORE_LEXER;
			    goto ZL1;
			}
		    }
		    break;
		  default:
		    {
			/* BEGINNING OF ACTION: null-econst */
			{
#line 510 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIr) = NULL_list ( ECONST_P );
#line 2118 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
			}
			/* END OF ACTION: null-econst */
		    }
		    break;
		}
	    }
	    /* END OF INLINE: 188 */
	    /* BEGINNING OF ACTION: join-econst */
	    {
#line 537 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    CONS_ptr ( (ZIq), (ZIr), (ZIp) );
#line 2131 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: join-econst */
	}
	break;
      default:
	{
	    /* BEGINNING OF ACTION: null-econst */
	    {
#line 510 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIp) = NULL_list ( ECONST_P );
#line 2143 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: null-econst */
	}
	break;
      case 49:
	return;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRcomponent_Hgroup (COMPONENT_P_LIST *ZOp)
{
    COMPONENT_P_LIST ZIp;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	switch (CURRENT_TERMINAL) {
	  case lex_open_Hbrace:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	ZRcomponent_Hlist (&ZIp);
	switch (CURRENT_TERMINAL) {
	  case lex_close_Hbrace:
	    break;
	  case 49:
	    RESTORE_LEXER;
	    goto ZL1;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRnew_Hunit (void)
{
    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	string ZIm;

	switch (CURRENT_TERMINAL) {
	  case lex_algebra:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF ACTION: set-new-unit */
	{
#line 1194 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    new_format = 1;
#line 2216 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: set-new-unit */
	switch (CURRENT_TERMINAL) {
	  case lex_identifier:
	    /* BEGINNING OF EXTRACT: identifier */
	    {
#line 222 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIm = string_copy ( token_buff );
#line 2226 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF EXTRACT: identifier */
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF ACTION: set-main */
	{
#line 1100 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    string nm = (ZIm);
    if ( !new_format ) MSG_old_style_algebra_syntax ();
    if ( find_algebra ( nm ) ) {
	MSG_algebra_already_defined (nm);
    }
    algebra->name = nm;
#line 2244 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: set-main */
	/* BEGINNING OF INLINE: 233 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_open_Hround:
		{
		    number ZIa;
		    number ZIb;

		    ADVANCE_LEXER;
		    switch (CURRENT_TERMINAL) {
		      case lex_number:
			/* BEGINNING OF EXTRACT: number */
			{
#line 234 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIa = token_value;
#line 2263 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
			}
			/* END OF EXTRACT: number */
			break;
		      default:
			goto ZL1;
		    }
		    ADVANCE_LEXER;
		    switch (CURRENT_TERMINAL) {
		      case lex_dot:
			break;
		      default:
			goto ZL1;
		    }
		    ADVANCE_LEXER;
		    switch (CURRENT_TERMINAL) {
		      case lex_number:
			/* BEGINNING OF EXTRACT: number */
			{
#line 234 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIb = token_value;
#line 2285 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
			}
			/* END OF EXTRACT: number */
			break;
		      default:
			goto ZL1;
		    }
		    ADVANCE_LEXER;
		    switch (CURRENT_TERMINAL) {
		      case lex_close_Hround:
			break;
		      default:
			goto ZL1;
		    }
		    ADVANCE_LEXER;
		    /* BEGINNING OF ACTION: set-version */
		    {
#line 1116 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    algebra->major_no = ( int ) (ZIa);
    algebra->minor_no = ( int ) (ZIb);
#line 2306 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: set-version */
		}
		break;
	      default:
		break;
	    }
	}
	/* END OF INLINE: 233 */
	switch (CURRENT_TERMINAL) {
	  case lex_colon:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	ZRnew_Hitem_Hlist ();
	if ((CURRENT_TERMINAL) == 49) {
	    RESTORE_LEXER;
	    goto ZL1;
	}
    }
    return;
  ZL1:;
    SAVE_LEXER (49);
    return;
}

static void
ZRidentity_Hdefn (CLASS_ID_P ZIi, IDENTITY_P *ZOp)
{
    IDENTITY_P ZIp;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	TYPE_P ZIt;

	ZRtype (&ZIt);
	switch (CURRENT_TERMINAL) {
	  case lex_semicolon:
	    break;
	  case 49:
	    RESTORE_LEXER;
	    goto ZL1;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF ACTION: make-identity */
	{
#line 611 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    TYPE r;
    TYPE_P t;
    (ZIp) = MAKE_ptr ( SIZE_ident );
    MAKE_ident ( (ZIi), (ZIt), (ZIp) );
    t = MAKE_ptr ( SIZE_type );
    MAKE_type_ident ( 0, (ZIp), r );
    COPY_type ( t, r );
    IGNORE register_type ( t );
#line 2369 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: make-identity */
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRmult_Hexp (number *ZO261)
{
    number ZI261;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	number ZIn;

	ZRunary_Hexp (&ZIn);
	ZR262 (ZIn, &ZI261);
	if ((CURRENT_TERMINAL) == 49) {
	    RESTORE_LEXER;
	    goto ZL1;
	}
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZO261 = ZI261;
}

void
read_calculus (void)
{
    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	/* BEGINNING OF ACTION: set-old-unit */
	{
#line 1183 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    new_format = 0;
#line 2419 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: set-old-unit */
	/* BEGINNING OF INLINE: 236 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_algebra:
		{
		    ZRnew_Hunit ();
		    if ((CURRENT_TERMINAL) == 49) {
			RESTORE_LEXER;
			goto ZL1;
		    }
		}
		break;
	      case lex_identifier:
		{
		    ZRold_Hunit ();
		    if ((CURRENT_TERMINAL) == 49) {
			RESTORE_LEXER;
			goto ZL1;
		    }
		}
		break;
	      default:
		goto ZL1;
	    }
	}
	/* END OF INLINE: 236 */
	switch (CURRENT_TERMINAL) {
	  case lex_eof:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
    }
    return;
  ZL1:;
    {
	/* BEGINNING OF ACTION: syntax-error */
	{
#line 283 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    MSG_syntax_error ();
#line 2464 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: syntax-error */
    }
}

static void
ZRtype (TYPE_P *ZOt)
{
    TYPE_P ZIt;

    switch (CURRENT_TERMINAL) {
      case lex_identifier:
	{
	    string ZIi;

	    /* BEGINNING OF EXTRACT: identifier */
	    {
#line 222 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIi = string_copy ( token_buff );
#line 2485 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF EXTRACT: identifier */
	    ADVANCE_LEXER;
	    /* BEGINNING OF ACTION: find-type */
	    {
#line 331 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIt) = find_type ( algebra, (ZIi) );
#line 2494 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: find-type */
	}
	break;
      case lex_list:
	{
	    TYPE_P ZIs;

	    ADVANCE_LEXER;
	    ZRtype (&ZIs);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: list-type */
	    {
#line 353 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIt) = compound_type ( type_list_tag, (ZIs), 0 );
#line 2514 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: list-type */
	}
	break;
      case lex_ptr:
	{
	    TYPE_P ZIs;

	    ADVANCE_LEXER;
	    ZRtype (&ZIs);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: ptr-type */
	    {
#line 342 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIt) = compound_type ( type_ptr_tag, (ZIs), 0 );
#line 2534 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: ptr-type */
	}
	break;
      case lex_stack:
	{
	    TYPE_P ZIs;

	    ADVANCE_LEXER;
	    ZRtype (&ZIs);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: stack-type */
	    {
#line 364 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIt) = compound_type ( type_stack_tag, (ZIs), 0 );
#line 2554 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: stack-type */
	}
	break;
      case lex_vec:
	{
	    TYPE_P ZIs;

	    ADVANCE_LEXER;
	    ZRtype (&ZIs);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: vec-type */
	    {
#line 375 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIt) = compound_type ( type_vec_tag, (ZIs), 0 );
#line 2574 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: vec-type */
	}
	break;
      case lex_vec_Hptr:
	{
	    TYPE_P ZIs;

	    ADVANCE_LEXER;
	    ZRtype (&ZIs);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: vec-ptr-type */
	    {
#line 386 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIt) = compound_type ( type_vec_ptr_tag, (ZIs), 0 );
#line 2594 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: vec-ptr-type */
	}
	break;
      case 49:
	return;
      default:
	goto ZL1;
    }
    goto ZL0;
  ZL1:;
    {
	/* BEGINNING OF ACTION: error-type */
	{
#line 411 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    MSG_type_expected ();
    (ZIt) = find_type ( algebra, "ERROR!" );
#line 2613 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: error-type */
    }
  ZL0:;
    *ZOt = ZIt;
}

static void
ZRstructure_Hdefn (CLASS_ID_P ZIi, string ZIj, STRUCTURE_P *ZOp)
{
    STRUCTURE_P ZIp;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	COMPONENT_P_LIST ZIc;

	ZRcomponent_Hgroup (&ZIc);
	switch (CURRENT_TERMINAL) {
	  case lex_semicolon:
	    break;
	  case 49:
	    RESTORE_LEXER;
	    goto ZL1;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF ACTION: make-structure */
	{
#line 770 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    TYPE r;
    TYPE_P t;
    string nm = (ZIj);
    STRUCTURE_P str = NULL_ptr ( STRUCTURE );
    if ( nm ) {
	r = DEREF_type ( find_type ( algebra, nm ) );
	if ( IS_type_structure ( r ) ) {
	    str = DEREF_ptr ( type_structure_struc ( r ) );
	    (ZIc) = ADD_list ( DEREF_list ( str_defn ( str ) ), (ZIc),
			    SIZE_ptr ( COMPONENT ) );
	} else {
	    MSG_cant_inherit_from (nm);
	}
    }
    (ZIp) = MAKE_ptr ( SIZE_str );
    MAKE_str ( (ZIi), str, (ZIc), 0, (ZIp) );
    t = MAKE_ptr ( SIZE_type );
    MAKE_type_structure ( 0, (ZIp), r );
    COPY_type ( t, r );
    IGNORE register_type ( t );
#line 2667 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: make-structure */
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRcomponent_Hlist (COMPONENT_P_LIST *ZOp)
{
    COMPONENT_P_LIST ZIp;

    switch (CURRENT_TERMINAL) {
      case lex_identifier: case lex_list: case lex_ptr:
      case lex_stack: case lex_vec: case lex_vec_Hptr:
	{
	    TYPE_P ZIt;
	    COMPONENT_P_LIST ZIq;
	    COMPONENT_P_LIST ZIr;

	    ZRtype (&ZIt);
	    ZRcomponent_Hdecl (ZIt, &ZIq);
	    switch (CURRENT_TERMINAL) {
	      case lex_semicolon:
		break;
	      case 49:
		RESTORE_LEXER;
		goto ZL1;
	      default:
		goto ZL1;
	    }
	    ADVANCE_LEXER;
	    ZRcomponent_Hlist (&ZIr);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: link-component */
	    {
#line 747 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIp) = APPEND_list ( (ZIq), (ZIr) );
#line 2714 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: link-component */
	}
	break;
      default:
	{
	    /* BEGINNING OF ACTION: null-component */
	    {
#line 710 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIp) = NULL_list ( COMPONENT_P );
#line 2726 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: null-component */
	}
	break;
      case 49:
	return;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRextended_Htype (TYPE_P *ZOt)
{
    TYPE_P ZIt;

    switch (CURRENT_TERMINAL) {
      case lex_string:
	{
	    string ZIs;

	    /* BEGINNING OF EXTRACT: string */
	    {
#line 246 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIs = string_copy ( token_buff );
#line 2757 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF EXTRACT: string */
	    ADVANCE_LEXER;
	    /* BEGINNING OF ACTION: quoted-type */
	    {
#line 397 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    TYPE r;
    (ZIt) = MAKE_ptr ( SIZE_type );
    MAKE_type_quote ( 0, (ZIs), r );
    COPY_type ( (ZIt), r );
#line 2769 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: quoted-type */
	}
	break;
      case lex_identifier: case lex_list: case lex_ptr:
      case lex_stack: case lex_vec: case lex_vec_Hptr:
	{
	    ZRtype (&ZIt);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	}
	break;
      case 49:
	return;
      default:
	goto ZL1;
    }
    goto ZL0;
  ZL1:;
    {
	/* BEGINNING OF ACTION: error-type */
	{
#line 411 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    MSG_type_expected ();
    (ZIt) = find_type ( algebra, "ERROR!" );
#line 2798 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: error-type */
    }
  ZL0:;
    *ZOt = ZIt;
}

static void
ZRprimitive_Hlist (PRIMITIVE_P_LIST *ZOp)
{
    PRIMITIVE_P_LIST ZIp;

    switch (CURRENT_TERMINAL) {
      case lex_identifier: case lex_colon: case lex_hash:
	{
	    CLASS_ID_P ZIi;
	    PRIMITIVE_P ZIq;
	    PRIMITIVE_P_LIST ZIr;

	    ZRclass_Hid (&ZIi);
	    switch (CURRENT_TERMINAL) {
	      case lex_colon:
		break;
	      case 49:
		RESTORE_LEXER;
		goto ZL1;
	      default:
		goto ZL1;
	    }
	    ADVANCE_LEXER;
	    ZRprimitive_Hdefn (ZIi, &ZIq);
	    ZRprimitive_Hlist (&ZIr);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: join-primitive */
	    {
#line 589 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    CONS_ptr ( (ZIq), (ZIr), (ZIp) );
#line 2840 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: join-primitive */
	}
	break;
      default:
	{
	    /* BEGINNING OF ACTION: null-primitive */
	    {
#line 559 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIp) = NULL_list ( PRIMITIVE_P );
#line 2852 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: null-primitive */
	}
	break;
      case 49:
	return;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZR209 (string *ZOj)
{
    string ZIj;

    switch (CURRENT_TERMINAL) {
      case lex_identifier:
	{
	    /* BEGINNING OF EXTRACT: identifier */
	    {
#line 222 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIj = string_copy ( token_buff );
#line 2881 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF EXTRACT: identifier */
	    ADVANCE_LEXER;
	    switch (CURRENT_TERMINAL) {
	      case lex_plus:
		break;
	      default:
		goto ZL1;
	    }
	    ADVANCE_LEXER;
	}
	break;
      default:
	{
	    /* BEGINNING OF ACTION: null-identifier */
	    {
#line 320 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIj) = NULL;
#line 2901 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: null-identifier */
	}
	break;
      case 49:
	return;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOj = ZIj;
}

static void
ZRargument_Hlist (ARGUMENT_P_LIST *ZOp)
{
    ARGUMENT_P_LIST ZIp;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	TYPE_P ZIt;
	ARGUMENT_P_LIST ZIq;
	ARGUMENT_P_LIST ZIr;

	ZRextended_Htype (&ZIt);
	ZRargument_Hdecl (ZIt, &ZIq);
	/* BEGINNING OF INLINE: 214 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_semicolon:
		{
		    ADVANCE_LEXER;
		    ZRargument_Hlist (&ZIr);
		    if ((CURRENT_TERMINAL) == 49) {
			RESTORE_LEXER;
			goto ZL1;
		    }
		}
		break;
	      default:
		{
		    /* BEGINNING OF ACTION: null-argument */
		    {
#line 889 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIr) = NULL_list ( ARGUMENT_P );
#line 2952 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: null-argument */
		}
		break;
	      case 49:
		RESTORE_LEXER;
		goto ZL1;
	    }
	}
	/* END OF INLINE: 214 */
	/* BEGINNING OF ACTION: link-argument */
	{
#line 925 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIp) = APPEND_list ( (ZIq), (ZIr) );
#line 2968 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: link-argument */
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRexpression (number *ZOn)
{
    number ZIn;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	ZRor_Hexp (&ZIn);
	if ((CURRENT_TERMINAL) == 49) {
	    RESTORE_LEXER;
	    goto ZL1;
	}
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOn = ZIn;
}

static void
ZRxor_Hexp (number *ZO245)
{
    number ZI245;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	number ZIn;

	ZRand_Hexp (&ZIn);
	ZR246 (ZIn, &ZI245);
	if ((CURRENT_TERMINAL) == 49) {
	    RESTORE_LEXER;
	    goto ZL1;
	}
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZO245 = ZI245;
}

static void
ZRidentity_Hlist (IDENTITY_P_LIST *ZOp)
{
    IDENTITY_P_LIST ZIp;

    switch (CURRENT_TERMINAL) {
      case lex_identifier: case lex_colon: case lex_hash:
	{
	    CLASS_ID_P ZIi;
	    IDENTITY_P ZIq;
	    IDENTITY_P_LIST ZIr;

	    ZRclass_Hid (&ZIi);
	    switch (CURRENT_TERMINAL) {
	      case lex_colon:
		break;
	      case 49:
		RESTORE_LEXER;
		goto ZL1;
	      default:
		goto ZL1;
	    }
	    ADVANCE_LEXER;
	    ZRidentity_Hdefn (ZIi, &ZIq);
	    ZRidentity_Hlist (&ZIr);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: join-identity */
	    {
#line 630 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    CONS_ptr ( (ZIq), (ZIr), (ZIp) );
#line 3063 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: join-identity */
	}
	break;
      default:
	{
	    /* BEGINNING OF ACTION: null-identity */
	    {
#line 600 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIp) = NULL_list ( IDENTITY_P );
#line 3075 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: null-identity */
	}
	break;
      case 49:
	return;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRor_Hexp (number *ZO241)
{
    number ZI241;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	number ZIn;

	ZRxor_Hexp (&ZIn);
	ZR242 (ZIn, &ZI241);
	if ((CURRENT_TERMINAL) == 49) {
	    RESTORE_LEXER;
	    goto ZL1;
	}
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZO241 = ZI241;
}

static void
ZRunion_Hsingle (UNION_P_LIST *ZOp)
{
    UNION_P_LIST ZIp;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	CLASS_ID_P ZIi;
	UNION_P ZIq;
	UNION_P_LIST ZIr;

	switch (CURRENT_TERMINAL) {
	  case lex_union:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	ZRclass_Hid (&ZIi);
	ZRunion_Hdefn_Hnew (ZIi, &ZIq);
	if ((CURRENT_TERMINAL) == 49) {
	    RESTORE_LEXER;
	    goto ZL1;
	}
	/* BEGINNING OF ACTION: null-union */
	{
#line 971 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIr) = NULL_list ( UNION_P );
#line 3148 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: null-union */
	/* BEGINNING OF ACTION: join-union */
	{
#line 1054 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    CONS_ptr ( (ZIq), (ZIr), (ZIp) );
#line 3156 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: join-union */
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRstructure_Hlist (STRUCTURE_P_LIST *ZOp)
{
    STRUCTURE_P_LIST ZIp;

    switch (CURRENT_TERMINAL) {
      case lex_identifier: case lex_colon: case lex_hash:
	{
	    CLASS_ID_P ZIi;
	    string ZIj;
	    STRUCTURE_P ZIq;
	    STRUCTURE_P_LIST ZIr;

	    ZRclass_Hid (&ZIi);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: null-identifier */
	    {
#line 320 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIj) = NULL;
#line 3191 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: null-identifier */
	    ZRstructure_Hdefn (ZIi, ZIj, &ZIq);
	    ZRstructure_Hlist (&ZIr);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: join-structure */
	    {
#line 801 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    CONS_ptr ( (ZIq), (ZIr), (ZIp) );
#line 3205 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: join-structure */
	}
	break;
      default:
	{
	    /* BEGINNING OF ACTION: null-structure */
	    {
#line 758 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIp) = NULL_list ( STRUCTURE_P );
#line 3217 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: null-structure */
	}
	break;
      case 49:
	return;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRunion_Hdefn_Hold (CLASS_ID_P ZIi, UNION_P *ZOp)
{
    UNION_P ZIp;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	COMPONENT_P_LIST ZIc;
	FIELD_P_LIST ZIf;
	MAP_P_LIST ZIm;
	string ZIj;

	/* BEGINNING OF INLINE: 219 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_open_Hbrace:
		{
		    ZRcomponent_Hgroup (&ZIc);
		    if ((CURRENT_TERMINAL) == 49) {
			RESTORE_LEXER;
			goto ZL1;
		    }
		}
		break;
	      default:
		{
		    /* BEGINNING OF ACTION: null-component */
		    {
#line 710 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIc) = NULL_list ( COMPONENT_P );
#line 3266 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: null-component */
		}
		break;
	    }
	}
	/* END OF INLINE: 219 */
	/* BEGINNING OF INLINE: 220 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_identifier: case lex_hash:
		{
		    ZRfield_Hlist (&ZIf);
		    if ((CURRENT_TERMINAL) == 49) {
			RESTORE_LEXER;
			goto ZL1;
		    }
		}
		break;
	      default:
		{
		    /* BEGINNING OF ACTION: null-field */
		    {
#line 812 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIf) = NULL_list ( FIELD_P );
#line 3293 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: null-field */
		}
		break;
	    }
	}
	/* END OF INLINE: 220 */
	switch (CURRENT_TERMINAL) {
	  case lex_with:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	switch (CURRENT_TERMINAL) {
	  case lex_maps:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	switch (CURRENT_TERMINAL) {
	  case lex_open_Hsquare:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	ZRmap_Hlist (&ZIm);
	switch (CURRENT_TERMINAL) {
	  case lex_close_Hsquare:
	    break;
	  case 49:
	    RESTORE_LEXER;
	    goto ZL1;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF ACTION: null-identifier */
	{
#line 320 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIj) = NULL;
#line 3338 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: null-identifier */
	/* BEGINNING OF ACTION: make-union */
	{
#line 983 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    TYPE r;
    TYPE_P t;
    int tag = 0;
    string nm = (ZIj);
    FIELD_P_LIST p = (ZIf);
    UNION_P un = NULL_ptr ( UNION );

    /* Deal with overall inheritance */
    if ( nm ) {
	r = DEREF_type ( find_type ( algebra, nm ) );
	if ( IS_type_onion ( r ) ) {
	    un = DEREF_ptr ( type_onion_un ( r ) );
	    (ZIc) = ADD_list ( DEREF_list ( un_s_defn ( un ) ), (ZIc),
			    SIZE_ptr ( COMPONENT ) );
	    (ZIf) = ADD_list ( DEREF_list ( un_u_defn ( un ) ), p,
			    SIZE_ptr ( FIELD ) );
	    (ZIm) = ADD_list ( DEREF_list ( un_map ( un ) ), (ZIm),
			    SIZE_ptr ( MAP ) );
	    tag = DEREF_int ( un_no_fields ( un ) );
	    no_fields += tag;
	} else {
	    MSG_cant_inherit_from (nm);
	}
    }

    /* Deal with inheritance of fields and field tags */
    while ( !IS_NULL_list ( p ) ) {
	FIELD_P q = DEREF_ptr ( HEAD_list ( p ) );
	FIELD_P b = DEREF_ptr ( fld_base ( q ) );
	if ( !IS_NULL_ptr ( b ) ) {
	    int ok = 0;
	    FIELD_P_LIST pp = (ZIf);
	    string n = DEREF_string ( fld_name ( b ) );
	    while ( !IS_NULL_list ( pp ) ) {
		FIELD_P qq = DEREF_ptr ( HEAD_list ( pp ) );
		string nn = DEREF_string ( fld_name ( qq ) );
		if ( streq ( n, nn ) ) {
		    COMPONENT_P_LIST cc = DEREF_list ( fld_defn ( qq ) );
		    COMPONENT_P_LIST c = DEREF_list ( fld_defn ( q ) );
		    c = ADD_list ( cc, c, SIZE_ptr ( COMPONENT ) );
		    COPY_list ( fld_defn ( q ), c );
		    COPY_ptr ( fld_base ( q ), qq );
		    ok = 1;
		    break;
		}
		pp = TAIL_list ( pp );
	    }
	    if ( !ok ) MSG_cant_find_field (n);
	}
	COPY_int ( fld_tag ( q ), tag++ );
	p = TAIL_list ( p );
    }

    /* Construct output */
    (ZIp) = MAKE_ptr ( SIZE_un );
    MAKE_un ( (ZIi), un, (ZIc), (ZIf), (ZIm), no_fields, (ZIp) );
    no_fields = 0;
    t = MAKE_ptr ( SIZE_type );
    MAKE_type_onion ( 0, (ZIp), r );
    COPY_type ( t, r );
    IGNORE register_type ( t );
#line 3406 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: make-union */
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRenum_Hsingle (ENUM_P_LIST *ZOp)
{
    ENUM_P_LIST ZIp;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	int ZIl;
	CLASS_ID_P ZIi;
	ECONST_P_LIST ZIf;
	ECONST_P_LIST ZIe;
	ENUM_P ZIq;
	ENUM_P_LIST ZIr;

	switch (CURRENT_TERMINAL) {
	  case lex_enum:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF INLINE: 190 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_exclaim:
		{
		    ADVANCE_LEXER;
		    /* BEGINNING OF ACTION: zero */
		    {
#line 260 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"
 (ZIl) = 0; 
#line 3451 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: zero */
		}
		break;
	      default:
		{
		    /* BEGINNING OF ACTION: one */
		    {
#line 261 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"
 (ZIl) = 1; 
#line 3462 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: one */
		}
		break;
	    }
	}
	/* END OF INLINE: 190 */
	ZRclass_Hid (&ZIi);
	switch (CURRENT_TERMINAL) {
	  case lex_equal:
	    break;
	  case 49:
	    RESTORE_LEXER;
	    goto ZL1;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF INLINE: 192 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_identifier:
		{
		    string ZIj;

		    /* BEGINNING OF EXTRACT: identifier */
		    {
#line 222 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIj = string_copy ( token_buff );
#line 3493 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF EXTRACT: identifier */
		    ADVANCE_LEXER;
		    /* BEGINNING OF ACTION: get-enum */
		    {
#line 653 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    string nm = (ZIj);
    TYPE r = DEREF_type ( find_type ( algebra, nm ) );
    if ( IS_type_enumeration ( r ) ) {
	ENUM_P en = DEREF_ptr ( type_enumeration_en ( r ) );
	(ZIf) = DEREF_list ( en_consts ( en ) );
	enum_value = DEREF_number ( en_order ( en ) );
	enum_max = enum_value;
    } else {
	MSG_cant_inherit_from (nm);
	(ZIf) = NULL_list ( ECONST_P );
    }
#line 3512 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: get-enum */
		    switch (CURRENT_TERMINAL) {
		      case lex_plus:
			break;
		      default:
			goto ZL1;
		    }
		    ADVANCE_LEXER;
		}
		break;
	      default:
		{
		    /* BEGINNING OF ACTION: null-econst */
		    {
#line 510 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIf) = NULL_list ( ECONST_P );
#line 3531 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: null-econst */
		}
		break;
	    }
	}
	/* END OF INLINE: 192 */
	switch (CURRENT_TERMINAL) {
	  case lex_open_Hbrace:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	ZRenumerator_Hlist (&ZIe);
	switch (CURRENT_TERMINAL) {
	  case lex_close_Hbrace:
	    break;
	  case 49:
	    RESTORE_LEXER;
	    goto ZL1;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	switch (CURRENT_TERMINAL) {
	  case lex_semicolon:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF ACTION: make-enum */
	{
#line 675 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    TYPE r;
    TYPE_P t;
    (ZIe) = ADD_list ( (ZIf), (ZIe), SIZE_ptr ( ECONST ) );
    (ZIq) = MAKE_ptr ( SIZE_en );
    MAKE_en ( (ZIi), (ZIe), enum_max + 1, (ZIl), (ZIq) );
    enum_value = 0;
    enum_max = 0;
    DESTROY_list ( enum_list, SIZE_ptr ( ECONST ) );
    enum_list = NULL_list ( ECONST_P );
    t = MAKE_ptr ( SIZE_type );
    MAKE_type_enumeration ( 0, (ZIq), r );
    COPY_type ( t, r );
    IGNORE register_type ( t );
#line 3581 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: make-enum */
	/* BEGINNING OF ACTION: null-enum */
	{
#line 641 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIr) = NULL_list ( ENUM_P );
#line 3589 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: null-enum */
	/* BEGINNING OF ACTION: join-enum */
	{
#line 699 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    CONS_ptr ( (ZIq), (ZIr), (ZIp) );
#line 3597 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: join-enum */
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRfield_Hid_Hlist (int ZIn, FIELD_P_LIST *ZOp)
{
    FIELD_P_LIST ZIp;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	string ZIi;
	COMPONENT_P_LIST ZIc;
	FIELD_P ZIq;
	FIELD_P_LIST ZIr;

	switch (CURRENT_TERMINAL) {
	  case lex_identifier:
	    /* BEGINNING OF EXTRACT: identifier */
	    {
#line 222 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIi = string_copy ( token_buff );
#line 3630 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF EXTRACT: identifier */
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF ACTION: null-component */
	{
#line 710 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIc) = NULL_list ( COMPONENT_P );
#line 3643 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: null-component */
	/* BEGINNING OF ACTION: make-field */
	{
#line 824 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIq) = MAKE_ptr ( SIZE_fld );
    MAKE_fld ( (ZIi), 0, (ZIn), 0, NULL_ptr ( FIELD ),  (ZIc), (ZIq) );
    no_fields++;
#line 3653 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: make-field */
	/* BEGINNING OF INLINE: 206 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_comma:
		{
		    ADVANCE_LEXER;
		    ZRfield_Hid_Hlist (ZIn, &ZIr);
		    if ((CURRENT_TERMINAL) == 49) {
			RESTORE_LEXER;
			goto ZL1;
		    }
		}
		break;
	      default:
		{
		    /* BEGINNING OF ACTION: null-field */
		    {
#line 812 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIr) = NULL_list ( FIELD_P );
#line 3676 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: null-field */
		}
		break;
	    }
	}
	/* END OF INLINE: 206 */
	/* BEGINNING OF ACTION: join-field */
	{
#line 837 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    CONS_ptr ( (ZIq), (ZIr), (ZIp) );
#line 3689 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: join-field */
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZR242 (number ZI240, number *ZO241)
{
    number ZI241;

  ZL2_242:;
    switch (CURRENT_TERMINAL) {
      case lex_or:
	{
	    number ZIp;
	    number ZIn;

	    ADVANCE_LEXER;
	    ZRxor_Hexp (&ZIp);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: exp-or */
	    {
#line 499 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIn) = (ZI240) | (ZIp);
#line 3724 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: exp-or */
	    /* BEGINNING OF INLINE: 242 */
	    ZI240 = ZIn;
	    goto ZL2_242;
	    /* END OF INLINE: 242 */
	}
	/*UNREACHED*/
      default:
	{
	    ZI241 = ZI240;
	}
	break;
      case 49:
	return;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZO241 = ZI241;
}

static void
ZRfield_Hlist (FIELD_P_LIST *ZOp)
{
    FIELD_P_LIST ZIp;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	int ZIn;
	FIELD_P_LIST ZIq;
	string ZIj;
	COMPONENT_P_LIST ZIc;
	FIELD_P_LIST ZIr;

	/* BEGINNING OF INLINE: 208 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_hash:
		{
		    ADVANCE_LEXER;
		    ZR265 (&ZIn);
		    if ((CURRENT_TERMINAL) == 49) {
			RESTORE_LEXER;
			goto ZL1;
		    }
		}
		break;
	      default:
		{
		    /* BEGINNING OF ACTION: zero */
		    {
#line 260 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"
 (ZIn) = 0; 
#line 3783 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: zero */
		}
		break;
	    }
	}
	/* END OF INLINE: 208 */
	ZRfield_Hid_Hlist (ZIn, &ZIq);
	switch (CURRENT_TERMINAL) {
	  case lex_arrow:
	    break;
	  case 49:
	    RESTORE_LEXER;
	    goto ZL1;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	ZR209 (&ZIj);
	ZRcomponent_Hgroup (&ZIc);
	if ((CURRENT_TERMINAL) == 49) {
	    RESTORE_LEXER;
	    goto ZL1;
	}
	/* BEGINNING OF ACTION: set-field-cmp */
	{
#line 860 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    int n = 0;
    FIELD_P_LIST p = (ZIq);
    FIELD_P b = NULL_ptr ( FIELD );
    if ( (ZIj) ) {
	b = MAKE_ptr ( SIZE_fld );
	MAKE_fld ( (ZIj), 0, 0, 0, NULL_ptr ( FIELD ),
		   NULL_list ( COMPONENT_P ), b );
    }
    while ( !IS_NULL_list ( p ) ) {
	FIELD_P q = DEREF_ptr ( HEAD_list ( p ) );
	COPY_ptr ( fld_base ( q ), b );
	COPY_list ( fld_defn ( q ), (ZIc) );
	p = TAIL_list ( p );
	n++;
    }
    if ( n >= 2 ) {
	FIELD_P q = DEREF_ptr ( HEAD_list ( (ZIq) ) );
	COPY_int ( fld_set ( q ), n );
    }
#line 3831 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: set-field-cmp */
	/* BEGINNING OF INLINE: 210 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_comma:
		{
		    ADVANCE_LEXER;
		    ZRfield_Hlist (&ZIr);
		    if ((CURRENT_TERMINAL) == 49) {
			RESTORE_LEXER;
			goto ZL1;
		    }
		}
		break;
	      default:
		{
		    /* BEGINNING OF ACTION: null-field */
		    {
#line 812 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIr) = NULL_list ( FIELD_P );
#line 3854 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: null-field */
		}
		break;
	    }
	}
	/* END OF INLINE: 210 */
	/* BEGINNING OF ACTION: link-field */
	{
#line 848 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIp) = APPEND_list ( (ZIq), (ZIr) );
#line 3867 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: link-field */
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZRunion_Hdefn_Hnew (CLASS_ID_P ZIi, UNION_P *ZOp)
{
    UNION_P ZIp;

    if ((CURRENT_TERMINAL) == 49) {
	return;
    }
    {
	COMPONENT_P_LIST ZIc;
	string ZIj;
	FIELD_P_LIST ZIf;
	MAP_P_LIST ZIm;

	switch (CURRENT_TERMINAL) {
	  case lex_equal:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF INLINE: 222 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_open_Hbrace:
		{
		    ZRcomponent_Hgroup (&ZIc);
		    if ((CURRENT_TERMINAL) == 49) {
			RESTORE_LEXER;
			goto ZL1;
		    }
		    /* BEGINNING OF ACTION: null-identifier */
		    {
#line 320 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIj) = NULL;
#line 3915 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: null-identifier */
		}
		break;
	      case lex_identifier:
		{
		    /* BEGINNING OF ACTION: null-component */
		    {
#line 710 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIc) = NULL_list ( COMPONENT_P );
#line 3927 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: null-component */
		    /* BEGINNING OF EXTRACT: identifier */
		    {
#line 222 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    ZIj = string_copy ( token_buff );
#line 3935 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF EXTRACT: identifier */
		    ADVANCE_LEXER;
		}
		break;
	      default:
		goto ZL1;
	    }
	}
	/* END OF INLINE: 222 */
	switch (CURRENT_TERMINAL) {
	  case lex_plus:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	switch (CURRENT_TERMINAL) {
	  case lex_open_Hbrace:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	ZRfield_Hlist (&ZIf);
	switch (CURRENT_TERMINAL) {
	  case lex_close_Hbrace:
	    break;
	  case 49:
	    RESTORE_LEXER;
	    goto ZL1;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF INLINE: 223 */
	{
	    switch (CURRENT_TERMINAL) {
	      case lex_colon:
		{
		    ADVANCE_LEXER;
		    switch (CURRENT_TERMINAL) {
		      case lex_open_Hsquare:
			break;
		      default:
			goto ZL1;
		    }
		    ADVANCE_LEXER;
		    ZRmap_Hlist (&ZIm);
		    switch (CURRENT_TERMINAL) {
		      case lex_close_Hsquare:
			break;
		      case 49:
			RESTORE_LEXER;
			goto ZL1;
		      default:
			goto ZL1;
		    }
		    ADVANCE_LEXER;
		}
		break;
	      default:
		{
		    /* BEGINNING OF ACTION: null-map */
		    {
#line 936 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIm) = NULL_list ( MAP_P );
#line 4004 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
		    }
		    /* END OF ACTION: null-map */
		}
		break;
	    }
	}
	/* END OF INLINE: 223 */
	switch (CURRENT_TERMINAL) {
	  case lex_semicolon:
	    break;
	  default:
	    goto ZL1;
	}
	ADVANCE_LEXER;
	/* BEGINNING OF ACTION: make-union */
	{
#line 983 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    TYPE r;
    TYPE_P t;
    int tag = 0;
    string nm = (ZIj);
    FIELD_P_LIST p = (ZIf);
    UNION_P un = NULL_ptr ( UNION );

    /* Deal with overall inheritance */
    if ( nm ) {
	r = DEREF_type ( find_type ( algebra, nm ) );
	if ( IS_type_onion ( r ) ) {
	    un = DEREF_ptr ( type_onion_un ( r ) );
	    (ZIc) = ADD_list ( DEREF_list ( un_s_defn ( un ) ), (ZIc),
			    SIZE_ptr ( COMPONENT ) );
	    (ZIf) = ADD_list ( DEREF_list ( un_u_defn ( un ) ), p,
			    SIZE_ptr ( FIELD ) );
	    (ZIm) = ADD_list ( DEREF_list ( un_map ( un ) ), (ZIm),
			    SIZE_ptr ( MAP ) );
	    tag = DEREF_int ( un_no_fields ( un ) );
	    no_fields += tag;
	} else {
	    MSG_cant_inherit_from (nm);
	}
    }

    /* Deal with inheritance of fields and field tags */
    while ( !IS_NULL_list ( p ) ) {
	FIELD_P q = DEREF_ptr ( HEAD_list ( p ) );
	FIELD_P b = DEREF_ptr ( fld_base ( q ) );
	if ( !IS_NULL_ptr ( b ) ) {
	    int ok = 0;
	    FIELD_P_LIST pp = (ZIf);
	    string n = DEREF_string ( fld_name ( b ) );
	    while ( !IS_NULL_list ( pp ) ) {
		FIELD_P qq = DEREF_ptr ( HEAD_list ( pp ) );
		string nn = DEREF_string ( fld_name ( qq ) );
		if ( streq ( n, nn ) ) {
		    COMPONENT_P_LIST cc = DEREF_list ( fld_defn ( qq ) );
		    COMPONENT_P_LIST c = DEREF_list ( fld_defn ( q ) );
		    c = ADD_list ( cc, c, SIZE_ptr ( COMPONENT ) );
		    COPY_list ( fld_defn ( q ), c );
		    COPY_ptr ( fld_base ( q ), qq );
		    ok = 1;
		    break;
		}
		pp = TAIL_list ( pp );
	    }
	    if ( !ok ) MSG_cant_find_field (n);
	}
	COPY_int ( fld_tag ( q ), tag++ );
	p = TAIL_list ( p );
    }

    /* Construct output */
    (ZIp) = MAKE_ptr ( SIZE_un );
    MAKE_un ( (ZIi), un, (ZIc), (ZIf), (ZIm), no_fields, (ZIp) );
    no_fields = 0;
    t = MAKE_ptr ( SIZE_type );
    MAKE_type_onion ( 0, (ZIp), r );
    COPY_type ( t, r );
    IGNORE register_type ( t );
#line 4084 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	}
	/* END OF ACTION: make-union */
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZOp = ZIp;
}

static void
ZR246 (number ZI244, number *ZO245)
{
    number ZI245;

  ZL2_246:;
    switch (CURRENT_TERMINAL) {
      case lex_xor:
	{
	    number ZIp;
	    number ZIn;

	    ADVANCE_LEXER;
	    ZRand_Hexp (&ZIp);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: exp-xor */
	    {
#line 495 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIn) = (ZI244) ^ (ZIp);
#line 4119 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: exp-xor */
	    /* BEGINNING OF INLINE: 246 */
	    ZI244 = ZIn;
	    goto ZL2_246;
	    /* END OF INLINE: 246 */
	}
	/*UNREACHED*/
      default:
	{
	    ZI245 = ZI244;
	}
	break;
      case 49:
	return;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZO245 = ZI245;
}

static void
ZR250 (number ZI248, number *ZO249)
{
    number ZI249;

  ZL2_250:;
    switch (CURRENT_TERMINAL) {
      case lex_and:
	{
	    number ZIp;
	    number ZIn;

	    ADVANCE_LEXER;
	    ZRshift_Hexp (&ZIp);
	    if ((CURRENT_TERMINAL) == 49) {
		RESTORE_LEXER;
		goto ZL1;
	    }
	    /* BEGINNING OF ACTION: exp-and */
	    {
#line 491 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

    (ZIn) = (ZI248) & (ZIp);
#line 4167 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"
	    }
	    /* END OF ACTION: exp-and */
	    /* BEGINNING OF INLINE: 250 */
	    ZI248 = ZIn;
	    goto ZL2_250;
	    /* END OF INLINE: 250 */
	}
	/*UNREACHED*/
      default:
	{
	    ZI249 = ZI248;
	}
	break;
      case 49:
	return;
    }
    goto ZL0;
  ZL1:;
    SAVE_LEXER (49);
    return;
  ZL0:;
    *ZO249 = ZI249;
}

/* BEGINNING OF TRAILER */

#line 1199 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/src/utilities/calculus/syntax.act"

#line 4196 "/mnt/gmirror/ports/lang/TenDRA/work/tendra/obj//utilities/calculus/syntax.c"

/* END OF FILE */


syntax highlighted by Code2HTML, v. 0.9.1