view tests/agcl/oldagsrc/good/bcip.cpp @ 23:cac4c76600eb

Update lint ok file for recent change.
author David A. Holland
date Mon, 13 Jun 2022 00:17:10 -0400
parents 13d2b8934445
children
line wrap: on
line source

/*
 bcip.syn  Version 1.0

 A simple byte code compiler

 Copyright (c) 1996-1999 Parsifal Software, All Rights Reserved.

 The expression syntax is borrowed from C but with the addition
 of the FORTRAN exponentiation operator (**).

 The cast, increment, and decrement operators are not
 implemented, nor are the following operations that are defined
 only for integers:
   Bitwise logical operators:   &, |, ^, ~, &=, |=, ^=
   Remainder operators:         %, %=
   Shift operators:             <<, >>, >>=, <<=

 The supported operations are:
   Assignment operators:        =, +=, -=, *=, /=
   Conditional expressions:     ? :
   Logical operators:           !, &&, ||
   Comparison operators:        ==, !=, <, <=, >, >=
   Binary arithmetic operators: +, -, *, /
   Exponentiation:              **
   Unary arithmetic operators:  +, -
   Parentheses                  (  )
   Built-in functions           log, exp, sqrt

 All arithmetic is double precision floating point.

 Statements may include expression statements, blocks, if/else
 statements, while statements, do-while statements, or for
 statements, following the rules of C.

 The statement syntax has been written to avoid the conventional
 if/else ambiguity.

 There are no declarations. All variables are presumed to be
 double.

 Input strings may contain any number of statements. White space
 may be used freely, including both C and C++ style comments.

 The parser is invoked by the constructor for the virtual machine
 to parse the source code and compile it into byte code.

 With this organization, it is possible to create various
 virtual machine objects all of which use the same symbol dictionary,
 so that all can operate on the same data array. Furthermore, if
 there are multiple data arrays, all consistent with the same
 symbol dictionary, then any virtual machine object created using the
 given symbol dictionary can operate on any of the data arrays.

 Thus a given virtual machine may operate on different data
 arrays at different times. The data array, of course, must be
 consistent with the symbol dictionary used to initialize the virtual
 machine.

 The symbol dictionary maps character strings to indices into the
 data array, so that each unique variable name is assigned a
 particular location in the data array. Different virtual
 machines may be initialized with the same symbol dictionary. When
 this is done, these virtual machines can all operate on the
 same data array.

 An override for the SYNTAX_ERROR macro defined by AnaGram and
 the definition of the ScriptMethod class are in the bci.h
 file. bci.cpp has function definitons for the ScriptMethod
 class. bcidemo.cpp demonstrates one way to use the virtual
 machine.

 bcip.syn is compiled with the AnaGram parser generator yielding
 bcip.h and bcip.cpp.

 To build bcidemo, compile bcip.cpp, bci.cpp, cntnrs.cpp and bcidemo.cpp
 and link them with your C++ compiler.

 For information about AnaGram, visit http://www.parsifalsoft.com.
*/

#include <math.h>
#include "bci.h"                  // defines external interface


/*
 * AnaGram, A System for Syntax Directed Programming
 * File generated by: ...
 *
 * AnaGram Parsing Engine
 * Copyright 1993-2002 Parsifal Software. All Rights Reserved.
 *
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation would be
 *    appreciated but is not required.
 * 2. Altered source versions must be plainly marked as such, and must not be
 *    misrepresented as being the original software.
 * 3. This notice may not be removed or altered from any source distribution.
 */

#ifndef BCIP_H
#include "bcip.h"
#endif

#ifndef BCIP_H
#error Mismatched header file
#endif

#include <ctype.h>
#include <stdio.h>

#define RULE_CONTEXT (&((PCB).cs[(PCB).ssx]))
#define ERROR_CONTEXT ((PCB).cs[(PCB).error_frame_ssx])
#define CONTEXT ((PCB).cs[(PCB).ssx])


#ifndef PCB_TYPE
#define PCB_TYPE bciParse_pcb_type
#endif


#define PCB (*pcb_pointer)
#define PCB_DECL PCB_TYPE *pcb_pointer
#define PCB_POINTER pcb_pointer

CodeFragment bciParse_value(PCB_DECL);

static void ag_delete_wrappers(PCB_DECL);
#ifndef DELETE_WRAPPERS
#define DELETE_WRAPPERS ag_delete_wrappers(PCB_POINTER)
#endif

/*  Line -, bcip.syn */
 // Begin embedded C

#define SYNTAX_ERROR

int bciParse_pcb_struct::stashReal(double x) {
  int n = realList.size();
  realList.push(x);
  return n;
}

CodeFragment bciParse_pcb_struct::codeIfElse(CodeFragment &condition,
                                             CodeFragment &trueStatement,
                                             CodeFragment &falseStatement)
{
  return condition.cat(BRF, trueStatement.size() + 2)
                  .cat(trueStatement)
                  .cat(BR, falseStatement.size())
                  .cat(falseStatement);
}

CodeFragment bciParse_pcb_struct::codeWhile(CodeFragment &condition,
                                            CodeFragment &statement)
{
  // loop back distance is length of statement + length of condition + 2 branch instructions
  int loopBackDistance = condition.size() + statement.size() + 4;
  return condition.cat(BRF, statement.size() + 2)       // size of statement +size of loopback
                  .cat(statement)
                  .cat(BR, -loopBackDistance);
}

CodeFragment bciParse_pcb_struct::codeDoWhile(CodeFragment &statement,
                                              CodeFragment &condition)
{
  // loop back distance is
  //    length of statement + length of condition + 1 branch instruction
  int loopBackDistance = statement.size() + condition.size() + 2;
  return statement.cat(condition)
                  .cat(BRT, -loopBackDistance);
}

CodeFragment bciParse_pcb_struct::codeFor(CodeFragment &initializer,
                                          CodeFragment &condition,
                                          CodeFragment &increment,
                                          CodeFragment &statement)
{
  // Calculate the length of the jump back at the bottom of the loop
  // It consists of the length of the increment, condition and statement
  // CodeFragments + 5 inserted Bytecodes: 1 Pop, and 2 each for each of
  // two branches
  int loopBackDistance = increment.size() + condition.size() + statement.size() + 5;

  // Put it all together
  return initializer.cat(POP)                           // clear expression value from stack
                    .cat(BR, increment.size() + 1)      // Skip increment on first time through
                    .cat(increment).cat(POP)            // clear expresson value from stack
                    .cat(condition)
                    .cat(BRF, statement.size() + 2)     // exit when condition is false
                    .cat(statement)
                    .cat(BR, -loopBackDistance);
}

int bciParse_pcb_struct::compile(AgStringDictionary *s, AgString text) {
  symbolDictionary = s;
  charStack.reset();
  pointer = (unsigned char *) text.ptr();
  bciParse(this);
  if(exit_flag != AG_SUCCESS_CODE) return 1;
  code = bciParse_value(this);
  return 0;
}


#ifndef CONVERT_CASE
#define CONVERT_CASE(c) (c)
#endif
#ifndef TAB_SPACING
#define TAB_SPACING 8
#endif
CodeFragment bciParse_value(PCB_DECL) {
  CodeFragment returnValue;
  returnValue = (*(AgObjectWrapper< CodeFragment > *) &(PCB).vs[(PCB).ssx]);
  return returnValue;
}

static inline CodeFragment ag_rp_1(PCB_DECL, CodeFragment &x) {
/* Line -, bcip.syn */
  return x.cat(HLT);
}

static inline CodeFragment ag_rp_2(PCB_DECL) {
/* Line -, bcip.syn */
  return CodeFragment();
}

static inline CodeFragment ag_rp_3(PCB_DECL, CodeFragment &x, CodeFragment &y) {
/* Line -, bcip.syn */
  return x.cat(y);
}

static inline CodeFragment ag_rp_4(PCB_DECL, CodeFragment &x, CodeFragment &s) {
/* Line -, bcip.syn */
  return x.cat(BRF, s.size()).cat(s);
}

static inline CodeFragment ag_rp_5(PCB_DECL, CodeFragment &x, CodeFragment &s1, CodeFragment &s2) {
/* Line -, bcip.syn */
  return PCB.codeIfElse(x,s1,s2);
}

static inline CodeFragment ag_rp_6(PCB_DECL, CodeFragment &x, CodeFragment &s) {
/* Line -, bcip.syn */
  return PCB.codeWhile(x,s);
}

static inline CodeFragment ag_rp_7(PCB_DECL, CodeFragment &init, CodeFragment &cond, CodeFragment &inc, CodeFragment &s) {
/* Line -, bcip.syn */
  return PCB.codeFor(init, cond, inc, s);
}

static inline CodeFragment ag_rp_8(PCB_DECL, CodeFragment &x, CodeFragment &s1, CodeFragment &s2) {
/* Line -, bcip.syn */
  return PCB.codeIfElse(x,s1,s2);
}

static inline CodeFragment ag_rp_9(PCB_DECL, CodeFragment &x, CodeFragment &s) {
/* Line -, bcip.syn */
  return PCB.codeWhile(x,s);
}

static inline CodeFragment ag_rp_10(PCB_DECL, CodeFragment &s, CodeFragment &x) {
/* Line -, bcip.syn */
  return PCB.codeDoWhile(s,x);
}

static inline CodeFragment ag_rp_11(PCB_DECL, CodeFragment &init, CodeFragment &cond, CodeFragment &inc, CodeFragment &s) {
/* Line -, bcip.syn */
  return PCB.codeFor(init, cond, inc, s);
}

static inline CodeFragment ag_rp_12(PCB_DECL, CodeFragment &x) {
/* Line -, bcip.syn */
  return x;
}

static inline CodeFragment ag_rp_13(PCB_DECL, CodeFragment &x) {
/* Line -, bcip.syn */
  return x;
}

static inline CodeFragment ag_rp_14(PCB_DECL, CodeFragment &x) {
/* Line -, bcip.syn */
  return x.cat(POP);
}

static inline CodeFragment ag_rp_15(PCB_DECL) {
/* Line -, bcip.syn */
  return CodeFragment();
}

static inline CodeFragment ag_rp_16(PCB_DECL, CodeFragment &s) {
/* Line -, bcip.syn */
  return s;
}

static inline CodeFragment ag_rp_17(PCB_DECL, CodeFragment &x, CodeFragment &y) {
/* Line -, bcip.syn */
  return x.cat(POP).cat(y);
}

static inline CodeFragment ag_rp_18(PCB_DECL, int k, CodeFragment &x) {
/* Line -, bcip.syn */
  return x.cat(STORE, k);
}

static inline CodeFragment ag_rp_19(PCB_DECL, int k, CodeFragment &x) {
/* Line -, bcip.syn */
  return x.cat(ADDM, k);
}

static inline CodeFragment ag_rp_20(PCB_DECL, int k, CodeFragment &x) {
/* Line -, bcip.syn */
  return x.cat(SUBM, k);
}

static inline CodeFragment ag_rp_21(PCB_DECL, int k, CodeFragment &x) {
/* Line -, bcip.syn */
  return x.cat(MULM,k);
}

static inline CodeFragment ag_rp_22(PCB_DECL, int k, CodeFragment &x) {
/* Line -, bcip.syn */
  return x.cat(DIVM, k);
}

static inline CodeFragment ag_rp_23(PCB_DECL, CodeFragment &c, CodeFragment &x, CodeFragment &y) {
/* Line -, bcip.syn */
  return PCB.codeIfElse(c, x, y);
}

static inline CodeFragment ag_rp_24(PCB_DECL, CodeFragment &x, CodeFragment &y) {
/* Line -, bcip.syn */
  return x.cat(OR, y.size()).cat(y);
}

static inline CodeFragment ag_rp_25(PCB_DECL, CodeFragment &x, CodeFragment &y) {
/* Line -, bcip.syn */
  return x.cat(AND, y.size()).cat(y);
}

static inline CodeFragment ag_rp_26(PCB_DECL, CodeFragment &x, CodeFragment &y) {
/* Line -, bcip.syn */
  return x.cat(y).cat(EQ);
}

static inline CodeFragment ag_rp_27(PCB_DECL, CodeFragment &x, CodeFragment &y) {
/* Line -, bcip.syn */
  return x.cat(y).cat(NE);
}

static inline CodeFragment ag_rp_28(PCB_DECL, CodeFragment &x, CodeFragment &y) {
/* Line -, bcip.syn */
  return x.cat(y).cat(LT);
}

static inline CodeFragment ag_rp_29(PCB_DECL, CodeFragment &x, CodeFragment &y) {
/* Line -, bcip.syn */
  return x.cat(y).cat(LE);
}

static inline CodeFragment ag_rp_30(PCB_DECL, CodeFragment &x, CodeFragment &y) {
/* Line -, bcip.syn */
  return x.cat(y).cat(GT);
}

static inline CodeFragment ag_rp_31(PCB_DECL, CodeFragment &x, CodeFragment &y) {
/* Line -, bcip.syn */
  return x.cat(y).cat(GE);
}

static inline CodeFragment ag_rp_32(PCB_DECL, CodeFragment &x, CodeFragment &y) {
/* Line -, bcip.syn */
  return x.cat(y).cat(ADD);
}

static inline CodeFragment ag_rp_33(PCB_DECL, CodeFragment &x, CodeFragment &y) {
/* Line -, bcip.syn */
  return x.cat(y).cat(SUB);
}

static inline CodeFragment ag_rp_34(PCB_DECL, CodeFragment &x, CodeFragment &y) {
/* Line -, bcip.syn */
  return x.cat(y).cat(MUL);
}

static inline CodeFragment ag_rp_35(PCB_DECL, CodeFragment &x, CodeFragment &y) {
/* Line -, bcip.syn */
  return x.cat(y).cat(DIV);
}

static inline CodeFragment ag_rp_36(PCB_DECL, CodeFragment &x) {
/* Line -, bcip.syn */
  return x.cat(NEG);
}

static inline CodeFragment ag_rp_37(PCB_DECL, CodeFragment &x) {
/* Line -, bcip.syn */
  return x;
}

static inline CodeFragment ag_rp_38(PCB_DECL, CodeFragment &x, CodeFragment &y) {
/* Line -, bcip.syn */
  return x.cat(y).cat(POW);
}

static inline CodeFragment ag_rp_39(PCB_DECL, int x) {
/* Line -, bcip.syn */
  return CodeFragment().cat(PUSHI, x);
}

static inline CodeFragment ag_rp_40(PCB_DECL, int k) {
/* Line -, bcip.syn */
  return CodeFragment().cat(PUSH, k);
}

static inline CodeFragment ag_rp_41(PCB_DECL, CodeFragment &x) {
/* Line -, bcip.syn */
  return x.cat(LOG);
}

static inline CodeFragment ag_rp_42(PCB_DECL, CodeFragment &x) {
/* Line -, bcip.syn */
  return x.cat(EXP);
}

static inline CodeFragment ag_rp_43(PCB_DECL, CodeFragment &x) {
/* Line -, bcip.syn */
  return x.cat(SQRT);
}

static inline CodeFragment ag_rp_44(PCB_DECL, CodeFragment &x) {
/* Line -, bcip.syn */
  return x;
}

static inline CodeFragment ag_rp_45(PCB_DECL, CodeFragment &x) {
/* Line -, bcip.syn */
  return x.cat(NOT);
}

static inline int ag_rp_46(PCB_DECL, double x) {
/* Line -, bcip.syn */
  return PCB.stashReal(x);
}

static inline int ag_rp_47(PCB_DECL, double x, int e) {
/* Line -, bcip.syn */
  return PCB.stashReal(x*pow(10,e));
}

static inline int ag_rp_48(PCB_DECL, double x, int e) {
/* Line -, bcip.syn */
  return PCB.stashReal(x*pow(10,-e));
}

static inline double ag_rp_49(PCB_DECL, double i, double f) {
/* Line -, bcip.syn */
  return i+f;
}

static inline double ag_rp_50(PCB_DECL, double f) {
/* Line -, bcip.syn */
  return f;
}

static inline double ag_rp_51(PCB_DECL, int d) {
/* Line -, bcip.syn */
  return d-'0';
}

static inline double ag_rp_52(PCB_DECL, double x, int d) {
/* Line -, bcip.syn */
  return 10*x + d-'0';
}

static inline double ag_rp_53(PCB_DECL, int d) {
/* Line -, bcip.syn */
  return (d-'0')/10.;
}

static inline double ag_rp_54(PCB_DECL, int d, double f) {
/* Line -, bcip.syn */
  return (d-'0' + f)/10.;
}

static inline int ag_rp_55(PCB_DECL, int d) {
/* Line -, bcip.syn */
  return d-'0';
}

static inline int ag_rp_56(PCB_DECL, int x, int d) {
/* Line -, bcip.syn */
  return 10*x + d-'0';
}

static inline int ag_rp_57(PCB_DECL) {
/* Line -, bcip.syn */
  return PCB.symbolDictionary->identify(PCB.charStack.popString());
}

static inline void ag_rp_58(PCB_DECL, int c) {
/* Line -, bcip.syn */
  PCB.charStack.push((char) c);
}

static inline void ag_rp_59(PCB_DECL, int c) {
/* Line -, bcip.syn */
  PCB.charStack.push((char) c);
}


#define READ_COUNTS 
#define WRITE_COUNTS 
#undef V
#define V(i,t) (*t (&(PCB).vs[(PCB).ssx + i]))
#undef VS
#define VS(i) (PCB).vs[(PCB).ssx + i]

#ifndef GET_CONTEXT
#define GET_CONTEXT CONTEXT = (PCB).input_context
#endif

typedef enum {
  ag_action_1,
  ag_action_2,
  ag_action_3,
  ag_action_4,
  ag_action_5,
  ag_action_6,
  ag_action_7,
  ag_action_8,
  ag_action_9,
  ag_action_10,
  ag_action_11,
  ag_action_12
} ag_parser_action;


#ifndef NULL_VALUE_INITIALIZER
#define NULL_VALUE_INITIALIZER = { 0 }
#endif


static const char ag_wdf[] = {
  0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 4, 0, 0, 4, 4, 4, 4, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
  0, 0, 4, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 4, 0, 0, 0, 0, 4, 0, 4, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  4, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0
};

#undef  VW
#define VW(i,t) *(t) (&(PCB).vs[(PCB).ssx + (i)])
#undef  VNO
#define VNO new(&(PCB).vs[(PCB).ssx])
#undef  VRO
#define VRO(to,v) ag_replace_object((to) &(PCB).vs[(PCB).ssx], v)
#undef  VWD
#define VWD(i,t) ag_delete_object((t) &(PCB).vs[(PCB).ssx + (i)]);
#undef  VDO
#define VDO(to, v) ag_delete_object((to) &(PCB).vs[(PCB).ssx], v)

template <class NewObject, class OldObject>
static inline void ag_replace_object(AgObjectWrapper<OldObject> *p, const NewObject &o) {
  delete p;
  new(p) AgObjectWrapper<NewObject >(o);
}

template <class Object>
static inline void ag_delete_object(AgObjectWrapper<Object> *p) {
  delete p;
}

template <class NewObject, class OldObject>
static inline const NewObject &ag_delete_object(AgObjectWrapper<OldObject> *p, const NewObject &o) {
  delete p;
  return o;
}


#undef AG_WRAP_4
#define AG_WRAP_4 AgObjectWrapper<CodeFragment >

static void ag_delete_wrappers(PCB_DECL) {
  int sn = (PCB).sn;
  int sx = (PCB).ssx;
  while (sx--) {
    switch (ag_wdf[sn]) {
      case 4: ag_delete_object((AG_WRAP_4 *) &(PCB).vs[sx]); break;
      default: break;
    }
    sn = (PCB).ss[sx];
  }
}

static bciParse_vs_type const ag_null_value NULL_VALUE_INITIALIZER;

static const unsigned char ag_rpx[] = {
    0,  1,  2,  3,  0,  0,  4,  5,  6,  7,  0,  8,  9, 10, 11, 12, 13, 14,
   15, 16,  0, 17,  0, 18, 19, 20, 21, 22,  0, 23,  0, 24,  0, 25,  0, 26,
   27,  0, 28, 29, 30, 31,  0, 32, 33,  0, 34, 35,  0, 36, 37,  0, 38, 39,
   40, 41, 42, 43, 44, 45,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 46,
    0,  0, 47, 48, 49,  0,  0,  0, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59
};

static const unsigned char ag_key_itt[] = {
 0
};

static const unsigned short ag_key_pt[] = {
0
};

static const unsigned char ag_key_ch[] = {
    0, 42, 47,255, 47,100,101,102,105,108,115,119,255, 42,255, 42, 61,255,
   42, 47, 61,255,108,120,255, 33, 38, 42, 43, 45, 47, 60, 61, 62,100,101,
  102,105,108,115,119,124,255,100,101,102,105,108,115,119,255, 42, 47,255,
   33, 38, 42, 47, 60, 61, 62,124,255, 42, 47,255, 47,101,108,115,255, 42,
   47,255, 47,255,101,108,115,255, 33, 38, 42, 60, 61, 62,124,255, 33, 38,
   60, 61, 62,124,255, 33, 38, 61,124,255, 42, 61,255, 42, 47, 61,255, 33,
   38, 42, 43, 45, 47, 60, 61, 62,124,255,124,255, 42, 61,255, 33, 38, 42,
   43, 45, 47, 60, 61, 62,124,255, 42, 47,255,108,120,255, 47,100,101,102,
  105,108,115,119,255,119,255,108,120,255,100,101,102,105,108,115,119,255,
   42, 47,255, 33, 38, 42, 47, 60, 61, 62,100,101,102,105,108,115,119,124,
  255
};

static const unsigned char ag_key_act[] = {
  0,0,0,4,2,3,3,3,3,3,3,3,4,3,4,0,0,4,0,0,0,4,3,3,4,3,3,2,3,3,2,3,3,3,3,
  2,3,3,3,3,3,3,4,3,3,3,3,3,3,3,4,0,0,4,3,3,3,2,3,3,3,3,4,0,0,4,2,3,3,3,
  4,0,0,4,2,4,3,3,3,4,3,3,3,3,3,3,3,4,3,3,3,3,3,3,4,3,3,3,3,4,0,0,4,0,0,
  0,4,3,3,2,3,3,2,3,3,3,3,4,3,4,0,0,4,3,3,2,3,3,3,3,3,3,3,4,0,0,4,3,3,4,
  2,3,2,3,3,3,3,3,4,3,4,3,3,4,3,2,3,3,3,3,3,4,0,0,4,3,3,3,2,3,3,3,3,3,3,
  3,3,3,3,3,4
};

static const unsigned char ag_key_parm[] = {
    0, 61, 66,  0,  0, 93,122, 92, 94,121,123, 95,  0, 65,  0,119,103,  0,
   61, 66,104,  0, 88,122,  0,110,108,  0,101,102,  0,112,109,114, 93,  0,
   92, 94,121,123, 95,107,  0, 93,122, 92, 94,121,123, 95,  0, 61, 66,  0,
  110,108,119,  0,112,109,114,107,  0, 61, 66,  0,  0,122,121,123,  0, 61,
   66,  0,  0,  0,122,121,123,  0,110,108,119,112,109,114,107,  0,110,108,
  112,109,114,107,  0,110,108,109,107,  0,119,103,  0, 61, 66,104,  0,110,
  108,  0,101,102,  0,112,109,114,107,  0,107,  0,119,103,  0,110,108,  0,
  101,102,104,112,109,114,107,  0, 61, 66,  0, 88,122,  0,  0, 93,  0, 92,
   94,121,123, 95,  0, 95,  0, 88,122,  0, 93,  0, 92, 94,121,123, 95,  0,
   61, 66,  0,110,108,119,  0,112,109,114, 93,122, 92, 94,121,123, 95,107,
    0
};

static const unsigned short ag_key_jmp[] = {
    0,  0,  0,  0,  1,  0,  2,  5,  8, 10, 13, 17,  0, 22,  0,  0,  0,  0,
    0,  0,  0,  0, 40, 43,  0, 24, 26, 15, 28, 30, 18, 32, 34, 36, 38, 22,
   45, 48, 50, 53, 57, 62,  0, 64, 66, 69, 72, 74, 77, 81,  0,  0,  0,  0,
   86, 88, 90, 51, 92, 94, 96, 98,  0,  0,  0,  0, 63,100,103,106,  0,  0,
    0,  0, 71,  0,110,113,116,  0,120,122,124,126,128,130,132,  0,134,136,
  138,140,142,144,  0,146,148,150,152,  0,  0,  0,  0,  0,  0,  0,  0,154,
  156,100,158,160,103,162,164,166,168,  0,170,  0,  0,  0,  0,172,174,120,
  176,178,180,182,184,186,188,  0,  0,  0,  0,192,195,  0,134,190,137,197,
  200,202,205,209,  0,214,  0,221,224,  0,219,151,226,229,231,234,238,  0,
    0,  0,  0,243,245,247,162,249,251,253,255,257,260,263,265,268,272,277,
    0
};

static const unsigned char ag_key_index[] = {
    4,  0, 13, 25, 43,  0,  0, 13, 13, 43,  0, 54, 54, 66, 66, 74, 74, 74,
   54, 76, 76,  0,  0,  0, 66, 66, 80, 76, 76, 88, 88, 88, 95,107,118,107,
    0,123,  4,140, 74, 74,  4, 43,  0, 74,  0,  0, 43,  0, 43, 43, 54, 54,
    0,  0, 76, 76, 76, 66, 76, 66, 76, 66, 76, 76, 76, 66, 76, 66, 76, 66,
   76, 66, 76, 66, 76, 66, 76, 66, 76, 66, 76, 66, 76, 66, 76, 66, 76, 66,
   76, 66, 76, 66, 76, 43, 66, 76, 76, 76,149, 76,154,  0,  0,165,  0,  0,
    0, 88, 88, 88, 88, 88, 88, 88, 88,  0,140,  0,  0,  0,  0,  4, 43, 54,
   54, 66, 76, 76,  0, 76,  0, 43
};

static const unsigned char ag_key_ends[] = {
111,0, 120,112,0, 111,114,0, 102,0, 111,103,0, 113,114,116,0, 
104,105,108,101,0, 47,0, 61,0, 38,0, 61,0, 61,0, 61,0, 61,0, 
61,0, 111,0, 115,101,0, 112,0, 111,114,0, 102,0, 111,103,0, 
113,114,116,0, 104,105,108,101,0, 124,0, 111,0, 120,112,0, 
111,114,0, 102,0, 111,103,0, 113,114,116,0, 104,105,108,101,0, 
61,0, 38,0, 42,0, 61,0, 61,0, 61,0, 124,0, 120,112,0, 
111,103,0, 113,114,116,0, 120,112,0, 111,103,0, 113,114,116,0, 
61,0, 38,0, 42,0, 61,0, 61,0, 61,0, 124,0, 61,0, 38,0, 61,0, 
61,0, 61,0, 124,0, 61,0, 38,0, 61,0, 124,0, 61,0, 38,0, 
61,0, 61,0, 61,0, 61,0, 61,0, 124,0, 124,0, 61,0, 38,0, 
61,0, 61,0, 61,0, 61,0, 61,0, 61,0, 124,0, 111,0, 115,101,0, 
112,0, 111,114,0, 102,0, 111,103,0, 113,114,116,0, 
104,105,108,101,0, 104,105,108,101,0, 111,0, 115,101,0, 112,0, 
111,114,0, 102,0, 111,103,0, 113,114,116,0, 104,105,108,101,0, 
61,0, 38,0, 42,0, 61,0, 61,0, 61,0, 111,0, 120,112,0, 
111,114,0, 102,0, 111,103,0, 113,114,116,0, 104,105,108,101,0, 
124,0, 
};

#define AG_TCV(x) ag_tcv[(x)]

static const unsigned char ag_tcv[] = {
    6, 84, 84, 84, 84, 84, 84, 84, 84, 83, 70, 83, 83, 83, 84, 84, 84, 84,
   84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 83,124, 84, 84,
   84, 84, 84, 84, 91, 89,117,115, 98,116, 76,118, 79, 79, 79, 79, 79, 79,
   79, 79, 79, 79,105, 90,111, 99,113,106, 84, 85, 85, 85, 85, 72, 85, 85,
   85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
   85, 84, 84, 84, 84, 85, 84, 85, 85, 85, 85, 72, 85, 85, 85, 85, 85, 85,
   85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 97, 84, 96,
   84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
   84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
   84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
   84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
   84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
   84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
   84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
   84, 84, 84, 84
};

#ifndef SYNTAX_ERROR
#define SYNTAX_ERROR fprintf(stderr,"%s, line %d, column %d\n", \
  (PCB).error_message, (PCB).line, (PCB).column)
#endif

#ifndef FIRST_LINE
#define FIRST_LINE 1
#endif

#ifndef FIRST_COLUMN
#define FIRST_COLUMN 1
#endif

#ifndef PARSER_STACK_OVERFLOW
#define PARSER_STACK_OVERFLOW {fprintf(stderr, \
   "\nParser stack overflow, line %d, column %d\n",\
   (PCB).line, (PCB).column);}
#endif

#ifndef REDUCTION_TOKEN_ERROR
#define REDUCTION_TOKEN_ERROR {fprintf(stderr, \
    "\nReduction token error, line %d, column %d\n", \
    (PCB).line, (PCB).column);}
#endif


#ifndef INPUT_CODE
#define INPUT_CODE(T) (T)
#endif

typedef enum
  {ag_accept_key, ag_set_key, ag_jmp_key, ag_end_key, ag_no_match_key,
   ag_cf_accept_key, ag_cf_set_key, ag_cf_end_key} key_words;

static void ag_get_key_word(PCB_DECL, int ag_k) {
  int ag_save = (int) ((PCB).la_ptr - (PCB).pointer);
  const  unsigned char *ag_p;
  int ag_ch;
  while (1) {
    switch (ag_key_act[ag_k]) {
    case ag_cf_end_key: {
      const  unsigned char *sp = ag_key_ends + ag_key_jmp[ag_k];
      do {
        if ((ag_ch = *sp++) == 0) {
          int ag_k1 = ag_key_parm[ag_k];
          int ag_k2 = ag_key_pt[ag_k1];
          if (ag_key_itt[ag_k2 + CONVERT_CASE(*(PCB).la_ptr)]) goto ag_fail;
          (PCB).token_number = (bciParse_token_type) ag_key_pt[ag_k1 + 1];
          return;
        }
      } while (CONVERT_CASE(*(PCB).la_ptr++) == ag_ch);
      goto ag_fail;
    }
    case ag_end_key: {
      const  unsigned char *sp = ag_key_ends + ag_key_jmp[ag_k];
      do {
        if ((ag_ch = *sp++) == 0) {
          (PCB).token_number = (bciParse_token_type) ag_key_parm[ag_k];
          return;
        }
      } while (CONVERT_CASE(*(PCB).la_ptr++) == ag_ch);
    }
    case ag_no_match_key:
ag_fail:
      (PCB).la_ptr = (PCB).pointer + ag_save;
      return;
    case ag_cf_set_key: {
      int ag_k1 = ag_key_parm[ag_k];
      int ag_k2 = ag_key_pt[ag_k1];
      ag_k = ag_key_jmp[ag_k];
      if (ag_key_itt[ag_k2 + CONVERT_CASE(*(PCB).la_ptr)]) break;
      ag_save = (int) ((PCB).la_ptr - (PCB).pointer);
      (PCB).token_number = (bciParse_token_type) ag_key_pt[ag_k1+1];
      break;
    }
    case ag_set_key:
      ag_save = (int) ((PCB).la_ptr - (PCB).pointer);
      (PCB).token_number = (bciParse_token_type) ag_key_parm[ag_k];
    case ag_jmp_key:
      ag_k = ag_key_jmp[ag_k];
      break;
    case ag_accept_key:
      (PCB).token_number = (bciParse_token_type) ag_key_parm[ag_k];
      return;
    case ag_cf_accept_key: {
      int ag_k1 = ag_key_parm[ag_k];
      int ag_k2 = ag_key_pt[ag_k1];
      if (ag_key_itt[ag_k2 + CONVERT_CASE(*(PCB).la_ptr)])
        (PCB).la_ptr = (PCB).pointer + ag_save;
      else (PCB).token_number = (bciParse_token_type) ag_key_pt[ag_k1+1];
      return;
    }
    }
    ag_ch = CONVERT_CASE(*(PCB).la_ptr++);
    ag_p = &ag_key_ch[ag_k];
    if (ag_ch <= 255) while (*ag_p < ag_ch) ag_p++;
    if (ag_ch > 255 || *ag_p != ag_ch) {
      (PCB).la_ptr = (PCB).pointer + ag_save;
      return;
    }
    ag_k = (int) (ag_p - ag_key_ch);
  }
}


#ifndef AG_NEWLINE
#define AG_NEWLINE 10
#endif

#ifndef AG_RETURN
#define AG_RETURN 13
#endif

#ifndef AG_FORMFEED
#define AG_FORMFEED 12
#endif

#ifndef AG_TABCHAR
#define AG_TABCHAR 9
#endif

static void ag_track(PCB_DECL) {
  int ag_k = (int) ((PCB).la_ptr - (PCB).pointer);
  while (ag_k--) {
    switch (*(PCB).pointer++) {
    case AG_NEWLINE:
      (PCB).column = 1, (PCB).line++;
    case AG_RETURN:
    case AG_FORMFEED:
      break;
    case AG_TABCHAR:
      (PCB).column += (TAB_SPACING) - ((PCB).column - 1) % (TAB_SPACING);
      break;
    default:
      (PCB).column++;
    }
  }
}


static void ag_prot(PCB_DECL) {
  int ag_k;
  ag_k = 128 - ++(PCB).btsx;
  if (ag_k <= (PCB).ssx) {
    (PCB).exit_flag = AG_STACK_ERROR_CODE;
    PARSER_STACK_OVERFLOW;
    return;
  }
  (PCB).bts[(PCB).btsx] = (PCB).sn;
  (PCB).bts[ag_k] = (PCB).ssx;
  (PCB).vs[ag_k] = (PCB).vs[(PCB).ssx];
  (PCB).ss[ag_k] = (PCB).ss[(PCB).ssx];
}

static void ag_undo(PCB_DECL) {
  if ((PCB).drt == -1) return;
  while ((PCB).btsx) {
    int ag_k = 128 - (PCB).btsx;
    (PCB).sn = (PCB).bts[(PCB).btsx--];
    (PCB).ssx = (PCB).bts[ag_k];
    (PCB).vs[(PCB).ssx] = (PCB).vs[ag_k];
    (PCB).ss[(PCB).ssx] = (PCB).ss[ag_k];
  }
  (PCB).token_number = (bciParse_token_type) (PCB).drt;
  (PCB).ssx = (PCB).dssx;
  (PCB).sn = (PCB).dsn;
  (PCB).drt = -1;
}


static const unsigned char ag_tstt[] = {
124,123,122,121,116,115,97,95,94,93,92,91,90,85,83,79,76,72,70,66,61,6,0,1,
  86,87,
124,118,117,116,115,113,111,106,105,99,98,97,96,91,90,89,85,84,83,79,76,72,
  70,0,68,69,
124,118,117,116,115,113,111,106,105,99,98,97,96,91,90,89,85,84,83,79,76,72,
  70,65,0,63,64,
83,70,66,61,0,1,
124,123,122,121,116,115,97,95,94,93,92,91,90,85,79,76,72,6,0,4,5,
124,118,117,116,115,113,111,106,105,99,98,97,96,91,90,89,85,84,83,79,76,72,
  0,
70,0,
124,118,117,116,115,113,111,106,105,99,98,97,96,91,90,89,85,84,83,79,76,72,
  70,0,
65,0,
124,123,122,121,116,115,97,95,94,93,92,91,90,85,79,76,72,6,0,2,3,7,8,9,10,
  12,13,14,15,16,18,19,20,21,22,24,26,32,35,37,39,42,47,48,49,50,53,54,56,
  57,58,59,71,75,80,100,120,
79,0,77,
119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,98,90,89,83,79,
  76,72,70,66,61,0,78,
72,0,
124,123,122,121,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
91,83,70,66,61,0,1,86,87,
91,83,70,66,61,0,1,86,87,
91,83,70,66,61,0,1,86,87,
119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,98,90,89,83,70,
  66,61,0,1,86,87,
124,123,122,121,91,85,79,76,72,0,2,3,14,54,56,57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,15,24,26,32,35,37,39,42,47,
  48,49,50,53,54,56,57,58,59,71,75,80,100,120,
91,0,14,
91,0,14,
91,0,14,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
119,0,55,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,48,49,50,53,54,56,57,58,59,
  71,75,80,100,120,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,48,49,50,53,54,56,57,58,59,
  71,75,80,100,120,
118,117,0,51,52,
116,115,0,48,49,
114,113,112,111,0,43,44,45,46,
110,109,108,0,38,40,41,
85,79,72,0,
107,0,36,
119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,
  99,98,90,89,83,70,66,61,0,1,86,87,
106,0,33,
104,103,102,101,99,0,27,28,29,30,31,
124,123,122,121,116,115,97,96,95,94,93,92,91,90,85,83,79,76,72,70,66,61,0,1,
  86,87,
124,123,122,121,116,115,97,96,95,94,93,92,91,90,88,85,83,79,76,72,70,66,61,
  6,0,1,86,87,
91,83,70,66,61,0,1,86,87,
91,83,70,66,61,0,1,86,87,
124,123,122,121,116,115,97,95,94,93,92,91,90,85,83,79,76,72,70,66,61,0,1,86,
  87,
124,123,122,121,116,115,97,96,95,94,93,92,91,90,85,79,76,72,0,5,
98,90,0,16,25,
91,83,70,66,61,0,1,86,87,
91,0,14,
91,0,14,
124,123,122,121,116,115,97,95,94,93,92,91,90,85,79,76,72,0,2,3,7,8,9,10,12,
  13,14,15,16,18,19,20,21,22,24,26,32,35,37,39,42,47,48,49,50,53,54,56,57,
  58,59,71,75,80,100,120,
91,0,14,
124,123,122,121,116,115,97,95,94,93,92,91,90,85,79,76,72,0,2,3,8,9,10,12,13,
  14,15,16,18,19,20,21,22,24,26,32,35,37,39,42,47,48,49,50,53,54,56,57,58,
  59,71,75,80,100,120,
124,123,122,121,116,115,97,95,94,93,92,91,90,85,79,76,72,0,2,3,7,8,9,10,12,
  13,14,15,16,18,19,20,21,22,24,26,32,35,37,39,42,47,48,49,50,53,54,56,57,
  58,59,71,75,80,100,120,
79,0,77,
79,0,77,
116,115,79,0,73,
98,89,0,17,25,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,24,26,32,35,37,39,42,47,48,
  49,50,53,54,56,57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,24,26,32,35,37,39,42,47,48,
  49,50,53,54,56,57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,24,26,32,35,37,39,42,47,48,
  49,50,53,54,56,57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,48,49,50,53,54,56,57,58,59,
  71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,48,49,50,53,54,56,57,58,59,
  71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,48,49,50,53,54,56,57,58,59,
  71,75,80,100,120,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,47,48,49,50,53,54,56,57,58,
  59,71,75,80,100,120,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,47,48,49,50,53,54,56,57,58,
  59,71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,42,47,48,49,50,53,54,56,57,
  58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,42,47,48,49,50,53,54,56,57,
  58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,42,47,48,49,50,53,54,56,57,
  58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,42,47,48,49,50,53,54,56,57,
  58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,39,42,47,48,49,50,53,54,56,
  57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,39,42,47,48,49,50,53,54,56,
  57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,35,37,39,42,47,48,49,50,53,
  54,56,57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,32,35,37,39,42,47,48,49,50,
  53,54,56,57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,15,24,26,32,35,37,39,42,47,
  48,49,50,53,54,56,57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,24,26,32,35,37,39,42,47,48,
  49,50,53,54,56,57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,24,26,32,35,37,39,42,47,48,
  49,50,53,54,56,57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,24,26,32,35,37,39,42,47,48,
  49,50,53,54,56,57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,24,26,32,35,37,39,42,47,48,
  49,50,53,54,56,57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,24,26,32,35,37,39,42,47,48,
  49,50,53,54,56,57,58,59,71,75,80,100,120,
124,123,122,121,116,115,97,96,95,94,93,92,91,90,85,79,76,72,0,2,3,7,8,9,10,
  12,13,14,15,16,18,19,20,21,22,23,24,26,32,35,37,39,42,47,48,49,50,53,54,
  56,57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,24,26,32,35,37,39,42,47,48,
  49,50,53,54,56,57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,15,24,26,32,35,37,39,42,47,
  48,49,50,53,54,56,57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,15,24,26,32,35,37,39,42,47,
  48,49,50,53,54,56,57,58,59,71,75,80,100,120,
95,0,12,21,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,15,24,26,32,35,37,39,42,47,
  48,49,50,53,54,56,57,58,59,71,75,80,100,120,
88,0,11,
79,0,74,
79,0,74,
124,123,122,121,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,
  98,97,95,94,93,92,91,90,89,85,83,79,76,72,70,66,61,0,1,86,87,
89,0,17,
89,0,17,
89,0,17,
118,117,0,51,52,
118,117,0,51,52,
116,115,0,48,49,
116,115,0,48,49,
116,115,0,48,49,
116,115,0,48,49,
114,113,112,111,0,43,44,45,46,
114,113,112,111,0,43,44,45,46,
105,98,0,25,34,
124,123,122,121,116,115,97,96,95,94,93,92,91,90,88,85,83,79,76,72,70,66,61,
  6,0,1,86,87,
98,89,0,17,25,
98,89,0,17,25,
90,0,16,
98,90,0,16,25,
124,123,122,121,116,115,97,95,94,93,92,91,90,85,83,79,76,72,70,66,61,0,1,86,
  87,
124,123,122,121,116,115,97,95,94,93,92,91,90,85,79,76,72,0,2,3,8,9,10,12,13,
  14,15,16,18,19,20,21,22,24,26,32,35,37,39,42,47,48,49,50,53,54,56,57,58,
  59,71,75,80,100,120,
79,0,
79,0,
124,123,122,121,116,115,91,85,83,79,76,72,70,66,61,0,1,86,87,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,26,32,35,37,39,42,47,48,49,
  50,53,54,56,57,58,59,71,75,80,100,120,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,15,24,26,32,35,37,39,42,47,
  48,49,50,53,54,56,57,58,59,71,75,80,100,120,
98,90,0,16,25,
124,123,122,121,116,115,91,85,79,76,72,0,2,3,14,15,24,26,32,35,37,39,42,47,
  48,49,50,53,54,56,57,58,59,71,75,80,100,120,
98,89,0,17,25,
124,123,122,121,116,115,97,95,94,93,92,91,90,85,79,76,72,0,2,3,8,9,10,12,13,
  14,15,16,18,19,20,21,22,24,26,32,35,37,39,42,47,48,49,50,53,54,56,57,58,
  59,71,75,80,100,120,

};


static unsigned const char ag_astt[2635] = {
  8,8,8,8,8,8,8,8,8,8,8,8,8,8,1,8,8,8,1,1,1,8,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,8,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,8,7,1,1,9,9,1,1,5,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,7,0,1,9,9,9,9,9,
  9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,5,3,7,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
  9,9,9,9,9,9,5,3,7,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,2,7,2,1,2,2,2,1,1,1,1,
  1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,2,5,5,5,5,5,
  5,5,5,5,5,5,5,5,5,5,5,5,5,5,10,1,5,5,5,5,7,3,1,4,5,5,5,5,5,5,1,5,5,5,1,1,1,
  7,1,1,3,5,5,5,5,5,5,5,5,1,5,5,5,1,1,1,7,1,1,3,5,1,1,1,1,7,1,1,3,5,1,1,1,1,
  7,1,1,3,5,1,1,1,1,7,1,1,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,1,1,7,1,
  1,3,1,1,1,1,1,2,2,1,2,7,2,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,7,
  2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,7,1,1,7,1,5,5,
  5,5,5,5,5,5,1,5,5,5,1,1,1,7,1,1,3,5,5,5,5,5,5,5,5,1,5,5,5,1,1,1,7,1,1,3,1,
  5,1,1,1,1,1,1,1,1,2,2,1,2,7,2,2,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,2,2,1,2,7,2,2,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,5,1,1,1,1,1,1,
  5,1,1,1,1,1,1,1,5,1,1,1,10,10,10,4,1,5,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
  5,5,5,5,5,5,1,1,1,1,7,1,1,3,1,5,1,1,1,1,1,1,4,1,1,1,1,1,5,5,5,5,5,5,5,5,5,
  5,5,5,5,5,5,1,5,5,5,1,1,1,7,1,1,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,5,5,5,
  1,1,1,5,7,1,1,3,5,1,1,1,1,7,1,1,3,5,1,1,1,1,7,1,1,3,5,5,5,5,5,5,5,5,5,5,5,
  5,5,5,1,5,5,5,1,1,1,7,1,1,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,7,1,1,1,7,
  2,1,5,1,1,1,1,7,1,1,3,1,7,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,7,2,1,
  1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,7,2,1,2,2,1,1,1,1,1,2,2,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,
  7,2,1,2,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,4,2,1,5,2,1,1,8,7,1,1,1,7,2,1,1,1,1,1,1,1,1,2,2,1,2,7,2,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,7,2,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,7,2,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,1,5,5,5,1,1,1,7,1,1,3,
  1,1,1,1,1,1,1,2,2,1,2,7,2,2,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,
  1,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,1,2,7,2,2,1,1,1,2,2,1,1,1,1,1,1,1,
  1,1,1,5,5,5,5,5,5,5,5,1,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,1,2,7,2,2,1,
  1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,7,2,2,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,7,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  5,5,5,5,5,5,5,5,1,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,1,2,7,2,2,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,1,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,
  1,1,2,2,1,2,7,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,1,5,5,
  5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,1,2,7,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,5,5,5,5,5,5,5,5,1,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,1,2,7,2,2,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,1,5,5,5,1,1,1,7,1,1,3,1,1,1,
  1,1,1,1,2,2,1,2,7,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,
  1,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,1,2,7,2,2,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,5,5,5,5,5,5,5,5,1,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,1,2,7,
  2,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,1,5,5,5,1,1,1,
  7,1,1,3,1,1,1,1,1,1,1,2,2,1,2,7,2,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,5,5,5,5,5,5,5,5,1,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,1,2,7,2,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,1,5,5,5,1,1,1,
  7,1,1,3,1,1,1,1,1,1,1,2,2,1,2,7,2,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,5,5,5,5,5,5,5,5,1,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,1,2,7,2,1,
  1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,1,5,5,5,1,1,
  1,7,1,1,3,1,1,1,1,1,1,1,2,2,1,2,7,2,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,5,5,5,5,5,5,5,5,1,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,1,2,7,2,
  1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,1,5,5,5,1,
  1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,1,2,7,2,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,7,2,1,2,2,2,1,1,1,1,1,2,2,
  1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,1,5,
  5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,1,2,7,2,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,7,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,2,2,1,2,7,2,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,2,7,1,2,7,1,5,5,5,5,5,5,5,5,5,5,5,5,
  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,5,5,5,1,1,1,7,1,1,3,1,7,2,1,7,2,1,7,2,
  1,1,4,1,1,1,1,4,1,1,1,1,4,1,1,1,1,4,1,1,1,1,4,1,1,1,1,4,1,1,1,1,1,1,4,1,1,
  1,1,1,1,1,1,4,1,1,1,1,1,1,7,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,5,5,5,1,
  1,1,5,7,1,1,3,1,1,7,2,1,1,1,7,2,1,1,7,2,1,1,7,1,1,5,5,5,5,5,5,5,5,5,5,5,5,
  5,5,1,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,7,2,1,2,2,1,1,
  1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,10,4,10,4,5,
  5,5,5,5,5,5,5,1,5,5,5,1,1,1,7,1,1,3,1,1,1,1,1,1,1,2,2,1,2,7,2,2,1,2,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,7,2,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,2,2,1,2,7,2,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,2,2,1,2,7,2,1,2,2,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1
};


static const unsigned char ag_pstt[] = {
4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,4,4,4,3,1,2,4,0,3,3,4,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,1,5,6,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,2,7,8,
143,143,1,2,145,143,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,0,9,
67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,69,
70,6,
62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,64,
65,8,
13,15,16,17,25,24,38,40,41,42,45,14,39,88,81,10,88,1,9,53,37,3,3,3,51,50,49,
  20,44,18,3,48,47,46,43,44,44,36,34,32,31,30,29,27,28,29,29,26,23,22,21,
  19,12,11,33,35,18,
52,10,80,
77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,82,53,77,77,77,77,
  11,79,
54,71,
144,144,144,144,144,144,3,144,144,144,3,1,2,13,3,3,182,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,14,3,3,149,
144,3,3,1,2,15,3,3,181,
144,3,3,1,2,16,3,3,180,
144,3,3,1,2,17,3,3,179,
144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,3,3,
  1,2,18,3,3,178,
13,15,16,17,14,88,81,10,88,19,53,54,20,59,23,22,21,19,12,11,33,35,18,
13,15,16,17,25,24,14,88,81,10,88,20,53,37,20,55,55,55,36,34,32,31,30,29,27,
  28,29,29,26,23,22,21,19,12,11,33,35,18,
14,21,56,
14,22,57,
14,23,58,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,24,3,3,173,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,25,3,3,174,
59,51,60,
13,15,16,17,25,24,14,88,81,10,88,27,53,54,20,27,28,50,50,26,23,22,21,19,12,
  11,33,35,18,
13,15,16,17,25,24,14,88,81,10,88,28,53,54,20,27,28,49,49,26,23,22,21,19,12,
  11,33,35,18,
61,63,42,64,62,
25,24,37,66,65,
67,69,71,73,34,74,72,70,68,
75,77,79,32,80,78,76,
89,89,89,87,
81,30,82,
144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
  144,144,144,144,3,3,1,2,35,3,3,158,
83,28,84,
85,87,89,91,93,54,94,92,90,88,86,
144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,3,144,144,144,3,
  1,2,38,3,3,155,
144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,3,144,144,
  144,3,1,2,144,39,3,3,148,
144,3,3,1,2,40,3,3,153,
144,3,3,1,2,41,3,3,152,
144,144,144,144,144,144,144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,
  42,3,3,151,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,43,95,
96,39,44,17,97,
144,3,3,1,2,45,3,3,150,
14,46,98,
14,47,99,
13,15,16,17,25,24,38,40,41,42,45,14,39,88,81,10,88,48,53,37,100,100,100,51,
  50,49,20,44,18,100,48,47,46,43,44,44,36,34,32,31,30,29,27,28,29,29,26,
  23,22,21,19,12,11,33,35,18,
14,49,101,
13,15,16,17,25,24,38,40,41,42,45,14,39,88,81,10,88,50,53,37,8,12,51,50,49,
  20,44,18,12,48,47,46,43,44,44,36,34,32,31,30,29,27,28,29,29,26,23,22,21,
  19,12,11,33,35,18,
13,15,16,17,25,24,38,40,41,42,45,14,39,88,81,10,88,51,53,37,6,6,102,51,50,
  49,20,44,18,102,48,47,46,43,44,44,36,34,32,31,30,29,27,28,29,29,26,23,
  22,21,19,12,11,33,35,18,
52,83,84,
52,78,76,
103,104,104,54,104,
96,105,55,58,97,
13,15,16,17,25,24,14,88,81,10,88,56,53,37,20,106,106,36,34,32,31,30,29,27,
  28,29,29,26,23,22,21,19,12,11,33,35,18,
13,15,16,17,25,24,14,88,81,10,88,57,53,37,20,107,107,36,34,32,31,30,29,27,
  28,29,29,26,23,22,21,19,12,11,33,35,18,
13,15,16,17,25,24,14,88,81,10,88,58,53,37,20,108,108,36,34,32,31,30,29,27,
  28,29,29,26,23,22,21,19,12,11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,59,3,3,177,
13,15,16,17,25,24,14,88,81,10,88,60,53,54,20,27,28,52,52,26,23,22,21,19,12,
  11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,61,3,3,176,
13,15,16,17,25,24,14,88,81,10,88,62,53,54,20,27,28,47,47,26,23,22,21,19,12,
  11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,63,3,3,175,
13,15,16,17,25,24,14,88,81,10,88,64,53,54,20,27,28,46,46,26,23,22,21,19,12,
  11,33,35,18,
13,15,16,17,25,24,14,88,81,10,88,65,53,54,20,109,27,28,109,109,26,23,22,21,
  19,12,11,33,35,18,
13,15,16,17,25,24,14,88,81,10,88,66,53,54,20,110,27,28,110,110,26,23,22,21,
  19,12,11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,67,3,3,172,
13,15,16,17,25,24,14,88,81,10,88,68,53,54,20,111,29,27,28,29,29,26,23,22,21,
  19,12,11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,69,3,3,171,
13,15,16,17,25,24,14,88,81,10,88,70,53,54,20,112,29,27,28,29,29,26,23,22,21,
  19,12,11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,71,3,3,170,
13,15,16,17,25,24,14,88,81,10,88,72,53,54,20,113,29,27,28,29,29,26,23,22,21,
  19,12,11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,73,3,3,169,
13,15,16,17,25,24,14,88,81,10,88,74,53,54,20,114,29,27,28,29,29,26,23,22,21,
  19,12,11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,75,3,3,168,
13,15,16,17,25,24,14,88,81,10,88,76,53,54,20,115,30,29,27,28,29,29,26,23,22,
  21,19,12,11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,77,3,3,167,
13,15,16,17,25,24,14,88,81,10,88,78,53,54,20,116,30,29,27,28,29,29,26,23,22,
  21,19,12,11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,79,3,3,166,
13,15,16,17,25,24,14,88,81,10,88,80,53,54,20,33,32,31,30,29,27,28,29,29,26,
  23,22,21,19,12,11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,81,3,3,165,
13,15,16,17,25,24,14,88,81,10,88,82,53,54,20,31,34,32,31,30,29,27,28,29,29,
  26,23,22,21,19,12,11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,83,3,3,164,
13,15,16,17,25,24,14,88,81,10,88,84,53,37,20,117,117,117,36,34,32,31,30,29,
  27,28,29,29,26,23,22,21,19,12,11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,85,3,3,162,
13,15,16,17,25,24,14,88,81,10,88,86,53,37,20,27,27,36,34,32,31,30,29,27,28,
  29,29,26,23,22,21,19,12,11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,87,3,3,161,
13,15,16,17,25,24,14,88,81,10,88,88,53,37,20,26,26,36,34,32,31,30,29,27,28,
  29,29,26,23,22,21,19,12,11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,89,3,3,160,
13,15,16,17,25,24,14,88,81,10,88,90,53,37,20,25,25,36,34,32,31,30,29,27,28,
  29,29,26,23,22,21,19,12,11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,91,3,3,159,
13,15,16,17,25,24,14,88,81,10,88,92,53,37,20,24,24,36,34,32,31,30,29,27,28,
  29,29,26,23,22,21,19,12,11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,93,3,3,157,
13,15,16,17,25,24,14,88,81,10,88,94,53,37,20,23,23,36,34,32,31,30,29,27,28,
  29,29,26,23,22,21,19,12,11,33,35,18,
13,15,16,17,25,24,38,118,40,41,42,45,14,39,88,81,10,88,95,53,37,3,3,3,51,50,
  49,20,44,18,3,48,47,46,43,19,44,44,36,34,32,31,30,29,27,28,29,29,26,23,
  22,21,19,12,11,33,35,18,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,96,3,3,156,
13,15,16,17,25,24,14,88,81,10,88,97,53,37,20,21,21,36,34,32,31,30,29,27,28,
  29,29,26,23,22,21,19,12,11,33,35,18,
13,15,16,17,25,24,14,88,81,10,88,98,53,37,20,119,119,119,36,34,32,31,30,29,
  27,28,29,29,26,23,22,21,19,12,11,33,35,18,
13,15,16,17,25,24,14,88,81,10,88,99,53,37,20,120,120,120,36,34,32,31,30,29,
  27,28,29,29,26,23,22,21,19,12,11,33,35,18,
40,100,121,46,
13,15,16,17,25,24,14,88,81,10,88,101,53,37,20,122,122,122,36,34,32,31,30,29,
  27,28,29,29,26,23,22,21,19,12,11,33,35,18,
123,5,124,
85,103,125,
85,104,126,
144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,
  144,144,144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,105,3,3,147,
105,106,57,
105,107,56,
105,108,55,
61,63,44,64,62,
61,63,43,64,62,
25,24,41,66,65,
25,24,40,66,65,
25,24,39,66,65,
25,24,38,66,65,
67,69,71,73,36,74,72,70,68,
67,69,71,73,35,74,72,70,68,
127,96,117,97,128,
144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,3,144,144,
  144,3,1,2,144,118,3,3,154,
96,105,119,16,97,
96,105,120,15,97,
39,121,13,
96,39,122,129,97,
144,144,144,144,144,144,144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,
  123,3,3,146,
13,15,16,17,25,24,38,40,41,42,45,14,39,88,81,10,88,124,53,37,7,11,51,50,49,
  20,44,18,11,48,47,46,43,44,44,36,34,32,31,30,29,27,28,29,29,26,23,22,21,
  19,12,11,33,35,18,
86,75,
86,74,
144,144,144,144,144,144,144,144,3,144,144,144,3,1,2,127,3,3,163,
13,15,16,17,25,24,14,88,81,10,88,128,53,54,20,29,36,34,32,31,30,29,27,28,29,
  29,26,23,22,21,19,12,11,33,35,18,
13,15,16,17,25,24,14,88,81,10,88,129,53,37,20,130,130,130,36,34,32,31,30,29,
  27,28,29,29,26,23,22,21,19,12,11,33,35,18,
96,39,130,131,97,
13,15,16,17,25,24,14,88,81,10,88,131,53,37,20,132,132,132,36,34,32,31,30,29,
  27,28,29,29,26,23,22,21,19,12,11,33,35,18,
96,105,132,133,97,
13,15,16,17,25,24,38,40,41,42,45,14,39,88,81,10,88,133,53,37,9,14,51,50,49,
  20,44,18,14,48,47,46,43,44,44,36,34,32,31,30,29,27,28,29,29,26,23,22,21,
  19,12,11,33,35,18,

};


static const unsigned short ag_sbt[] = {
     0,  26,  52,  79,  85, 106, 129, 131, 155, 157, 214, 217, 244, 246,
   263, 282, 291, 300, 309, 335, 358, 396, 399, 402, 405, 424, 443, 446,
   475, 504, 509, 514, 523, 530, 534, 537, 568, 571, 582, 608, 636, 645,
   654, 679, 699, 704, 713, 716, 719, 775, 778, 833, 889, 892, 895, 900,
   905, 942, 979,1016,1035,1064,1083,1112,1131,1160,1190,1220,1239,1270,
  1289,1320,1339,1370,1389,1420,1439,1471,1490,1522,1541,1575,1594,1629,
  1648,1686,1705,1742,1761,1798,1817,1854,1873,1910,1929,1966,2024,2043,
  2080,2118,2156,2160,2198,2201,2204,2207,2247,2250,2253,2256,2261,2266,
  2271,2276,2281,2286,2295,2304,2309,2337,2342,2347,2350,2355,2380,2435,
  2437,2439,2458,2494,2532,2537,2575,2580,2635
};


static const unsigned short ag_sbe[] = {
    22,  49,  76,  83, 103, 128, 130, 154, 156, 175, 215, 242, 245, 259,
   278, 287, 296, 305, 331, 344, 369, 397, 400, 403, 420, 439, 444, 457,
   486, 506, 511, 518, 526, 533, 535, 564, 569, 576, 604, 632, 641, 650,
   675, 697, 701, 709, 714, 717, 736, 776, 795, 850, 890, 893, 898, 902,
   916, 953, 990,1031,1046,1079,1094,1127,1142,1171,1201,1235,1250,1285,
  1300,1335,1350,1385,1400,1435,1450,1486,1501,1537,1552,1590,1605,1644,
  1659,1701,1716,1757,1772,1813,1828,1869,1884,1925,1940,1984,2039,2054,
  2091,2129,2157,2171,2199,2202,2205,2243,2248,2251,2254,2258,2263,2268,
  2273,2278,2283,2290,2299,2306,2333,2339,2344,2348,2352,2376,2397,2436,
  2438,2454,2469,2505,2534,2548,2577,2597,2635
};


static const unsigned char ag_fl[] = {
  2,2,0,2,1,1,2,4,2,9,1,4,2,4,9,4,4,2,1,3,1,3,1,3,3,3,3,3,1,5,1,3,1,3,1,
  3,3,1,3,3,3,3,1,3,3,1,3,3,1,2,2,1,3,1,1,4,4,4,3,2,1,1,2,0,1,3,1,2,0,1,
  3,1,0,1,4,4,3,0,1,2,2,1,2,1,2,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  1,1,1,2,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
  2,2,2,2,2,2,2,2
};

static const unsigned char ag_ptt[] = {
    0,  4,  5,  5,  7,  7,  8,  8,  8,  8,  9,  9,  9,  9,  9, 10, 12, 18,
   18, 18, 15, 15, 24, 24, 24, 24, 24, 24, 26, 26, 32, 32, 35, 35, 37, 37,
   37, 39, 39, 39, 39, 39, 42, 42, 42, 47, 47, 47, 50, 50, 50, 53, 53, 54,
   54, 54, 54, 54, 54, 54,  1, 63, 63, 64, 64,  1, 68, 68, 69, 69,  1,120,
   73, 73,120,120, 71, 78, 78, 71, 71, 75, 75, 77, 77, 74, 74,100, 80, 80,
   60, 60, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
   62, 62, 62, 62, 62, 62, 62, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
   67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 81, 81, 82, 82, 82, 86, 86,
   87, 87, 11, 17, 16, 14, 13, 19, 20, 21, 23, 22, 25, 27,  3, 28, 29, 30,
   31, 34, 33, 36, 38, 40, 41, 43, 44, 45, 46, 48, 49, 51, 52, 55,  2, 56,
   57, 58, 59
};


static void ag_ra(PCB_DECL)
{
  switch(ag_rpx[(PCB).ag_ap]) {
    case 1: VRO(AG_WRAP_4 *, ag_rp_1(PCB_POINTER, VW(0, AG_WRAP_4 *))); break;
    case 2: VNO AG_WRAP_4(ag_rp_2(PCB_POINTER)); break;
    case 3: VRO(AG_WRAP_4 *, ag_rp_3(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(1, AG_WRAP_4 *))); 
            VWD(1, AG_WRAP_4 *); break;
    case 4: VRO(AG_WRAP_4 *, ag_rp_4(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(1, AG_WRAP_4 *))); 
            VWD(1, AG_WRAP_4 *); break;
    case 5: VRO(AG_WRAP_4 *, ag_rp_5(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(1, AG_WRAP_4 *), VW(3, AG_WRAP_4 *))); 
            VWD(1, AG_WRAP_4 *); VWD(3, AG_WRAP_4 *); break;
    case 6: VRO(AG_WRAP_4 *, ag_rp_6(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(1, AG_WRAP_4 *))); 
            VWD(1, AG_WRAP_4 *); break;
    case 7: VNO AG_WRAP_4(ag_rp_7(PCB_POINTER, VW(2, AG_WRAP_4 *), VW(4, AG_WRAP_4 *), VW(6, AG_WRAP_4 *), VW(8, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); VWD(4, AG_WRAP_4 *); VWD(6, AG_WRAP_4 *); VWD(8, AG_WRAP_4 *); break;
    case 8: VRO(AG_WRAP_4 *, ag_rp_8(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(1, AG_WRAP_4 *), VW(3, AG_WRAP_4 *))); 
            VWD(1, AG_WRAP_4 *); VWD(3, AG_WRAP_4 *); break;
    case 9: VRO(AG_WRAP_4 *, ag_rp_9(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(1, AG_WRAP_4 *))); 
            VWD(1, AG_WRAP_4 *); break;
    case 10: VNO AG_WRAP_4(ag_rp_10(PCB_POINTER, VW(1, AG_WRAP_4 *), VW(2, AG_WRAP_4 *))); 
            VWD(1, AG_WRAP_4 *); VWD(2, AG_WRAP_4 *); break;
    case 11: VNO AG_WRAP_4(ag_rp_11(PCB_POINTER, VW(2, AG_WRAP_4 *), VW(4, AG_WRAP_4 *), VW(6, AG_WRAP_4 *), VW(8, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); VWD(4, AG_WRAP_4 *); VWD(6, AG_WRAP_4 *); VWD(8, AG_WRAP_4 *); break;
    case 12: VNO AG_WRAP_4(ag_rp_12(PCB_POINTER, VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 13: VNO AG_WRAP_4(ag_rp_13(PCB_POINTER, VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 14: VRO(AG_WRAP_4 *, ag_rp_14(PCB_POINTER, VW(0, AG_WRAP_4 *))); break;
    case 15: VNO AG_WRAP_4(ag_rp_15(PCB_POINTER)); break;
    case 16: VNO AG_WRAP_4(ag_rp_16(PCB_POINTER, VW(1, AG_WRAP_4 *))); 
            VWD(1, AG_WRAP_4 *); break;
    case 17: VRO(AG_WRAP_4 *, ag_rp_17(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 18: VNO AG_WRAP_4(ag_rp_18(PCB_POINTER, V(0,(int *)), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 19: VNO AG_WRAP_4(ag_rp_19(PCB_POINTER, V(0,(int *)), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 20: VNO AG_WRAP_4(ag_rp_20(PCB_POINTER, V(0,(int *)), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 21: VNO AG_WRAP_4(ag_rp_21(PCB_POINTER, V(0,(int *)), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 22: VNO AG_WRAP_4(ag_rp_22(PCB_POINTER, V(0,(int *)), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 23: VRO(AG_WRAP_4 *, ag_rp_23(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(2, AG_WRAP_4 *), VW(4, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); VWD(4, AG_WRAP_4 *); break;
    case 24: VRO(AG_WRAP_4 *, ag_rp_24(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 25: VRO(AG_WRAP_4 *, ag_rp_25(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 26: VRO(AG_WRAP_4 *, ag_rp_26(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 27: VRO(AG_WRAP_4 *, ag_rp_27(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 28: VRO(AG_WRAP_4 *, ag_rp_28(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 29: VRO(AG_WRAP_4 *, ag_rp_29(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 30: VRO(AG_WRAP_4 *, ag_rp_30(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 31: VRO(AG_WRAP_4 *, ag_rp_31(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 32: VRO(AG_WRAP_4 *, ag_rp_32(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 33: VRO(AG_WRAP_4 *, ag_rp_33(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 34: VRO(AG_WRAP_4 *, ag_rp_34(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 35: VRO(AG_WRAP_4 *, ag_rp_35(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 36: VNO AG_WRAP_4(ag_rp_36(PCB_POINTER, VW(1, AG_WRAP_4 *))); 
            VWD(1, AG_WRAP_4 *); break;
    case 37: VNO AG_WRAP_4(ag_rp_37(PCB_POINTER, VW(1, AG_WRAP_4 *))); 
            VWD(1, AG_WRAP_4 *); break;
    case 38: VRO(AG_WRAP_4 *, ag_rp_38(PCB_POINTER, VW(0, AG_WRAP_4 *), VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 39: VNO AG_WRAP_4(ag_rp_39(PCB_POINTER, V(0,(int *)))); break;
    case 40: VNO AG_WRAP_4(ag_rp_40(PCB_POINTER, V(0,(int *)))); break;
    case 41: VNO AG_WRAP_4(ag_rp_41(PCB_POINTER, VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 42: VNO AG_WRAP_4(ag_rp_42(PCB_POINTER, VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 43: VNO AG_WRAP_4(ag_rp_43(PCB_POINTER, VW(2, AG_WRAP_4 *))); 
            VWD(2, AG_WRAP_4 *); break;
    case 44: VNO AG_WRAP_4(ag_rp_44(PCB_POINTER, VW(1, AG_WRAP_4 *))); 
            VWD(1, AG_WRAP_4 *); break;
    case 45: VNO AG_WRAP_4(ag_rp_45(PCB_POINTER, VW(1, AG_WRAP_4 *))); 
            VWD(1, AG_WRAP_4 *); break;
    case 46: V(0,(int *)) = ag_rp_46(PCB_POINTER, V(0,(double *))); break;
    case 47: V(0,(int *)) = ag_rp_47(PCB_POINTER, V(0,(double *)), V(3,(int *))); break;
    case 48: V(0,(int *)) = ag_rp_48(PCB_POINTER, V(0,(double *)), V(3,(int *))); break;
    case 49: V(0,(double *)) = ag_rp_49(PCB_POINTER, V(0,(double *)), V(2,(double *))); break;
    case 50: V(0,(double *)) = ag_rp_50(PCB_POINTER, V(1,(double *))); break;
    case 51: V(0,(double *)) = ag_rp_51(PCB_POINTER, V(0,(int *))); break;
    case 52: V(0,(double *)) = ag_rp_52(PCB_POINTER, V(0,(double *)), V(1,(int *))); break;
    case 53: V(0,(double *)) = ag_rp_53(PCB_POINTER, V(0,(int *))); break;
    case 54: V(0,(double *)) = ag_rp_54(PCB_POINTER, V(0,(int *)), V(1,(double *))); break;
    case 55: V(0,(int *)) = ag_rp_55(PCB_POINTER, V(0,(int *))); break;
    case 56: V(0,(int *)) = ag_rp_56(PCB_POINTER, V(0,(int *)), V(1,(int *))); break;
    case 57: V(0,(int *)) = ag_rp_57(PCB_POINTER); break;
    case 58: ag_rp_58(PCB_POINTER, V(0,(int *))); break;
    case 59: ag_rp_59(PCB_POINTER, V(1,(int *))); break;
  }
  (PCB).la_ptr = (PCB).pointer;
}

#define TOKEN_NAMES bciParse_token_names
const char *const bciParse_token_names[125] = {
  "input string",
  "white space",
  "real",
  "name",
  "input string",
  "statements",
  "eof",
  "statement",
  "open statement",
  "closed statement",
  "if clause",
  "\"else\"",
  "while clause",
  "\"for\"",
  "'('",
  "expression",
  "';'",
  "')'",
  "simple statement",
  "\"do\"",
  "\"if\"",
  "\"while\"",
  "'{'",
  "'}'",
  "assignment expression",
  "','",
  "conditional expression",
  "'='",
  "\"+=\"",
  "\"-=\"",
  "\"*=\"",
  "\"/=\"",
  "logical or expression",
  "'\\?'",
  "':'",
  "logical and expression",
  "\"||\"",
  "equality expression",
  "\"&&\"",
  "relational expression",
  "\"==\"",
  "\"!=\"",
  "additive expression",
  "'<'",
  "\"<=\"",
  "'>'",
  "\">=\"",
  "multiplicative expression",
  "'+'",
  "'-'",
  "unary expression",
  "'*'",
  "'/'",
  "factor",
  "primary",
  "\"**\"",
  "\"log\"",
  "\"exp\"",
  "\"sqrt\"",
  "'!'",
  "",
  "\"/*\"",
  "",
  "",
  "",
  "\"*/\"",
  "\"//\"",
  "",
  "",
  "",
  "'\\n'",
  "simple real",
  "",
  "",
  "exponent",
  "integer part",
  "'.'",
  "fraction part",
  "",
  "digit",
  "name string",
  "letter",
  "",
  "",
  "",
  "",
  "",
  "",
  "\"else\"",
  "')'",
  "';'",
  "'('",
  "\"for\"",
  "\"do\"",
  "\"if\"",
  "\"while\"",
  "'}'",
  "'{'",
  "','",
  "'='",
  "name",
  "\"+=\"",
  "\"-=\"",
  "\"*=\"",
  "\"/=\"",
  "':'",
  "'\\?'",
  "\"||\"",
  "\"&&\"",
  "\"==\"",
  "\"!=\"",
  "'<'",
  "\"<=\"",
  "'>'",
  "\">=\"",
  "'+'",
  "'-'",
  "'*'",
  "'/'",
  "\"**\"",
  "real",
  "\"log\"",
  "\"exp\"",
  "\"sqrt\"",
  "'!'",

};

#ifndef MISSING_FORMAT
#define MISSING_FORMAT "Missing %s"
#endif
#ifndef UNEXPECTED_FORMAT
#define UNEXPECTED_FORMAT "Unexpected %s"
#endif
#ifndef UNNAMED_TOKEN
#define UNNAMED_TOKEN "input"
#endif


static void ag_diagnose(PCB_DECL) {
  int ag_snd = (PCB).sn;
  int ag_k = ag_sbt[ag_snd];

  if (*TOKEN_NAMES[ag_tstt[ag_k]] && ag_astt[ag_k + 1] == ag_action_8) {
    sprintf((PCB).ag_msg, MISSING_FORMAT, TOKEN_NAMES[ag_tstt[ag_k]]);
  }
  else if (ag_astt[ag_sbe[(PCB).sn]] == ag_action_8
          && (ag_k = (int) ag_sbe[(PCB).sn] + 1) == (int) ag_sbt[(PCB).sn+1] - 1
          && *TOKEN_NAMES[ag_tstt[ag_k]]) {
    sprintf((PCB).ag_msg, MISSING_FORMAT, TOKEN_NAMES[ag_tstt[ag_k]]);
  }
  else if ((PCB).token_number && *TOKEN_NAMES[(PCB).token_number]) {
    sprintf((PCB).ag_msg, UNEXPECTED_FORMAT, TOKEN_NAMES[(PCB).token_number]);
  }
  else if (isprint(INPUT_CODE((*(PCB).pointer))) && INPUT_CODE((*(PCB).pointer)) != '\\') {
    char buf[20];
    sprintf(buf, "\'%c\'", (char) INPUT_CODE((*(PCB).pointer)));
    sprintf((PCB).ag_msg, UNEXPECTED_FORMAT, buf);
  }
  else sprintf((PCB).ag_msg, UNEXPECTED_FORMAT, UNNAMED_TOKEN);
  (PCB).error_message = (PCB).ag_msg;


}
static int ag_action_1_r_proc(PCB_DECL);
static int ag_action_2_r_proc(PCB_DECL);
static int ag_action_3_r_proc(PCB_DECL);
static int ag_action_4_r_proc(PCB_DECL);
static int ag_action_1_s_proc(PCB_DECL);
static int ag_action_3_s_proc(PCB_DECL);
static int ag_action_1_proc(PCB_DECL);
static int ag_action_2_proc(PCB_DECL);
static int ag_action_3_proc(PCB_DECL);
static int ag_action_4_proc(PCB_DECL);
static int ag_action_5_proc(PCB_DECL);
static int ag_action_6_proc(PCB_DECL);
static int ag_action_7_proc(PCB_DECL);
static int ag_action_8_proc(PCB_DECL);
static int ag_action_9_proc(PCB_DECL);
static int ag_action_10_proc(PCB_DECL);
static int ag_action_11_proc(PCB_DECL);
static int ag_action_8_proc(PCB_DECL);


static int (*const  ag_r_procs_scan[])(PCB_DECL) = {
  ag_action_1_r_proc,
  ag_action_2_r_proc,
  ag_action_3_r_proc,
  ag_action_4_r_proc
};

static int (*const  ag_s_procs_scan[])(PCB_DECL) = {
  ag_action_1_s_proc,
  ag_action_2_r_proc,
  ag_action_3_s_proc,
  ag_action_4_r_proc
};

static int (*const  ag_gt_procs_scan[])(PCB_DECL) = {
  ag_action_1_proc,
  ag_action_2_proc,
  ag_action_3_proc,
  ag_action_4_proc,
  ag_action_5_proc,
  ag_action_6_proc,
  ag_action_7_proc,
  ag_action_8_proc,
  ag_action_9_proc,
  ag_action_10_proc,
  ag_action_11_proc,
  ag_action_8_proc
};


static int ag_action_10_proc(PCB_DECL) {
  int ag_t = (PCB).token_number;
  (PCB).btsx = 0, (PCB).drt = -1;
  do {
    ag_track(PCB_POINTER);
    (PCB).token_number = (bciParse_token_type) AG_TCV(INPUT_CODE(*(PCB).la_ptr));
    (PCB).la_ptr++;
    if (ag_key_index[(PCB).sn]) {
      unsigned ag_k = ag_key_index[(PCB).sn];
      int ag_ch = CONVERT_CASE(INPUT_CODE(*(PCB).pointer));
      if (ag_ch <= 255) {
        while (ag_key_ch[ag_k] < ag_ch) ag_k++;
        if (ag_key_ch[ag_k] == ag_ch) ag_get_key_word((PCB_TYPE *)PCB_POINTER, ag_k);
      }
    }
  } while ((PCB).token_number == (bciParse_token_type) ag_t);
  (PCB).la_ptr =  (PCB).pointer;
  return 1;
}

static int ag_action_11_proc(PCB_DECL) {
  int ag_t = (PCB).token_number;

  (PCB).btsx = 0, (PCB).drt = -1;
  do {
    (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).pointer;
    (PCB).ssx--;
    ag_track(PCB_POINTER);
    ag_ra(PCB_POINTER);
    if ((PCB).exit_flag != AG_RUNNING_CODE) return 0;
    (PCB).ssx++;
    (PCB).token_number = (bciParse_token_type) AG_TCV(INPUT_CODE(*(PCB).la_ptr));
    (PCB).la_ptr++;
    if (ag_key_index[(PCB).sn]) {
      unsigned ag_k = ag_key_index[(PCB).sn];
      int ag_ch = CONVERT_CASE(INPUT_CODE(*(PCB).pointer));
      if (ag_ch <= 255) {
        while (ag_key_ch[ag_k] < ag_ch) ag_k++;
        if (ag_key_ch[ag_k] == ag_ch) ag_get_key_word((PCB_TYPE *)PCB_POINTER, ag_k);
      }
    }
  }
  while ((PCB).token_number == (bciParse_token_type) ag_t);
  (PCB).la_ptr =  (PCB).pointer;
  return 1;
}

static int ag_action_3_r_proc(PCB_DECL) {
  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  (PCB).btsx = 0, (PCB).drt = -1;
  (PCB).reduction_token = (bciParse_token_type) ag_ptt[(PCB).ag_ap];
  ag_ra(PCB_POINTER);
  return (PCB).exit_flag == AG_RUNNING_CODE;
}

static int ag_action_3_s_proc(PCB_DECL) {
  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  (PCB).btsx = 0, (PCB).drt = -1;
  (PCB).reduction_token = (bciParse_token_type) ag_ptt[(PCB).ag_ap];
  ag_ra(PCB_POINTER);
  return (PCB).exit_flag == AG_RUNNING_CODE;
}

static int ag_action_4_r_proc(PCB_DECL) {
  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  (PCB).reduction_token = (bciParse_token_type) ag_ptt[(PCB).ag_ap];
  return 1;
}

static int ag_action_2_proc(PCB_DECL) {
  (PCB).btsx = 0, (PCB).drt = -1;
  if ((PCB).ssx >= 128) {
    (PCB).exit_flag = AG_STACK_ERROR_CODE;
    PARSER_STACK_OVERFLOW;
  }
  (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).pointer;
  (PCB).ss[(PCB).ssx] = (PCB).sn;
  (PCB).ssx++;
  (PCB).sn = (PCB).ag_ap;
  ag_track(PCB_POINTER);
  return 0;
}

static int ag_action_9_proc(PCB_DECL) {
  if ((PCB).drt == -1) {
    (PCB).drt=(PCB).token_number;
    (PCB).dssx=(PCB).ssx;
    (PCB).dsn=(PCB).sn;
  }
  ag_prot(PCB_POINTER);
  (PCB).vs[(PCB).ssx] = ag_null_value;
  (PCB).ss[(PCB).ssx] = (PCB).sn;
  (PCB).ssx++;
  (PCB).sn = (PCB).ag_ap;
  (PCB).la_ptr =  (PCB).pointer;
  return (PCB).exit_flag == AG_RUNNING_CODE;
}

static int ag_action_2_r_proc(PCB_DECL) {
  (PCB).ssx++;
  (PCB).sn = (PCB).ag_ap;
  return 0;
}

static int ag_action_7_proc(PCB_DECL) {
  --(PCB).ssx;
  (PCB).la_ptr =  (PCB).pointer;
  (PCB).exit_flag = AG_SUCCESS_CODE;
  return 0;
}

static int ag_action_1_proc(PCB_DECL) {
  ag_track(PCB_POINTER);
  (PCB).exit_flag = AG_SUCCESS_CODE;
  return 0;
}

static int ag_action_1_r_proc(PCB_DECL) {
  (PCB).exit_flag = AG_SUCCESS_CODE;
  return 0;
}

static int ag_action_1_s_proc(PCB_DECL) {
  (PCB).exit_flag = AG_SUCCESS_CODE;
  return 0;
}

static int ag_action_4_proc(PCB_DECL) {
  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
  (PCB).reduction_token = (bciParse_token_type) ag_ptt[(PCB).ag_ap];
  (PCB).btsx = 0, (PCB).drt = -1;
  (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).pointer;
  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  else (PCB).ss[(PCB).ssx] = (PCB).sn;
  ag_track(PCB_POINTER);
  while ((PCB).exit_flag == AG_RUNNING_CODE) {
    unsigned ag_t1 = ag_sbe[(PCB).sn] + 1;
    unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1;
    do {
      unsigned ag_tx = (ag_t1 + ag_t2)/2;
      if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1;
      else ag_t2 = ag_tx;
    } while (ag_t1 < ag_t2);
    (PCB).ag_ap = ag_pstt[ag_t1];
    if ((ag_s_procs_scan[ag_astt[ag_t1]])(PCB_POINTER) == 0) break;
  }
  return 0;
}

static int ag_action_3_proc(PCB_DECL) {
  int ag_sd = ag_fl[(PCB).ag_ap] - 1;
  (PCB).btsx = 0, (PCB).drt = -1;
  (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).pointer;
  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  else (PCB).ss[(PCB).ssx] = (PCB).sn;
  ag_track(PCB_POINTER);
  (PCB).reduction_token = (bciParse_token_type) ag_ptt[(PCB).ag_ap];
  ag_ra(PCB_POINTER);
  while ((PCB).exit_flag == AG_RUNNING_CODE) {
    unsigned ag_t1 = ag_sbe[(PCB).sn] + 1;
    unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1;
    do {
      unsigned ag_tx = (ag_t1 + ag_t2)/2;
      if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1;
      else ag_t2 = ag_tx;
    } while (ag_t1 < ag_t2);
    (PCB).ag_ap = ag_pstt[ag_t1];
    if ((ag_s_procs_scan[ag_astt[ag_t1]])(PCB_POINTER) == 0) break;
  }
  return 0;
}

static int ag_action_8_proc(PCB_DECL) {
  ag_undo(PCB_POINTER);
  (PCB).la_ptr =  (PCB).pointer;
  (PCB).exit_flag = AG_SYNTAX_ERROR_CODE;
  ag_diagnose(PCB_POINTER);
  SYNTAX_ERROR;
  {(PCB).la_ptr = (PCB).pointer + 1; ag_track(PCB_POINTER);}
  return (PCB).exit_flag == AG_RUNNING_CODE;
}

static int ag_action_5_proc(PCB_DECL) {
  int ag_sd = ag_fl[(PCB).ag_ap];
  (PCB).btsx = 0, (PCB).drt = -1;
  if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  else {
    (PCB).ss[(PCB).ssx] = (PCB).sn;
  }
  (PCB).la_ptr =  (PCB).pointer;
  (PCB).reduction_token = (bciParse_token_type) ag_ptt[(PCB).ag_ap];
  ag_ra(PCB_POINTER);
  while ((PCB).exit_flag == AG_RUNNING_CODE) {
    unsigned ag_t1 = ag_sbe[(PCB).sn] + 1;
    unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1;
    do {
      unsigned ag_tx = (ag_t1 + ag_t2)/2;
      if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1;
      else ag_t2 = ag_tx;
    } while (ag_t1 < ag_t2);
    (PCB).ag_ap = ag_pstt[ag_t1];
    if ((ag_r_procs_scan[ag_astt[ag_t1]])(PCB_POINTER) == 0) break;
  }
  return (PCB).exit_flag == AG_RUNNING_CODE;
}

static int ag_action_6_proc(PCB_DECL) {
  int ag_sd = ag_fl[(PCB).ag_ap];
  (PCB).reduction_token = (bciParse_token_type) ag_ptt[(PCB).ag_ap];
  if ((PCB).drt == -1) {
    (PCB).drt=(PCB).token_number;
    (PCB).dssx=(PCB).ssx;
    (PCB).dsn=(PCB).sn;
  }
  if (ag_sd) {
    (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd];
  }
  else {
    ag_prot(PCB_POINTER);
    (PCB).vs[(PCB).ssx] = ag_null_value;
    (PCB).ss[(PCB).ssx] = (PCB).sn;
  }
  (PCB).la_ptr =  (PCB).pointer;
  while ((PCB).exit_flag == AG_RUNNING_CODE) {
    unsigned ag_t1 = ag_sbe[(PCB).sn] + 1;
    unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1;
    do {
      unsigned ag_tx = (ag_t1 + ag_t2)/2;
      if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1;
      else ag_t2 = ag_tx;
    } while (ag_t1 < ag_t2);
    (PCB).ag_ap = ag_pstt[ag_t1];
    if ((ag_r_procs_scan[ag_astt[ag_t1]])(PCB_POINTER) == 0) break;
  }
  return (PCB).exit_flag == AG_RUNNING_CODE;
}


void init_bciParse(bciParse_pcb_type *PCB_POINTER) {
  (PCB).la_ptr = (PCB).pointer;
  (PCB).ss[0] = (PCB).sn = (PCB).ssx = 0;
  (PCB).exit_flag = AG_RUNNING_CODE;
  (PCB).line = FIRST_LINE;
  (PCB).column = FIRST_COLUMN;
  (PCB).btsx = 0, (PCB).drt = -1;
}

void bciParse(bciParse_pcb_type *PCB_POINTER) {
  init_bciParse(PCB_POINTER);
  (PCB).exit_flag = AG_RUNNING_CODE;
  while ((PCB).exit_flag == AG_RUNNING_CODE) {
    unsigned ag_t1 = ag_sbt[(PCB).sn];
    if (ag_tstt[ag_t1]) {
      unsigned ag_t2 = ag_sbe[(PCB).sn] - 1;
      (PCB).token_number = (bciParse_token_type) AG_TCV(INPUT_CODE(*(PCB).la_ptr));
      (PCB).la_ptr++;
      if (ag_key_index[(PCB).sn]) {
        unsigned ag_k = ag_key_index[(PCB).sn];
        int ag_ch = CONVERT_CASE(INPUT_CODE(*(PCB).pointer));
        if (ag_ch <= 255) {
          while (ag_key_ch[ag_k] < ag_ch) ag_k++;
          if (ag_key_ch[ag_k] == ag_ch) ag_get_key_word((PCB_TYPE *)PCB_POINTER, ag_k);
        }
      }
      do {
        unsigned ag_tx = (ag_t1 + ag_t2)/2;
        if (ag_tstt[ag_tx] > (unsigned char)(PCB).token_number)
          ag_t1 = ag_tx + 1;
        else ag_t2 = ag_tx;
      } while (ag_t1 < ag_t2);
      if (ag_tstt[ag_t1] != (unsigned char)(PCB).token_number)
        ag_t1 = ag_sbe[(PCB).sn];
    }
    (PCB).ag_ap = ag_pstt[ag_t1];
    (ag_gt_procs_scan[ag_astt[ag_t1]])((PCB_TYPE *)PCB_POINTER);
  }
}