/
CVS/
boards/CVS/
clans/
gmc/CVS/
help/CVS/
include/CVS/
players/
progs/CVS/
races/CVS/
system/CVS/
text/
text/CVS/
todo/
todo/CVS/
units/CVS/
(* Yacc parser template (TP Yacc V3.0), V1.2 6-17-91 AG *)

(* global definitions: *)


uses YaccLib, LexLib, SysUtils, Classes, Strip, Windows;


const
  CONV_TO_INT = 1;
  CONV_TO_FLOAT = 2;
	CONV_TO_STRING = 3;
	
	SPECIAL_TRAP = 1;
	SPECIAL_SLEEP = 2;
	SPECIAL_WAIT = 3;
	SPECIAL_SIGNAL = 4;
	
	VARTYPE_FUNCTION = 1;
	VARTYPE_GLOBAL = 2;
	VARTYPE_LOCAL = 3;
	VARTYPE_PARAM = 4;


type 	Root = class
        lineNum : integer;
				typ : integer;
     	end;
	
			Expr = class(Root)
     	end;

			BoolExpr = class(Root)
			end;
	

			Expr_ConstInt = class(Expr)
				value : Integer;
			end;

			Expr_ConstFloat = class(Expr)
				value : Single;
			end;

      Expr_String = class(Expr)
        value : string;
      end;

			Expr_Neg = class(Expr)
        ex : Expr;
      end;

			Expr_Op = class(Expr)
				op : char;
        le, re : Expr;
			end;

			Expr_Bool = class(Expr)
        ex : BoolExpr;
			end;

			Expr_Seq = class(Expr)
				ex, seq : Expr;
			end;

			Expr_If = class(Expr)
        ce : BoolExpr;
        le, re : Expr;

				lThen, lElse, lAfter : Integer;
      end;

			Expr_Id = class(Expr)
        id : string;
      end;
		
      Expr_Assign = class(Expr)
        id, ex : Expr;
      end;

			Expr_Asm = class(Expr)
        line : string; 
      end;

			Expr_Func = class(Expr)
				id : string;
				displ : integer;
				body : Expr;
				lStart : integer;
      end;
      
      Expr_Return = class(Expr)
				id : string;
        ret : Expr;
      end;

			Expr_Call = class(Expr)
			  id : string;
				params : Expr;
			end;

			Expr_External = class(Expr)
				id : string;
				assoc : string;
      end;

			Expr_Conv = class(expr)
				ex : Expr;

				cnv : integer;
				originaltyp : integer;	
			end;
			
			Expr_Cast = class(expr)
			  ex : Expr;
			  desttype : integer;
			end;
			
			Expr_Special = class(Expr)
				spec : integer;
				ex : Expr;
			end;
			
			Expr_Loop = class(Expr)
			  lStart : integer;
			  init : Expr;
			  ce : BoolExpr;
			  step : Expr;
			  body : Expr;
			end;

	
			BoolExpr_Const = class(BoolExpr)
        value : boolean;
			end;

			BoolExpr_Id = class(BoolExpr)
        id : string;
			end;

			BoolExpr_And = class(BoolExpr)
        le, re : BoolExpr;
			end;

			BoolExpr_Or = class(BoolExpr)
        le, re : BoolExpr;
			end;

			BoolExpr_Rel = class(BoolExpr)
        op : string;
        le, re : Expr;
			end;


			Env_Entry = class
        id : string;
        typ : integer;
				lbl : integer;
		 		displ : integer;
		 		varTyp : integer;
      end;

var
    labelNum : integer;
    globalCount : integer;
    tmp, varName, varGlob : string;
		curFunction : string;
    varType : integer;
    environment : TList;
    f : textfile;


procedure startCompiler(root : Expr); forward;
procedure updateLabel(id : string; lbl : integer); forward;
procedure addEnvironment(lineNum : integer; id : string; typ, lbl, varTyp : integer); forward;
function lookupEnv(id : string) : Env_Entry; forward;
procedure compilerError(lineNum : integer; msg : string); forward;


const IDENTIFIER = 257;
const LINE = 258;
const INT = 259;
const FLOAT = 260;
const UMINUS = 261;
const ILLEGAL = 262;
const _IF = 263;
const _ELSE = 264;
const _ASM = 265;
const _TRUE = 266;
const _FALSE = 267;
const _AND = 268;
const _OR = 269;
const _RELGT = 270;
const _RELLT = 271;
const _RELGTE = 272;
const _RELLTE = 273;
const _RELEQ = 274;
const _RETURN = 275;
const _BREAK = 276;
const _CONTINUE = 277;
const _DO = 278;
const _SLEEP = 279;
const _WAIT = 280;
const _SIGNAL = 281;
const _WHILE = 282;
const _FOR = 283;
const _REQUIRE = 284;
const _VOID = 285;
const _BOOL = 286;
const _INT = 287;
const _FLOAT = 288;
const _STRING = 289;
const _EXTERNAL = 290;

type YYSType = record case Integer of
                 1 : ( yyBoolExpr : BoolExpr );
                 2 : ( yyExpr : Expr );
                 3 : ( yyInteger : Integer );
                 4 : ( yyShortString : ShortString );
                 5 : ( yySingle : Single );
               end(*YYSType*);

var yylval : YYSType;

function yylex : Integer; forward;

function yyparse : Integer;

var yystate, yysp, yyn : Integer;
    yys : array [1..yymaxdepth] of Integer;
    yyv : array [1..yymaxdepth] of YYSType;
    yyval : YYSType;

procedure yyaction ( yyruleno : Integer );
  (* local definitions: *)
begin
  (* actions: *)
  case yyruleno of
   1 : begin
       end;
   2 : begin
         yyaccept; 
       end;
   3 : begin
         startCompiler(yyv[yysp-0].yyExpr); 
       end;
   4 : begin
         yyerrok; 
       end;
   5 : begin
         yyval.yyExpr := nil; 
       end;
   6 : begin
         yyval.yyExpr := yyv[yysp-0].yyExpr; 
       end;
   7 : begin
         yyval.yyExpr := Expr_Seq.Create; Expr_Seq(yyval.yyExpr).seq := yyv[yysp-0].yyExpr; Expr_Seq(yyval.yyExpr).ex := yyv[yysp-1].yyExpr; 
       end;
   8 : begin
         yyval.yyExpr := nil; 
       end;
   9 : begin
         yyval.yyExpr := yyv[yysp-0].yyExpr; 
       end;
  10 : begin
         yyval.yyExpr := Expr_Seq.Create; Expr_Seq(yyval.yyExpr).seq := yyv[yysp-0].yyExpr; Expr_Seq(yyval.yyExpr).ex := yyv[yysp-1].yyExpr; 
       end;
  11 : begin
         yyval.yyExpr := nil; 
       end;
  12 : begin
         yyval.yyExpr := nil; 
       end;
  13 : begin
         yyval.yyExpr := nil; 
       end;
  14 : begin
         yyval.yyExpr := Expr_Return.Create; Expr_Return(yyval.yyExpr).ret := nil; Expr_Return(yyval.yyExpr).lineNum := yylineno; Expr_Return(yyval.yyExpr).id := curFunction; 
       end;
  15 : begin
         yyval.yyExpr := Expr_Return.Create; Expr_Return(yyval.yyExpr).ret := yyv[yysp-1].yyExpr; Expr_Return(yyval.yyExpr).lineNum := yylineno; Expr_Return(yyval.yyExpr).id := curFunction; 
       end;
  16 : begin
         yyval.yyExpr := Expr_Return.Create; Expr_Return(yyval.yyExpr).ret := yyv[yysp-2].yyExpr; Expr_Return(yyval.yyExpr).lineNum := yylineno; Expr_Return(yyval.yyExpr).id := curFunction; 
       end;
  17 : begin
         yyval.yyExpr := nil; 
       end;
  18 : begin
         yyval.yyExpr := yyv[yysp-0].yyExpr; 
       end;
  19 : begin
         yyval.yyExpr := nil;
         																											 		if (not FileExists(varName)) then
         																													  compilerError(yylineno, 'could not open include file ' + varName)
         																													else
         																													  begin																													
         																													  yyopen(varName);
         																														end;	
       end;
  20 : begin
         yyval.yyExpr := nil; 
       end;
  21 : begin
         yyval.yyExpr := yyv[yysp-0].yyExpr; if (yyval.yyExpr <> nil) then yyval.yyExpr.lineNum := yylineno; 
       end;
  22 : begin
         yyval.yyExpr := yyv[yysp-1].yyExpr; if (yyval.yyExpr <> nil) then yyval.yyExpr.lineNum := yylineno; 
       end;
  23 : begin
         yyval.yyExpr := Expr_If.Create; Expr_If(yyval.yyExpr).ce := yyv[yysp-4].yyBoolExpr;	yyval.yyExpr.lineNum := yylineno;
         																														Expr_If(yyval.yyExpr).le := yyv[yysp-2].yyExpr; Expr_If(yyval.yyExpr).re := yyv[yysp-0].yyExpr; 
         																														Expr_If(yyval.yyExpr).lThen := labelNum; inc(labelNum); 
         																														Expr_If(yyval.yyExpr).lElse := labelNum; inc(labelNum); 
         																														Expr_If(yyval.yyExpr).lAfter := labelNum; inc(labelNum); 
       end;
  24 : begin
         yyval.yyExpr := Expr_If.Create; Expr_If(yyval.yyExpr).ce := yyv[yysp-2].yyBoolExpr; yyval.yyExpr.lineNum := yylineno;	
         																														Expr_If(yyval.yyExpr).le := yyv[yysp-0].yyExpr; Expr_If(yyval.yyExpr).re := nil; 
         																														Expr_If(yyval.yyExpr).lThen := labelNum; inc(labelNum); 
         																														Expr_If(yyval.yyExpr).lAfter := labelNum; inc(labelNum); 
       end;
  25 : begin
         yyval.yyExpr := Expr_Loop.Create; Expr_Loop(yyval.yyExpr).init := yyv[yysp-6].yyExpr;
         				                                                    yyval.yyExpr.lineNum := yylineno; Expr_Loop(yyval.yyExpr).ce := yyv[yysp-4].yyBoolExpr;
         				                                                    Expr_Loop(yyval.yyExpr).lStart := labelNum; inc(labelNum);
         				                                                    Expr_Loop(yyval.yyExpr).step := yyv[yysp-2].yyExpr; Expr_Loop(yyval.yyExpr).body := yyv[yysp-0].yyExpr; 
       end;
  26 : begin
         yyval.yyExpr := Expr_Special.Create; yyval.yyExpr.lineNum := yylineno; Expr_Special(yyval.yyExpr).spec := SPECIAL_TRAP; yyval.yyExpr.lineNum := yylineno; Expr_Special(yyval.yyExpr).ex := yyv[yysp-1].yyExpr; 
       end;
  27 : begin
         yyval.yyExpr := Expr_Special.Create; yyval.yyExpr.lineNum := yylineno; Expr_Special(yyval.yyExpr).spec := SPECIAL_SLEEP; yyval.yyExpr.lineNum := yylineno; Expr_Special(yyval.yyExpr).ex := yyv[yysp-1].yyExpr; 
       end;
  28 : begin
         yyval.yyExpr := Expr_Special.Create; yyval.yyExpr.lineNum := yylineno; Expr_Special(yyval.yyExpr).spec := SPECIAL_WAIT; yyval.yyExpr.lineNum := yylineno; Expr_Special(yyval.yyExpr).ex := yyv[yysp-1].yyExpr; 
       end;
  29 : begin
         yyval.yyExpr := Expr_Special.Create; yyval.yyExpr.lineNum := yylineno; Expr_Special(yyval.yyExpr).spec := SPECIAL_SIGNAL; yyval.yyExpr.lineNum := yylineno; Expr_Special(yyval.yyExpr).ex := yyv[yysp-1].yyExpr; 
       end;
  30 : begin
         yyval.yyExpr := yyv[yysp-1].yyExpr; 
       end;
  31 : begin
         yyval.yyExpr := yyv[yysp-0].yyExpr; 
       end;
  32 : begin
         yyval.yyExpr := nil; 
       end;
  33 : begin
         yyval.yyExpr := nil; 
       end;
  34 : begin
         yyval.yyExpr := yyv[yysp-0].yyExpr; 
       end;
  35 : begin
         yyval.yyExpr := nil; 
       end;
  36 : begin
         yyval.yyExpr := nil; addEnvironment(yylineno, curFunction + ':' + varName, varType, -1, VARTYPE_PARAM); 
       end;
  37 : begin
         yyval.yyExpr := nil; 
       end;
  38 : begin
         yyval.yyExpr := yyv[yysp-0].yyExpr; 
       end;
  39 : begin
         yyval.yyExpr := Expr_Seq.Create; Expr_Seq(yyval.yyExpr).seq := yyv[yysp-0].yyExpr; Expr_Seq(yyval.yyExpr).ex := yyv[yysp-2].yyExpr; 
       end;
  40 : begin
         yyval.yyExpr := yyv[yysp-0].yyExpr; 
       end;
  41 : begin
         yyval.yyExpr := Expr_Seq.Create; Expr_Seq(yyval.yyExpr).seq := yyv[yysp-0].yyExpr; Expr_Seq(yyval.yyExpr).ex := yyv[yysp-1].yyExpr; 
       end;
  42 : begin
         yyval.yyExpr := Expr_Asm.Create; Expr_Asm(yyval.yyExpr).line := varName; 
       end;
  43 : begin
         yyval.yyExpr := Expr_Seq.Create; Expr_Seq(yyval.yyExpr).seq := nil; Expr_Seq(yyval.yyExpr).ex := nil; 
       end;
  44 : begin
         yyval.yyExpr := yyv[yysp-1].yyExpr;  
       end;
  45 : begin
         yyval.yyExpr := nil; 
       end;
  46 : begin
         yyval.yyExpr := yyv[yysp-0].yyExpr; 
       end;
  47 : begin
         yyval.yyExpr := Expr_Seq.Create; Expr_Seq(yyval.yyExpr).seq := yyv[yysp-0].yyExpr; Expr_Seq(yyval.yyExpr).ex := yyv[yysp-1].yyExpr; 
       end;
  48 : begin
         curFunction := varName;	 yyval.yyExpr := Expr_Func.Create; Expr_Func(yyval.yyExpr).id := curFunction;
         																				Expr_Func(yyval.yyExpr).lStart := labelNum; inc(labelNum);
         																				addEnvironment(yylineno, varName, varType, Expr_Func(yyval.yyExpr).lStart, VARTYPE_FUNCTION); 
       end;
  49 : begin
         yyval.yyExpr := nil; 
       end;
  50 : begin
         yyval.yyExpr := yyv[yysp-0].yyExpr; 
       end;
  51 : begin
         yyval.yyExpr := nil; 
       end;
  52 : begin
         yyval.yyExpr := yyv[yysp-4].yyExpr; Expr_Func(yyval.yyExpr).body := yyv[yysp-0].yyExpr; 
         if (yyv[yysp-0].yyExpr = nil) then updateLabel(curFunction, -1);  curFunction := ''; 
       end;
  53 : begin
         yyval := yyv[yysp-0];
       end;
  54 : begin
         yyval := yyv[yysp-2];
       end;
  55 : begin
         varName := curFunction + ':' + varName; 
         yyval.yyShortString := varName; 
         if (curFunction = '') then
         addEnvironment(yylineno, varName, varType, -1, VARTYPE_GLOBAL)
         else
         addEnvironment(yylineno, varName, varType, -1, VARTYPE_LOCAL); 
       end;
  56 : begin
         varType := _VOID; yyval.yyInteger := _VOID; 
       end;
  57 : begin
         varType := _INT; yyval.yyInteger := _INT; 
       end;
  58 : begin
         varType := _BOOL; yyval.yyInteger := _BOOL; 
       end;
  59 : begin
         varType := _FLOAT; yyval.yyInteger := _FLOAT; 
       end;
  60 : begin
         varType := _STRING; yyval.yyInteger := _STRING; 
       end;
  61 : begin
         varType := _EXTERNAL; yyval.yyInteger := _EXTERNAL; 
       end;
  62 : begin
         yyval.yyExpr := nil; 
       end;
  63 : begin
         yyval.yyExpr := Expr_Op.Create; yyval.yyExpr.lineNum := yylineno; Expr_Op(yyval.yyExpr).op := '+'; Expr_Op(yyval.yyExpr).le := yyv[yysp-2].yyExpr; Expr_Op(yyval.yyExpr).re := yyv[yysp-0].yyExpr; 
       end;
  64 : begin
         yyval.yyExpr := Expr_Op.Create; yyval.yyExpr.lineNum := yylineno; Expr_Op(yyval.yyExpr).op := '-'; Expr_Op(yyval.yyExpr).le := yyv[yysp-2].yyExpr; Expr_Op(yyval.yyExpr).re := yyv[yysp-0].yyExpr; 
       end;
  65 : begin
         yyval.yyExpr := Expr_Op.Create; yyval.yyExpr.lineNum := yylineno; Expr_Op(yyval.yyExpr).op := '*'; Expr_Op(yyval.yyExpr).le := yyv[yysp-2].yyExpr; Expr_Op(yyval.yyExpr).re := yyv[yysp-0].yyExpr; 
       end;
  66 : begin
         yyval.yyExpr := Expr_Op.Create; yyval.yyExpr.lineNum := yylineno; Expr_Op(yyval.yyExpr).op := '/'; Expr_Op(yyval.yyExpr).le := yyv[yysp-2].yyExpr; Expr_Op(yyval.yyExpr).re := yyv[yysp-0].yyExpr; 
       end;
  67 : begin
         yyval.yyExpr := Expr_Op.Create; yyval.yyExpr.lineNum := yylineno; Expr_Op(yyval.yyExpr).op := '%'; Expr_Op(yyval.yyExpr).le := yyv[yysp-2].yyExpr; Expr_Op(yyval.yyExpr).re := yyv[yysp-0].yyExpr; 
       end;
  68 : begin
         yyval.yyExpr := Expr_Op.Create; yyval.yyExpr.lineNum := yylineno; Expr_Op(yyval.yyExpr).op := '&'; Expr_Op(yyval.yyExpr).le := yyv[yysp-2].yyExpr; Expr_Op(yyval.yyExpr).re := yyv[yysp-0].yyExpr; 
       end;
  69 : begin
         yyval.yyExpr := Expr_Op.Create; yyval.yyExpr.lineNum := yylineno; Expr_Op(yyval.yyExpr).op := '|'; Expr_Op(yyval.yyExpr).le := yyv[yysp-2].yyExpr; Expr_Op(yyval.yyExpr).re := yyv[yysp-0].yyExpr; 
       end;
  70 : begin
         yyval.yyExpr := yyv[yysp-1].yyExpr; 
       end;
  71 : begin
         yyval.yyExpr := Expr_Neg.Create; yyval.yyExpr.lineNum := yylineno; Expr_Neg(yyval.yyExpr).ex := yyv[yysp-0].yyExpr; 
       end;
  72 : begin
         yyval.yyExpr := Expr_ConstInt.Create; yyval.yyExpr.lineNum := yylineno; Expr_ConstInt(yyval.yyExpr).value := yyv[yysp-0].yyInteger; 
       end;
  73 : begin
         yyval.yyExpr := Expr_ConstFloat.Create; yyval.yyExpr.lineNum := yylineno; Expr_ConstFloat(yyval.yyExpr).value := yyv[yysp-0].yySingle; 
       end;
  74 : begin
         yyval.yyExpr := Expr_String.Create; yyval.yyExpr.lineNum := yylineno; Expr_String(yyval.yyExpr).value := ''; 
       end;
  75 : begin
         yyval.yyExpr := Expr_String.Create; yyval.yyExpr.lineNum := yylineno; Expr_String(yyval.yyExpr).value := varName; 
       end;
  76 : begin
         yyval.yyExpr := Expr_Cast.Create; yyval.yyExpr.lineNum := yylineno; Expr_Cast(yyval.yyExpr).ex := yyv[yysp-0].yyExpr; Expr_Cast(yyval.yyExpr).desttype := yyv[yysp-2].yyInteger; 
       end;
  77 : begin
         if (yyv[yysp-2].yyExpr <> nil) then
         															begin
         															yyval.yyExpr := Expr_Assign.Create; 
         															Expr_Assign(yyval.yyExpr).id := yyv[yysp-2].yyExpr; 
         															Expr_Assign(yyval.yyExpr).ex := yyv[yysp-0].yyExpr; 
         															yyval.yyExpr.lineNum := yylineno;
         															end
         														else
         															yyval.yyExpr := nil; 
       end;
  78 : begin
         yyval.yyExpr := yyv[yysp-0].yyExpr; 
       end;
  79 : begin
         	if (lookupEnv(yyv[yysp-3].yyShortString) = nil) then 
         																					  					begin
         																											compilerError(yylineno, 'undefined function ' + yyv[yysp-3].yyShortString);
         																											yyval.yyExpr := nil;
         																											yyabort;
         																											end;
         																										yyval.yyExpr := Expr_Call.Create; Expr_Call(yyval.yyExpr).id := yyv[yysp-3].yyShortString; Expr_Call(yyval.yyExpr).params := yyv[yysp-1].yyExpr; yyval.yyExpr.lineNum := yyLineno; 
       end;
  80 : begin
         yyval.yyExpr := Expr_Bool.Create; yyval.yyExpr.lineNum := yyLineno; Expr_Bool(yyval.yyExpr).ex := yyv[yysp-0].yyBoolExpr; 
       end;
  81 : begin
         yyval.yyBoolExpr := BoolExpr_Const.Create; yyval.yyBoolExpr.lineNum := yylineno; BoolExpr_Const(yyval.yyBoolExpr).value := True; yyval.yyBoolExpr.lineNum := yylineno;
       end;
  82 : begin
         yyval.yyBoolExpr := BoolExpr_Const.Create; yyval.yyBoolExpr.lineNum := yylineno; BoolExpr_Const(yyval.yyBoolExpr).value := False; yyval.yyBoolExpr.lineNum := yylineno;
       end;
  83 : begin
         yyval.yyBoolExpr := BoolExpr_And.Create; yyval.yyBoolExpr.lineNum := yylineno; BoolExpr_And(yyval.yyBoolExpr).le := yyv[yysp-2].yyBoolExpr; BoolExpr_And(yyval.yyBoolExpr).re := yyv[yysp-0].yyBoolExpr; yyval.yyBoolExpr.lineNum := yylineno;
       end;
  84 : begin
         yyval.yyBoolExpr := BoolExpr_Or.Create; yyval.yyBoolExpr.lineNum := yylineno; BoolExpr_Or(yyval.yyBoolExpr).le := yyv[yysp-2].yyBoolExpr; BoolExpr_Or(yyval.yyBoolExpr).re := yyv[yysp-0].yyBoolExpr; yyval.yyBoolExpr.lineNum := yylineno;
       end;
  85 : begin
         yyval.yyBoolExpr := BoolExpr_Rel.Create; yyval.yyBoolExpr.lineNum := yylineno; BoolExpr_Rel(yyval.yyBoolExpr).le := yyv[yysp-2].yyExpr; BoolExpr_Rel(yyval.yyBoolExpr).op := '>';  BoolExpr_Rel(yyval.yyBoolExpr).re := yyv[yysp-0].yyExpr; yyval.yyBoolExpr.lineNum := yylineno;
       end;
  86 : begin
         yyval.yyBoolExpr := BoolExpr_Rel.Create; yyval.yyBoolExpr.lineNum := yylineno; BoolExpr_Rel(yyval.yyBoolExpr).le := yyv[yysp-2].yyExpr; BoolExpr_Rel(yyval.yyBoolExpr).op := '<';  BoolExpr_Rel(yyval.yyBoolExpr).re := yyv[yysp-0].yyExpr; yyval.yyBoolExpr.lineNum := yylineno;
       end;
  87 : begin
         yyval.yyBoolExpr := BoolExpr_Rel.Create; yyval.yyBoolExpr.lineNum := yylineno; BoolExpr_Rel(yyval.yyBoolExpr).le := yyv[yysp-2].yyExpr; BoolExpr_Rel(yyval.yyBoolExpr).op := '>=';  BoolExpr_Rel(yyval.yyBoolExpr).re := yyv[yysp-0].yyExpr; yyval.yyBoolExpr.lineNum := yylineno;
       end;
  88 : begin
         yyval.yyBoolExpr := BoolExpr_Rel.Create; yyval.yyBoolExpr.lineNum := yylineno; BoolExpr_Rel(yyval.yyBoolExpr).le := yyv[yysp-2].yyExpr; BoolExpr_Rel(yyval.yyBoolExpr).op := '=<';  BoolExpr_Rel(yyval.yyBoolExpr).re := yyv[yysp-0].yyExpr; yyval.yyBoolExpr.lineNum := yylineno;
       end;
  89 : begin
         yyval.yyBoolExpr := BoolExpr_Rel.Create; yyval.yyBoolExpr.lineNum := yylineno; BoolExpr_Rel(yyval.yyBoolExpr).le := yyv[yysp-2].yyExpr; BoolExpr_Rel(yyval.yyBoolExpr).op := '==';  BoolExpr_Rel(yyval.yyBoolExpr).re := yyv[yysp-0].yyExpr; yyval.yyBoolExpr.lineNum := yylineno;
       end;
  90 : begin
         yyval.yyBoolExpr := yyv[yysp-1].yyBoolExpr; 
       end;
  91 : begin
         yyval.yyShortString := varName; 
       end;
  92 : begin
         varGlob := ':' + yyv[yysp-0].yyShortString;
         tmp := curFunction + varGlob;
         												varName := left(tmp, '.');
         																							
         												if (varName <> tmp) then
         begin
         													yyval.yyExpr := Expr_External.Create;
         													yyval.yyExpr.lineNum := yylineno; 
         													Expr_External(yyval.yyExpr).id := varName;
         													Expr_External(yyval.yyExpr).assoc := right(tmp, '.');
         													end
         												else
         												if (lookupEnv(varName) <> nil) then 
         													begin
         													yyval.yyExpr := Expr_Id.Create;
         													yyval.yyExpr.lineNum := yylineno; 
         													Expr_Id(yyval.yyExpr).id := varName;
         													end
         												else
         												if (lookupEnv(varGlob) <> nil) then 
         													begin
         													yyval.yyExpr := Expr_Id.Create;
         													yyval.yyExpr.lineNum := yylineno; 
         													Expr_Id(yyval.yyExpr).id := varGlob;
         													end
         												else
         													begin
         													compilerError(yylineno, 'undeclared identifier "' + right(varGlob, ':') + '"');
         													yyval.yyExpr := nil;
         													yyabort;
         													end; 
       end;
  93 : begin
       end;
  94 : begin
         yyval.yyShortString := varName; 
       end;
  95 : begin
         yyval.yyShortString := yyv[yysp-2].yyShortString + '.' + varName; 
       end;
  end;
end(*yyaction*);

(* parse table: *)

type YYARec = record
                sym, act : Integer;
              end;
     YYRRec = record
                len, sym : Integer;
              end;

const

yynacts   = 1661;
yyngotos  = 229;
yynstates = 164;
yynrules  = 95;

yya : array [1..yynacts] of YYARec = (
{ 0: }
  ( sym: 256; act: 2 ),
  ( sym: 0; act: -1 ),
  ( sym: 10; act: -1 ),
  ( sym: 284; act: -1 ),
  ( sym: 285; act: -1 ),
  ( sym: 286; act: -1 ),
  ( sym: 287; act: -1 ),
  ( sym: 288; act: -1 ),
  ( sym: 289; act: -1 ),
  ( sym: 290; act: -1 ),
{ 1: }
  ( sym: 0; act: 0 ),
  ( sym: 10; act: 9 ),
  ( sym: 284; act: 10 ),
  ( sym: 285; act: 11 ),
  ( sym: 286; act: 12 ),
  ( sym: 287; act: 13 ),
  ( sym: 288; act: 14 ),
  ( sym: 289; act: 15 ),
  ( sym: 290; act: 16 ),
{ 2: }
  ( sym: 10; act: 17 ),
{ 3: }
  ( sym: 285; act: 11 ),
  ( sym: 286; act: 12 ),
  ( sym: 287; act: 13 ),
  ( sym: 288; act: 14 ),
  ( sym: 289; act: 15 ),
  ( sym: 290; act: 16 ),
  ( sym: 0; act: -18 ),
  ( sym: 10; act: -18 ),
  ( sym: 284; act: -18 ),
{ 4: }
{ 5: }
  ( sym: 284; act: 10 ),
  ( sym: 285; act: 11 ),
  ( sym: 286; act: 12 ),
  ( sym: 287; act: 13 ),
  ( sym: 288; act: 14 ),
  ( sym: 289; act: 15 ),
  ( sym: 290; act: 16 ),
  ( sym: 0; act: -3 ),
  ( sym: 10; act: -3 ),
{ 6: }
{ 7: }
  ( sym: 40; act: 20 ),
{ 8: }
  ( sym: 257; act: 23 ),
{ 9: }
{ 10: }
  ( sym: 34; act: 24 ),
{ 11: }
{ 12: }
{ 13: }
{ 14: }
{ 15: }
{ 16: }
{ 17: }
{ 18: }
{ 19: }
{ 20: }
  ( sym: 285; act: 11 ),
  ( sym: 286; act: 12 ),
  ( sym: 287; act: 13 ),
  ( sym: 288; act: 14 ),
  ( sym: 289; act: 15 ),
  ( sym: 290; act: 16 ),
  ( sym: 41; act: -33 ),
  ( sym: 44; act: -33 ),
{ 21: }
  ( sym: 44; act: 28 ),
  ( sym: 59; act: 29 ),
{ 22: }
{ 23: }
  ( sym: 40; act: -48 ),
  ( sym: 44; act: -55 ),
  ( sym: 59; act: -55 ),
{ 24: }
  ( sym: 258; act: 30 ),
{ 25: }
{ 26: }
  ( sym: 41; act: 31 ),
  ( sym: 44; act: 32 ),
{ 27: }
  ( sym: 257; act: 33 ),
{ 28: }
  ( sym: 257; act: 35 ),
{ 29: }
{ 30: }
  ( sym: 34; act: 36 ),
{ 31: }
  ( sym: 59; act: 39 ),
  ( sym: 123; act: 40 ),
{ 32: }
  ( sym: 285; act: 11 ),
  ( sym: 286; act: 12 ),
  ( sym: 287; act: 13 ),
  ( sym: 288; act: 14 ),
  ( sym: 289; act: 15 ),
  ( sym: 290; act: 16 ),
{ 33: }
{ 34: }
{ 35: }
{ 36: }
{ 37: }
{ 38: }
{ 39: }
{ 40: }
  ( sym: 125; act: 43 ),
  ( sym: 285; act: 11 ),
  ( sym: 286; act: 12 ),
  ( sym: 287; act: 13 ),
  ( sym: 288; act: 14 ),
  ( sym: 289; act: 15 ),
  ( sym: 290; act: 16 ),
  ( sym: 34; act: -45 ),
  ( sym: 37; act: -45 ),
  ( sym: 38; act: -45 ),
  ( sym: 40; act: -45 ),
  ( sym: 42; act: -45 ),
  ( sym: 43; act: -45 ),
  ( sym: 45; act: -45 ),
  ( sym: 46; act: -45 ),
  ( sym: 47; act: -45 ),
  ( sym: 59; act: -45 ),
  ( sym: 61; act: -45 ),
  ( sym: 123; act: -45 ),
  ( sym: 124; act: -45 ),
  ( sym: 257; act: -45 ),
  ( sym: 259; act: -45 ),
  ( sym: 260; act: -45 ),
  ( sym: 263; act: -45 ),
  ( sym: 265; act: -45 ),
  ( sym: 266; act: -45 ),
  ( sym: 267; act: -45 ),
  ( sym: 270; act: -45 ),
  ( sym: 271; act: -45 ),
  ( sym: 272; act: -45 ),
  ( sym: 273; act: -45 ),
  ( sym: 274; act: -45 ),
  ( sym: 275; act: -45 ),
  ( sym: 276; act: -45 ),
  ( sym: 277; act: -45 ),
  ( sym: 278; act: -45 ),
  ( sym: 279; act: -45 ),
  ( sym: 280; act: -45 ),
  ( sym: 281; act: -45 ),
  ( sym: 283; act: -45 ),
{ 41: }
{ 42: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 59; act: 56 ),
  ( sym: 123; act: 40 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 263; act: 60 ),
  ( sym: 265; act: 61 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 275; act: 64 ),
  ( sym: 276; act: 65 ),
  ( sym: 277; act: 66 ),
  ( sym: 278; act: 67 ),
  ( sym: 279; act: 68 ),
  ( sym: 280; act: 69 ),
  ( sym: 281; act: 70 ),
  ( sym: 283; act: 71 ),
  ( sym: 285; act: 11 ),
  ( sym: 286; act: 12 ),
  ( sym: 287; act: 13 ),
  ( sym: 288; act: 14 ),
  ( sym: 289; act: 15 ),
  ( sym: 290; act: 16 ),
  ( sym: 37; act: -8 ),
  ( sym: 38; act: -8 ),
  ( sym: 42; act: -8 ),
  ( sym: 43; act: -8 ),
  ( sym: 46; act: -8 ),
  ( sym: 47; act: -8 ),
  ( sym: 61; act: -8 ),
  ( sym: 124; act: -8 ),
  ( sym: 125; act: -8 ),
  ( sym: 270; act: -8 ),
  ( sym: 271; act: -8 ),
  ( sym: 272; act: -8 ),
  ( sym: 273; act: -8 ),
  ( sym: 274; act: -8 ),
{ 43: }
{ 44: }
  ( sym: 268; act: 72 ),
  ( sym: 269; act: 73 ),
  ( sym: 37; act: -80 ),
  ( sym: 38; act: -80 ),
  ( sym: 41; act: -80 ),
  ( sym: 42; act: -80 ),
  ( sym: 43; act: -80 ),
  ( sym: 44; act: -80 ),
  ( sym: 45; act: -80 ),
  ( sym: 47; act: -80 ),
  ( sym: 59; act: -80 ),
  ( sym: 124; act: -80 ),
  ( sym: 270; act: -80 ),
  ( sym: 271; act: -80 ),
  ( sym: 272; act: -80 ),
  ( sym: 273; act: -80 ),
  ( sym: 274; act: -80 ),
{ 45: }
  ( sym: 46; act: 74 ),
  ( sym: 37; act: -92 ),
  ( sym: 38; act: -92 ),
  ( sym: 41; act: -92 ),
  ( sym: 42; act: -92 ),
  ( sym: 43; act: -92 ),
  ( sym: 44; act: -92 ),
  ( sym: 45; act: -92 ),
  ( sym: 47; act: -92 ),
  ( sym: 59; act: -92 ),
  ( sym: 61; act: -92 ),
  ( sym: 124; act: -92 ),
  ( sym: 268; act: -92 ),
  ( sym: 269; act: -92 ),
  ( sym: 270; act: -92 ),
  ( sym: 271; act: -92 ),
  ( sym: 272; act: -92 ),
  ( sym: 273; act: -92 ),
  ( sym: 274; act: -92 ),
{ 46: }
  ( sym: 40; act: 75 ),
{ 47: }
  ( sym: 61; act: 76 ),
  ( sym: 37; act: -78 ),
  ( sym: 38; act: -78 ),
  ( sym: 41; act: -78 ),
  ( sym: 42; act: -78 ),
  ( sym: 43; act: -78 ),
  ( sym: 44; act: -78 ),
  ( sym: 45; act: -78 ),
  ( sym: 47; act: -78 ),
  ( sym: 59; act: -78 ),
  ( sym: 124; act: -78 ),
  ( sym: 268; act: -78 ),
  ( sym: 269; act: -78 ),
  ( sym: 270; act: -78 ),
  ( sym: 271; act: -78 ),
  ( sym: 272; act: -78 ),
  ( sym: 273; act: -78 ),
  ( sym: 274; act: -78 ),
{ 48: }
{ 49: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 59; act: 56 ),
  ( sym: 123; act: 40 ),
  ( sym: 125; act: 78 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 263; act: 60 ),
  ( sym: 265; act: 61 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 275; act: 64 ),
  ( sym: 276; act: 65 ),
  ( sym: 277; act: 66 ),
  ( sym: 278; act: 67 ),
  ( sym: 279; act: 68 ),
  ( sym: 280; act: 69 ),
  ( sym: 281; act: 70 ),
  ( sym: 283; act: 71 ),
  ( sym: 37; act: -11 ),
  ( sym: 38; act: -11 ),
  ( sym: 42; act: -11 ),
  ( sym: 43; act: -11 ),
  ( sym: 46; act: -11 ),
  ( sym: 47; act: -11 ),
  ( sym: 61; act: -11 ),
  ( sym: 124; act: -11 ),
  ( sym: 270; act: -11 ),
  ( sym: 271; act: -11 ),
  ( sym: 272; act: -11 ),
  ( sym: 273; act: -11 ),
  ( sym: 274; act: -11 ),
{ 50: }
{ 51: }
{ 52: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 59; act: 85 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
{ 53: }
  ( sym: 34; act: 92 ),
  ( sym: 258; act: 93 ),
{ 54: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 285; act: 11 ),
  ( sym: 286; act: 12 ),
  ( sym: 287; act: 13 ),
  ( sym: 288; act: 14 ),
  ( sym: 289; act: 15 ),
  ( sym: 290; act: 16 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 55: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 44; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 268; act: -62 ),
  ( sym: 269; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 56: }
{ 57: }
  ( sym: 40; act: -91 ),
  ( sym: 37; act: -94 ),
  ( sym: 38; act: -94 ),
  ( sym: 41; act: -94 ),
  ( sym: 42; act: -94 ),
  ( sym: 43; act: -94 ),
  ( sym: 44; act: -94 ),
  ( sym: 45; act: -94 ),
  ( sym: 46; act: -94 ),
  ( sym: 47; act: -94 ),
  ( sym: 59; act: -94 ),
  ( sym: 61; act: -94 ),
  ( sym: 124; act: -94 ),
  ( sym: 268; act: -94 ),
  ( sym: 269; act: -94 ),
  ( sym: 270; act: -94 ),
  ( sym: 271; act: -94 ),
  ( sym: 272; act: -94 ),
  ( sym: 273; act: -94 ),
  ( sym: 274; act: -94 ),
{ 58: }
{ 59: }
{ 60: }
  ( sym: 40; act: 98 ),
{ 61: }
  ( sym: 123; act: 99 ),
{ 62: }
{ 63: }
{ 64: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 101 ),
  ( sym: 45; act: 55 ),
  ( sym: 59; act: 102 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 65: }
  ( sym: 59; act: 103 ),
{ 66: }
  ( sym: 59; act: 104 ),
{ 67: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 68: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 69: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 70: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 71: }
  ( sym: 40; act: 109 ),
{ 72: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 73: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 74: }
  ( sym: 257; act: 113 ),
{ 75: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 41; act: -37 ),
  ( sym: 44; act: -37 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 76: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 44; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 268; act: -62 ),
  ( sym: 269; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 77: }
{ 78: }
{ 79: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 44; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 268; act: -62 ),
  ( sym: 269; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 80: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 44; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 268; act: -62 ),
  ( sym: 269; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 81: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 44; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 268; act: -62 ),
  ( sym: 269; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 82: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 44; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 268; act: -62 ),
  ( sym: 269; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 83: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 44; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 268; act: -62 ),
  ( sym: 269; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 84: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 44; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 268; act: -62 ),
  ( sym: 269; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 85: }
{ 86: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 44; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 268; act: -62 ),
  ( sym: 269; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 87: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 44; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 268; act: -62 ),
  ( sym: 269; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 88: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 44; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 268; act: -62 ),
  ( sym: 269; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 89: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 44; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 268; act: -62 ),
  ( sym: 269; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 90: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 44; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 268; act: -62 ),
  ( sym: 269; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 91: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 44; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 268; act: -62 ),
  ( sym: 269; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 92: }
{ 93: }
  ( sym: 34; act: 129 ),
{ 94: }
  ( sym: 41; act: 130 ),
  ( sym: 268; act: 72 ),
  ( sym: 269; act: 73 ),
  ( sym: 37; act: -80 ),
  ( sym: 38; act: -80 ),
  ( sym: 42; act: -80 ),
  ( sym: 43; act: -80 ),
  ( sym: 45; act: -80 ),
  ( sym: 47; act: -80 ),
  ( sym: 124; act: -80 ),
  ( sym: 270; act: -80 ),
  ( sym: 271; act: -80 ),
  ( sym: 272; act: -80 ),
  ( sym: 273; act: -80 ),
  ( sym: 274; act: -80 ),
{ 95: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 41; act: 131 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
{ 96: }
  ( sym: 41; act: 132 ),
{ 97: }
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 37; act: -71 ),
  ( sym: 38; act: -71 ),
  ( sym: 41; act: -71 ),
  ( sym: 42; act: -71 ),
  ( sym: 43; act: -71 ),
  ( sym: 44; act: -71 ),
  ( sym: 45; act: -71 ),
  ( sym: 47; act: -71 ),
  ( sym: 59; act: -71 ),
  ( sym: 124; act: -71 ),
  ( sym: 268; act: -71 ),
  ( sym: 269; act: -71 ),
{ 98: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 99: }
  ( sym: 34; act: 136 ),
{ 100: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 59; act: 137 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
{ 101: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 285; act: 11 ),
  ( sym: 286; act: 12 ),
  ( sym: 287; act: 13 ),
  ( sym: 288; act: 14 ),
  ( sym: 289; act: 15 ),
  ( sym: 290; act: 16 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 102: }
{ 103: }
{ 104: }
{ 105: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 59; act: 139 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
{ 106: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 59; act: 140 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
{ 107: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 59; act: 141 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
{ 108: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 59; act: 142 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
{ 109: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 110: }
  ( sym: 268; act: 72 ),
  ( sym: 269; act: 73 ),
  ( sym: 37; act: -80 ),
  ( sym: 38; act: -80 ),
  ( sym: 42; act: -80 ),
  ( sym: 43; act: -80 ),
  ( sym: 45; act: -80 ),
  ( sym: 47; act: -80 ),
  ( sym: 124; act: -80 ),
  ( sym: 270; act: -80 ),
  ( sym: 271; act: -80 ),
  ( sym: 272; act: -80 ),
  ( sym: 273; act: -80 ),
  ( sym: 274; act: -80 ),
  ( sym: 41; act: -83 ),
  ( sym: 44; act: -83 ),
  ( sym: 59; act: -83 ),
{ 111: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
{ 112: }
  ( sym: 268; act: 72 ),
  ( sym: 269; act: 73 ),
  ( sym: 37; act: -80 ),
  ( sym: 38; act: -80 ),
  ( sym: 42; act: -80 ),
  ( sym: 43; act: -80 ),
  ( sym: 45; act: -80 ),
  ( sym: 47; act: -80 ),
  ( sym: 124; act: -80 ),
  ( sym: 270; act: -80 ),
  ( sym: 271; act: -80 ),
  ( sym: 272; act: -80 ),
  ( sym: 273; act: -80 ),
  ( sym: 274; act: -80 ),
  ( sym: 41; act: -84 ),
  ( sym: 44; act: -84 ),
  ( sym: 59; act: -84 ),
{ 113: }
{ 114: }
  ( sym: 41; act: 144 ),
  ( sym: 44; act: 145 ),
{ 115: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 41; act: -38 ),
  ( sym: 44; act: -38 ),
{ 116: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 41; act: -77 ),
  ( sym: 44; act: -77 ),
  ( sym: 59; act: -77 ),
  ( sym: 268; act: -77 ),
  ( sym: 269; act: -77 ),
{ 117: }
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 37; act: -67 ),
  ( sym: 38; act: -67 ),
  ( sym: 41; act: -67 ),
  ( sym: 42; act: -67 ),
  ( sym: 43; act: -67 ),
  ( sym: 44; act: -67 ),
  ( sym: 45; act: -67 ),
  ( sym: 47; act: -67 ),
  ( sym: 59; act: -67 ),
  ( sym: 124; act: -67 ),
  ( sym: 268; act: -67 ),
  ( sym: 269; act: -67 ),
{ 118: }
  ( sym: 37; act: 79 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 38; act: -68 ),
  ( sym: 41; act: -68 ),
  ( sym: 44; act: -68 ),
  ( sym: 59; act: -68 ),
  ( sym: 124; act: -68 ),
  ( sym: 268; act: -68 ),
  ( sym: 269; act: -68 ),
{ 119: }
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 37; act: -65 ),
  ( sym: 38; act: -65 ),
  ( sym: 41; act: -65 ),
  ( sym: 42; act: -65 ),
  ( sym: 43; act: -65 ),
  ( sym: 44; act: -65 ),
  ( sym: 45; act: -65 ),
  ( sym: 47; act: -65 ),
  ( sym: 59; act: -65 ),
  ( sym: 124; act: -65 ),
  ( sym: 268; act: -65 ),
  ( sym: 269; act: -65 ),
{ 120: }
  ( sym: 37; act: 79 ),
  ( sym: 42; act: 81 ),
  ( sym: 47; act: 84 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 38; act: -63 ),
  ( sym: 41; act: -63 ),
  ( sym: 43; act: -63 ),
  ( sym: 44; act: -63 ),
  ( sym: 45; act: -63 ),
  ( sym: 59; act: -63 ),
  ( sym: 124; act: -63 ),
  ( sym: 268; act: -63 ),
  ( sym: 269; act: -63 ),
{ 121: }
  ( sym: 37; act: 79 ),
  ( sym: 42; act: 81 ),
  ( sym: 47; act: 84 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 38; act: -64 ),
  ( sym: 41; act: -64 ),
  ( sym: 43; act: -64 ),
  ( sym: 44; act: -64 ),
  ( sym: 45; act: -64 ),
  ( sym: 59; act: -64 ),
  ( sym: 124; act: -64 ),
  ( sym: 268; act: -64 ),
  ( sym: 269; act: -64 ),
{ 122: }
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 37; act: -66 ),
  ( sym: 38; act: -66 ),
  ( sym: 41; act: -66 ),
  ( sym: 42; act: -66 ),
  ( sym: 43; act: -66 ),
  ( sym: 44; act: -66 ),
  ( sym: 45; act: -66 ),
  ( sym: 47; act: -66 ),
  ( sym: 59; act: -66 ),
  ( sym: 124; act: -66 ),
  ( sym: 268; act: -66 ),
  ( sym: 269; act: -66 ),
{ 123: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 41; act: -69 ),
  ( sym: 44; act: -69 ),
  ( sym: 59; act: -69 ),
  ( sym: 124; act: -69 ),
  ( sym: 268; act: -69 ),
  ( sym: 269; act: -69 ),
{ 124: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 41; act: -85 ),
  ( sym: 44; act: -85 ),
  ( sym: 59; act: -85 ),
  ( sym: 268; act: -85 ),
  ( sym: 269; act: -85 ),
{ 125: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 41; act: -86 ),
  ( sym: 44; act: -86 ),
  ( sym: 59; act: -86 ),
  ( sym: 268; act: -86 ),
  ( sym: 269; act: -86 ),
{ 126: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 41; act: -87 ),
  ( sym: 44; act: -87 ),
  ( sym: 59; act: -87 ),
  ( sym: 268; act: -87 ),
  ( sym: 269; act: -87 ),
{ 127: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 41; act: -88 ),
  ( sym: 44; act: -88 ),
  ( sym: 59; act: -88 ),
  ( sym: 268; act: -88 ),
  ( sym: 269; act: -88 ),
{ 128: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 41; act: -89 ),
  ( sym: 44; act: -89 ),
  ( sym: 59; act: -89 ),
  ( sym: 268; act: -89 ),
  ( sym: 269; act: -89 ),
{ 129: }
{ 130: }
{ 131: }
{ 132: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 44; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 59; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 268; act: -62 ),
  ( sym: 269; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 133: }
  ( sym: 41; act: 147 ),
  ( sym: 268; act: 72 ),
  ( sym: 269; act: 73 ),
  ( sym: 37; act: -80 ),
  ( sym: 38; act: -80 ),
  ( sym: 42; act: -80 ),
  ( sym: 43; act: -80 ),
  ( sym: 45; act: -80 ),
  ( sym: 47; act: -80 ),
  ( sym: 124; act: -80 ),
  ( sym: 270; act: -80 ),
  ( sym: 271; act: -80 ),
  ( sym: 272; act: -80 ),
  ( sym: 273; act: -80 ),
  ( sym: 274; act: -80 ),
{ 134: }
{ 135: }
  ( sym: 34; act: 136 ),
  ( sym: 125; act: 149 ),
{ 136: }
  ( sym: 258; act: 150 ),
{ 137: }
{ 138: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 41; act: 151 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
{ 139: }
{ 140: }
{ 141: }
{ 142: }
{ 143: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 59; act: 152 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
{ 144: }
{ 145: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 44; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 146: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 41; act: -76 ),
  ( sym: 44; act: -76 ),
  ( sym: 59; act: -76 ),
  ( sym: 268; act: -76 ),
  ( sym: 269; act: -76 ),
{ 147: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 59; act: 56 ),
  ( sym: 123; act: 40 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 263; act: 60 ),
  ( sym: 265; act: 61 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 275; act: 64 ),
  ( sym: 276; act: 65 ),
  ( sym: 277; act: 66 ),
  ( sym: 278; act: 67 ),
  ( sym: 279; act: 68 ),
  ( sym: 280; act: 69 ),
  ( sym: 281; act: 70 ),
  ( sym: 283; act: 71 ),
  ( sym: 37; act: -11 ),
  ( sym: 38; act: -11 ),
  ( sym: 42; act: -11 ),
  ( sym: 43; act: -11 ),
  ( sym: 46; act: -11 ),
  ( sym: 47; act: -11 ),
  ( sym: 61; act: -11 ),
  ( sym: 124; act: -11 ),
  ( sym: 125; act: -11 ),
  ( sym: 264; act: -11 ),
  ( sym: 270; act: -11 ),
  ( sym: 271; act: -11 ),
  ( sym: 272; act: -11 ),
  ( sym: 273; act: -11 ),
  ( sym: 274; act: -11 ),
{ 148: }
{ 149: }
{ 150: }
  ( sym: 34; act: 155 ),
{ 151: }
  ( sym: 59; act: 156 ),
  ( sym: 37; act: -70 ),
  ( sym: 38; act: -70 ),
  ( sym: 42; act: -70 ),
  ( sym: 43; act: -70 ),
  ( sym: 45; act: -70 ),
  ( sym: 47; act: -70 ),
  ( sym: 124; act: -70 ),
  ( sym: 270; act: -70 ),
  ( sym: 271; act: -70 ),
  ( sym: 272; act: -70 ),
  ( sym: 273; act: -70 ),
  ( sym: 274; act: -70 ),
{ 152: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 153: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
  ( sym: 41; act: -39 ),
  ( sym: 44; act: -39 ),
{ 154: }
  ( sym: 264; act: 158 ),
  ( sym: 34; act: -24 ),
  ( sym: 37; act: -24 ),
  ( sym: 38; act: -24 ),
  ( sym: 40; act: -24 ),
  ( sym: 42; act: -24 ),
  ( sym: 43; act: -24 ),
  ( sym: 45; act: -24 ),
  ( sym: 46; act: -24 ),
  ( sym: 47; act: -24 ),
  ( sym: 59; act: -24 ),
  ( sym: 61; act: -24 ),
  ( sym: 123; act: -24 ),
  ( sym: 124; act: -24 ),
  ( sym: 125; act: -24 ),
  ( sym: 257; act: -24 ),
  ( sym: 259; act: -24 ),
  ( sym: 260; act: -24 ),
  ( sym: 263; act: -24 ),
  ( sym: 265; act: -24 ),
  ( sym: 266; act: -24 ),
  ( sym: 267; act: -24 ),
  ( sym: 270; act: -24 ),
  ( sym: 271; act: -24 ),
  ( sym: 272; act: -24 ),
  ( sym: 273; act: -24 ),
  ( sym: 274; act: -24 ),
  ( sym: 275; act: -24 ),
  ( sym: 276; act: -24 ),
  ( sym: 277; act: -24 ),
  ( sym: 278; act: -24 ),
  ( sym: 279; act: -24 ),
  ( sym: 280; act: -24 ),
  ( sym: 281; act: -24 ),
  ( sym: 283; act: -24 ),
{ 155: }
{ 156: }
{ 157: }
  ( sym: 59; act: 159 ),
  ( sym: 268; act: 72 ),
  ( sym: 269; act: 73 ),
  ( sym: 37; act: -80 ),
  ( sym: 38; act: -80 ),
  ( sym: 42; act: -80 ),
  ( sym: 43; act: -80 ),
  ( sym: 45; act: -80 ),
  ( sym: 47; act: -80 ),
  ( sym: 124; act: -80 ),
  ( sym: 270; act: -80 ),
  ( sym: 271; act: -80 ),
  ( sym: 272; act: -80 ),
  ( sym: 273; act: -80 ),
  ( sym: 274; act: -80 ),
{ 158: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 59; act: 56 ),
  ( sym: 123; act: 40 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 263; act: 60 ),
  ( sym: 265; act: 61 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 275; act: 64 ),
  ( sym: 276; act: 65 ),
  ( sym: 277; act: 66 ),
  ( sym: 278; act: 67 ),
  ( sym: 279; act: 68 ),
  ( sym: 280; act: 69 ),
  ( sym: 281; act: 70 ),
  ( sym: 283; act: 71 ),
  ( sym: 37; act: -11 ),
  ( sym: 38; act: -11 ),
  ( sym: 42; act: -11 ),
  ( sym: 43; act: -11 ),
  ( sym: 46; act: -11 ),
  ( sym: 47; act: -11 ),
  ( sym: 61; act: -11 ),
  ( sym: 124; act: -11 ),
  ( sym: 125; act: -11 ),
  ( sym: 264; act: -11 ),
  ( sym: 270; act: -11 ),
  ( sym: 271; act: -11 ),
  ( sym: 272; act: -11 ),
  ( sym: 273; act: -11 ),
  ( sym: 274; act: -11 ),
{ 159: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 37; act: -62 ),
  ( sym: 38; act: -62 ),
  ( sym: 41; act: -62 ),
  ( sym: 42; act: -62 ),
  ( sym: 43; act: -62 ),
  ( sym: 47; act: -62 ),
  ( sym: 124; act: -62 ),
  ( sym: 270; act: -62 ),
  ( sym: 271; act: -62 ),
  ( sym: 272; act: -62 ),
  ( sym: 273; act: -62 ),
  ( sym: 274; act: -62 ),
  ( sym: 46; act: -93 ),
  ( sym: 61; act: -93 ),
{ 160: }
{ 161: }
  ( sym: 37; act: 79 ),
  ( sym: 38; act: 80 ),
  ( sym: 41; act: 162 ),
  ( sym: 42; act: 81 ),
  ( sym: 43; act: 82 ),
  ( sym: 45; act: 83 ),
  ( sym: 47; act: 84 ),
  ( sym: 124; act: 86 ),
  ( sym: 270; act: 87 ),
  ( sym: 271; act: 88 ),
  ( sym: 272; act: 89 ),
  ( sym: 273; act: 90 ),
  ( sym: 274; act: 91 ),
{ 162: }
  ( sym: 34; act: 53 ),
  ( sym: 40; act: 54 ),
  ( sym: 45; act: 55 ),
  ( sym: 59; act: 56 ),
  ( sym: 123; act: 40 ),
  ( sym: 257; act: 57 ),
  ( sym: 259; act: 58 ),
  ( sym: 260; act: 59 ),
  ( sym: 263; act: 60 ),
  ( sym: 265; act: 61 ),
  ( sym: 266; act: 62 ),
  ( sym: 267; act: 63 ),
  ( sym: 275; act: 64 ),
  ( sym: 276; act: 65 ),
  ( sym: 277; act: 66 ),
  ( sym: 278; act: 67 ),
  ( sym: 279; act: 68 ),
  ( sym: 280; act: 69 ),
  ( sym: 281; act: 70 ),
  ( sym: 283; act: 71 ),
  ( sym: 37; act: -11 ),
  ( sym: 38; act: -11 ),
  ( sym: 42; act: -11 ),
  ( sym: 43; act: -11 ),
  ( sym: 46; act: -11 ),
  ( sym: 47; act: -11 ),
  ( sym: 61; act: -11 ),
  ( sym: 124; act: -11 ),
  ( sym: 125; act: -11 ),
  ( sym: 264; act: -11 ),
  ( sym: 270; act: -11 ),
  ( sym: 271; act: -11 ),
  ( sym: 272; act: -11 ),
  ( sym: 273; act: -11 ),
  ( sym: 274; act: -11 )
{ 163: }
);

yyg : array [1..yyngotos] of YYARec = (
{ 0: }
  ( sym: -25; act: 1 ),
{ 1: }
  ( sym: -16; act: 3 ),
  ( sym: -15; act: 4 ),
  ( sym: -8; act: 5 ),
  ( sym: -7; act: 6 ),
  ( sym: -5; act: 7 ),
  ( sym: -2; act: 8 ),
{ 2: }
{ 3: }
  ( sym: -15; act: 18 ),
  ( sym: -5; act: 7 ),
  ( sym: -2; act: 8 ),
{ 4: }
{ 5: }
  ( sym: -16; act: 3 ),
  ( sym: -15; act: 4 ),
  ( sym: -7; act: 19 ),
  ( sym: -5; act: 7 ),
  ( sym: -2; act: 8 ),
{ 6: }
{ 7: }
{ 8: }
  ( sym: -26; act: 21 ),
  ( sym: -21; act: 22 ),
{ 9: }
{ 10: }
{ 11: }
{ 12: }
{ 13: }
{ 14: }
{ 15: }
{ 16: }
{ 17: }
{ 18: }
{ 19: }
{ 20: }
  ( sym: -12; act: 25 ),
  ( sym: -11; act: 26 ),
  ( sym: -2; act: 27 ),
{ 21: }
{ 22: }
{ 23: }
{ 24: }
{ 25: }
{ 26: }
{ 27: }
{ 28: }
  ( sym: -21; act: 34 ),
{ 29: }
{ 30: }
{ 31: }
  ( sym: -14; act: 37 ),
  ( sym: -6; act: 38 ),
{ 32: }
  ( sym: -12; act: 41 ),
  ( sym: -2; act: 27 ),
{ 33: }
{ 34: }
{ 35: }
{ 36: }
{ 37: }
{ 38: }
{ 39: }
{ 40: }
  ( sym: -16; act: 42 ),
  ( sym: -15; act: 4 ),
  ( sym: -5; act: 7 ),
  ( sym: -2; act: 8 ),
{ 41: }
{ 42: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -15; act: 18 ),
  ( sym: -14; act: 48 ),
  ( sym: -10; act: 49 ),
  ( sym: -9; act: 50 ),
  ( sym: -5; act: 7 ),
  ( sym: -4; act: 51 ),
  ( sym: -3; act: 52 ),
  ( sym: -2; act: 8 ),
{ 43: }
{ 44: }
{ 45: }
{ 46: }
{ 47: }
{ 48: }
{ 49: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -14; act: 48 ),
  ( sym: -9; act: 77 ),
  ( sym: -4; act: 51 ),
  ( sym: -3; act: 52 ),
{ 50: }
{ 51: }
{ 52: }
{ 53: }
{ 54: }
  ( sym: -24; act: 94 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 95 ),
  ( sym: -2; act: 96 ),
{ 55: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 97 ),
{ 56: }
{ 57: }
{ 58: }
{ 59: }
{ 60: }
{ 61: }
{ 62: }
{ 63: }
{ 64: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 100 ),
{ 65: }
{ 66: }
{ 67: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 105 ),
{ 68: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 106 ),
{ 69: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 107 ),
{ 70: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 108 ),
{ 71: }
{ 72: }
  ( sym: -24; act: 110 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 111 ),
{ 73: }
  ( sym: -24; act: 112 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 111 ),
{ 74: }
{ 75: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -13; act: 114 ),
  ( sym: -3; act: 115 ),
{ 76: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 116 ),
{ 77: }
{ 78: }
{ 79: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 117 ),
{ 80: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 118 ),
{ 81: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 119 ),
{ 82: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 120 ),
{ 83: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 121 ),
{ 84: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 122 ),
{ 85: }
{ 86: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 123 ),
{ 87: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 124 ),
{ 88: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 125 ),
{ 89: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 126 ),
{ 90: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 127 ),
{ 91: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 128 ),
{ 92: }
{ 93: }
{ 94: }
{ 95: }
{ 96: }
{ 97: }
{ 98: }
  ( sym: -24; act: 133 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 111 ),
{ 99: }
  ( sym: -20; act: 134 ),
  ( sym: -19; act: 135 ),
{ 100: }
{ 101: }
  ( sym: -24; act: 94 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 138 ),
  ( sym: -2; act: 96 ),
{ 102: }
{ 103: }
{ 104: }
{ 105: }
{ 106: }
{ 107: }
{ 108: }
{ 109: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 143 ),
{ 110: }
{ 111: }
{ 112: }
{ 113: }
{ 114: }
{ 115: }
{ 116: }
{ 117: }
{ 118: }
{ 119: }
{ 120: }
{ 121: }
{ 122: }
{ 123: }
{ 124: }
{ 125: }
{ 126: }
{ 127: }
{ 128: }
{ 129: }
{ 130: }
{ 131: }
{ 132: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 146 ),
{ 133: }
{ 134: }
{ 135: }
  ( sym: -20; act: 148 ),
{ 136: }
{ 137: }
{ 138: }
{ 139: }
{ 140: }
{ 141: }
{ 142: }
{ 143: }
{ 144: }
{ 145: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 153 ),
{ 146: }
{ 147: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -14; act: 48 ),
  ( sym: -9; act: 154 ),
  ( sym: -4; act: 51 ),
  ( sym: -3; act: 52 ),
{ 148: }
{ 149: }
{ 150: }
{ 151: }
{ 152: }
  ( sym: -24; act: 157 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 111 ),
{ 153: }
{ 154: }
{ 155: }
{ 156: }
{ 157: }
{ 158: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -14; act: 48 ),
  ( sym: -9; act: 160 ),
  ( sym: -4; act: 51 ),
  ( sym: -3; act: 52 ),
{ 159: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -3; act: 161 ),
{ 160: }
{ 161: }
{ 162: }
  ( sym: -24; act: 44 ),
  ( sym: -23; act: 45 ),
  ( sym: -22; act: 46 ),
  ( sym: -18; act: 47 ),
  ( sym: -14; act: 48 ),
  ( sym: -9; act: 163 ),
  ( sym: -4; act: 51 ),
  ( sym: -3; act: 52 )
{ 163: }
);

yyd : array [0..yynstates-1] of Integer = (
{ 0: } 0,
{ 1: } 0,
{ 2: } 0,
{ 3: } 0,
{ 4: } -46,
{ 5: } 0,
{ 6: } -6,
{ 7: } 0,
{ 8: } 0,
{ 9: } -2,
{ 10: } 0,
{ 11: } -56,
{ 12: } -58,
{ 13: } -57,
{ 14: } -59,
{ 15: } -60,
{ 16: } -61,
{ 17: } -4,
{ 18: } -47,
{ 19: } -7,
{ 20: } 0,
{ 21: } 0,
{ 22: } -53,
{ 23: } 0,
{ 24: } 0,
{ 25: } -34,
{ 26: } 0,
{ 27: } 0,
{ 28: } 0,
{ 29: } -51,
{ 30: } 0,
{ 31: } 0,
{ 32: } 0,
{ 33: } -36,
{ 34: } -54,
{ 35: } -55,
{ 36: } -19,
{ 37: } -50,
{ 38: } -52,
{ 39: } -49,
{ 40: } 0,
{ 41: } -35,
{ 42: } 0,
{ 43: } -43,
{ 44: } 0,
{ 45: } 0,
{ 46: } 0,
{ 47: } 0,
{ 48: } -21,
{ 49: } 0,
{ 50: } -9,
{ 51: } -31,
{ 52: } 0,
{ 53: } 0,
{ 54: } 0,
{ 55: } 0,
{ 56: } -32,
{ 57: } 0,
{ 58: } -72,
{ 59: } -73,
{ 60: } 0,
{ 61: } 0,
{ 62: } -81,
{ 63: } -82,
{ 64: } 0,
{ 65: } 0,
{ 66: } 0,
{ 67: } 0,
{ 68: } 0,
{ 69: } 0,
{ 70: } 0,
{ 71: } 0,
{ 72: } 0,
{ 73: } 0,
{ 74: } 0,
{ 75: } 0,
{ 76: } 0,
{ 77: } -10,
{ 78: } -44,
{ 79: } 0,
{ 80: } 0,
{ 81: } 0,
{ 82: } 0,
{ 83: } 0,
{ 84: } 0,
{ 85: } -22,
{ 86: } 0,
{ 87: } 0,
{ 88: } 0,
{ 89: } 0,
{ 90: } 0,
{ 91: } 0,
{ 92: } -74,
{ 93: } 0,
{ 94: } 0,
{ 95: } 0,
{ 96: } 0,
{ 97: } 0,
{ 98: } 0,
{ 99: } 0,
{ 100: } 0,
{ 101: } 0,
{ 102: } -14,
{ 103: } -12,
{ 104: } -13,
{ 105: } 0,
{ 106: } 0,
{ 107: } 0,
{ 108: } 0,
{ 109: } 0,
{ 110: } 0,
{ 111: } 0,
{ 112: } 0,
{ 113: } -95,
{ 114: } 0,
{ 115: } 0,
{ 116: } 0,
{ 117: } 0,
{ 118: } 0,
{ 119: } 0,
{ 120: } 0,
{ 121: } 0,
{ 122: } 0,
{ 123: } 0,
{ 124: } 0,
{ 125: } 0,
{ 126: } 0,
{ 127: } 0,
{ 128: } 0,
{ 129: } -75,
{ 130: } -90,
{ 131: } -70,
{ 132: } 0,
{ 133: } 0,
{ 134: } -40,
{ 135: } 0,
{ 136: } 0,
{ 137: } -15,
{ 138: } 0,
{ 139: } -26,
{ 140: } -27,
{ 141: } -28,
{ 142: } -29,
{ 143: } 0,
{ 144: } -79,
{ 145: } 0,
{ 146: } 0,
{ 147: } 0,
{ 148: } -41,
{ 149: } -30,
{ 150: } 0,
{ 151: } 0,
{ 152: } 0,
{ 153: } 0,
{ 154: } 0,
{ 155: } -42,
{ 156: } -16,
{ 157: } 0,
{ 158: } 0,
{ 159: } 0,
{ 160: } -23,
{ 161: } 0,
{ 162: } 0,
{ 163: } -25
);

yyal : array [0..yynstates-1] of Integer = (
{ 0: } 1,
{ 1: } 11,
{ 2: } 20,
{ 3: } 21,
{ 4: } 30,
{ 5: } 30,
{ 6: } 39,
{ 7: } 39,
{ 8: } 40,
{ 9: } 41,
{ 10: } 41,
{ 11: } 42,
{ 12: } 42,
{ 13: } 42,
{ 14: } 42,
{ 15: } 42,
{ 16: } 42,
{ 17: } 42,
{ 18: } 42,
{ 19: } 42,
{ 20: } 42,
{ 21: } 50,
{ 22: } 52,
{ 23: } 52,
{ 24: } 55,
{ 25: } 56,
{ 26: } 56,
{ 27: } 58,
{ 28: } 59,
{ 29: } 60,
{ 30: } 60,
{ 31: } 61,
{ 32: } 63,
{ 33: } 69,
{ 34: } 69,
{ 35: } 69,
{ 36: } 69,
{ 37: } 69,
{ 38: } 69,
{ 39: } 69,
{ 40: } 69,
{ 41: } 109,
{ 42: } 109,
{ 43: } 149,
{ 44: } 149,
{ 45: } 166,
{ 46: } 185,
{ 47: } 186,
{ 48: } 204,
{ 49: } 204,
{ 50: } 238,
{ 51: } 238,
{ 52: } 238,
{ 53: } 251,
{ 54: } 253,
{ 55: } 281,
{ 56: } 307,
{ 57: } 307,
{ 58: } 327,
{ 59: } 327,
{ 60: } 327,
{ 61: } 328,
{ 62: } 329,
{ 63: } 329,
{ 64: } 329,
{ 65: } 351,
{ 66: } 352,
{ 67: } 353,
{ 68: } 375,
{ 69: } 397,
{ 70: } 419,
{ 71: } 441,
{ 72: } 442,
{ 73: } 463,
{ 74: } 484,
{ 75: } 485,
{ 76: } 508,
{ 77: } 534,
{ 78: } 534,
{ 79: } 534,
{ 80: } 560,
{ 81: } 586,
{ 82: } 612,
{ 83: } 638,
{ 84: } 664,
{ 85: } 690,
{ 86: } 690,
{ 87: } 716,
{ 88: } 742,
{ 89: } 768,
{ 90: } 794,
{ 91: } 820,
{ 92: } 846,
{ 93: } 846,
{ 94: } 847,
{ 95: } 862,
{ 96: } 875,
{ 97: } 876,
{ 98: } 893,
{ 99: } 914,
{ 100: } 915,
{ 101: } 928,
{ 102: } 956,
{ 103: } 956,
{ 104: } 956,
{ 105: } 956,
{ 106: } 969,
{ 107: } 982,
{ 108: } 995,
{ 109: } 1008,
{ 110: } 1030,
{ 111: } 1047,
{ 112: } 1059,
{ 113: } 1076,
{ 114: } 1076,
{ 115: } 1078,
{ 116: } 1092,
{ 117: } 1109,
{ 118: } 1126,
{ 119: } 1143,
{ 120: } 1160,
{ 121: } 1177,
{ 122: } 1194,
{ 123: } 1211,
{ 124: } 1228,
{ 125: } 1245,
{ 126: } 1262,
{ 127: } 1279,
{ 128: } 1296,
{ 129: } 1313,
{ 130: } 1313,
{ 131: } 1313,
{ 132: } 1313,
{ 133: } 1339,
{ 134: } 1354,
{ 135: } 1354,
{ 136: } 1356,
{ 137: } 1357,
{ 138: } 1357,
{ 139: } 1370,
{ 140: } 1370,
{ 141: } 1370,
{ 142: } 1370,
{ 143: } 1370,
{ 144: } 1383,
{ 145: } 1383,
{ 146: } 1406,
{ 147: } 1423,
{ 148: } 1458,
{ 149: } 1458,
{ 150: } 1458,
{ 151: } 1459,
{ 152: } 1472,
{ 153: } 1493,
{ 154: } 1507,
{ 155: } 1542,
{ 156: } 1542,
{ 157: } 1542,
{ 158: } 1557,
{ 159: } 1592,
{ 160: } 1614,
{ 161: } 1614,
{ 162: } 1627,
{ 163: } 1662
);

yyah : array [0..yynstates-1] of Integer = (
{ 0: } 10,
{ 1: } 19,
{ 2: } 20,
{ 3: } 29,
{ 4: } 29,
{ 5: } 38,
{ 6: } 38,
{ 7: } 39,
{ 8: } 40,
{ 9: } 40,
{ 10: } 41,
{ 11: } 41,
{ 12: } 41,
{ 13: } 41,
{ 14: } 41,
{ 15: } 41,
{ 16: } 41,
{ 17: } 41,
{ 18: } 41,
{ 19: } 41,
{ 20: } 49,
{ 21: } 51,
{ 22: } 51,
{ 23: } 54,
{ 24: } 55,
{ 25: } 55,
{ 26: } 57,
{ 27: } 58,
{ 28: } 59,
{ 29: } 59,
{ 30: } 60,
{ 31: } 62,
{ 32: } 68,
{ 33: } 68,
{ 34: } 68,
{ 35: } 68,
{ 36: } 68,
{ 37: } 68,
{ 38: } 68,
{ 39: } 68,
{ 40: } 108,
{ 41: } 108,
{ 42: } 148,
{ 43: } 148,
{ 44: } 165,
{ 45: } 184,
{ 46: } 185,
{ 47: } 203,
{ 48: } 203,
{ 49: } 237,
{ 50: } 237,
{ 51: } 237,
{ 52: } 250,
{ 53: } 252,
{ 54: } 280,
{ 55: } 306,
{ 56: } 306,
{ 57: } 326,
{ 58: } 326,
{ 59: } 326,
{ 60: } 327,
{ 61: } 328,
{ 62: } 328,
{ 63: } 328,
{ 64: } 350,
{ 65: } 351,
{ 66: } 352,
{ 67: } 374,
{ 68: } 396,
{ 69: } 418,
{ 70: } 440,
{ 71: } 441,
{ 72: } 462,
{ 73: } 483,
{ 74: } 484,
{ 75: } 507,
{ 76: } 533,
{ 77: } 533,
{ 78: } 533,
{ 79: } 559,
{ 80: } 585,
{ 81: } 611,
{ 82: } 637,
{ 83: } 663,
{ 84: } 689,
{ 85: } 689,
{ 86: } 715,
{ 87: } 741,
{ 88: } 767,
{ 89: } 793,
{ 90: } 819,
{ 91: } 845,
{ 92: } 845,
{ 93: } 846,
{ 94: } 861,
{ 95: } 874,
{ 96: } 875,
{ 97: } 892,
{ 98: } 913,
{ 99: } 914,
{ 100: } 927,
{ 101: } 955,
{ 102: } 955,
{ 103: } 955,
{ 104: } 955,
{ 105: } 968,
{ 106: } 981,
{ 107: } 994,
{ 108: } 1007,
{ 109: } 1029,
{ 110: } 1046,
{ 111: } 1058,
{ 112: } 1075,
{ 113: } 1075,
{ 114: } 1077,
{ 115: } 1091,
{ 116: } 1108,
{ 117: } 1125,
{ 118: } 1142,
{ 119: } 1159,
{ 120: } 1176,
{ 121: } 1193,
{ 122: } 1210,
{ 123: } 1227,
{ 124: } 1244,
{ 125: } 1261,
{ 126: } 1278,
{ 127: } 1295,
{ 128: } 1312,
{ 129: } 1312,
{ 130: } 1312,
{ 131: } 1312,
{ 132: } 1338,
{ 133: } 1353,
{ 134: } 1353,
{ 135: } 1355,
{ 136: } 1356,
{ 137: } 1356,
{ 138: } 1369,
{ 139: } 1369,
{ 140: } 1369,
{ 141: } 1369,
{ 142: } 1369,
{ 143: } 1382,
{ 144: } 1382,
{ 145: } 1405,
{ 146: } 1422,
{ 147: } 1457,
{ 148: } 1457,
{ 149: } 1457,
{ 150: } 1458,
{ 151: } 1471,
{ 152: } 1492,
{ 153: } 1506,
{ 154: } 1541,
{ 155: } 1541,
{ 156: } 1541,
{ 157: } 1556,
{ 158: } 1591,
{ 159: } 1613,
{ 160: } 1613,
{ 161: } 1626,
{ 162: } 1661,
{ 163: } 1661
);

yygl : array [0..yynstates-1] of Integer = (
{ 0: } 1,
{ 1: } 2,
{ 2: } 8,
{ 3: } 8,
{ 4: } 11,
{ 5: } 11,
{ 6: } 16,
{ 7: } 16,
{ 8: } 16,
{ 9: } 18,
{ 10: } 18,
{ 11: } 18,
{ 12: } 18,
{ 13: } 18,
{ 14: } 18,
{ 15: } 18,
{ 16: } 18,
{ 17: } 18,
{ 18: } 18,
{ 19: } 18,
{ 20: } 18,
{ 21: } 21,
{ 22: } 21,
{ 23: } 21,
{ 24: } 21,
{ 25: } 21,
{ 26: } 21,
{ 27: } 21,
{ 28: } 21,
{ 29: } 22,
{ 30: } 22,
{ 31: } 22,
{ 32: } 24,
{ 33: } 26,
{ 34: } 26,
{ 35: } 26,
{ 36: } 26,
{ 37: } 26,
{ 38: } 26,
{ 39: } 26,
{ 40: } 26,
{ 41: } 30,
{ 42: } 30,
{ 43: } 42,
{ 44: } 42,
{ 45: } 42,
{ 46: } 42,
{ 47: } 42,
{ 48: } 42,
{ 49: } 42,
{ 50: } 50,
{ 51: } 50,
{ 52: } 50,
{ 53: } 50,
{ 54: } 50,
{ 55: } 56,
{ 56: } 61,
{ 57: } 61,
{ 58: } 61,
{ 59: } 61,
{ 60: } 61,
{ 61: } 61,
{ 62: } 61,
{ 63: } 61,
{ 64: } 61,
{ 65: } 66,
{ 66: } 66,
{ 67: } 66,
{ 68: } 71,
{ 69: } 76,
{ 70: } 81,
{ 71: } 86,
{ 72: } 86,
{ 73: } 91,
{ 74: } 96,
{ 75: } 96,
{ 76: } 102,
{ 77: } 107,
{ 78: } 107,
{ 79: } 107,
{ 80: } 112,
{ 81: } 117,
{ 82: } 122,
{ 83: } 127,
{ 84: } 132,
{ 85: } 137,
{ 86: } 137,
{ 87: } 142,
{ 88: } 147,
{ 89: } 152,
{ 90: } 157,
{ 91: } 162,
{ 92: } 167,
{ 93: } 167,
{ 94: } 167,
{ 95: } 167,
{ 96: } 167,
{ 97: } 167,
{ 98: } 167,
{ 99: } 172,
{ 100: } 174,
{ 101: } 174,
{ 102: } 180,
{ 103: } 180,
{ 104: } 180,
{ 105: } 180,
{ 106: } 180,
{ 107: } 180,
{ 108: } 180,
{ 109: } 180,
{ 110: } 185,
{ 111: } 185,
{ 112: } 185,
{ 113: } 185,
{ 114: } 185,
{ 115: } 185,
{ 116: } 185,
{ 117: } 185,
{ 118: } 185,
{ 119: } 185,
{ 120: } 185,
{ 121: } 185,
{ 122: } 185,
{ 123: } 185,
{ 124: } 185,
{ 125: } 185,
{ 126: } 185,
{ 127: } 185,
{ 128: } 185,
{ 129: } 185,
{ 130: } 185,
{ 131: } 185,
{ 132: } 185,
{ 133: } 190,
{ 134: } 190,
{ 135: } 190,
{ 136: } 191,
{ 137: } 191,
{ 138: } 191,
{ 139: } 191,
{ 140: } 191,
{ 141: } 191,
{ 142: } 191,
{ 143: } 191,
{ 144: } 191,
{ 145: } 191,
{ 146: } 196,
{ 147: } 196,
{ 148: } 204,
{ 149: } 204,
{ 150: } 204,
{ 151: } 204,
{ 152: } 204,
{ 153: } 209,
{ 154: } 209,
{ 155: } 209,
{ 156: } 209,
{ 157: } 209,
{ 158: } 209,
{ 159: } 217,
{ 160: } 222,
{ 161: } 222,
{ 162: } 222,
{ 163: } 230
);

yygh : array [0..yynstates-1] of Integer = (
{ 0: } 1,
{ 1: } 7,
{ 2: } 7,
{ 3: } 10,
{ 4: } 10,
{ 5: } 15,
{ 6: } 15,
{ 7: } 15,
{ 8: } 17,
{ 9: } 17,
{ 10: } 17,
{ 11: } 17,
{ 12: } 17,
{ 13: } 17,
{ 14: } 17,
{ 15: } 17,
{ 16: } 17,
{ 17: } 17,
{ 18: } 17,
{ 19: } 17,
{ 20: } 20,
{ 21: } 20,
{ 22: } 20,
{ 23: } 20,
{ 24: } 20,
{ 25: } 20,
{ 26: } 20,
{ 27: } 20,
{ 28: } 21,
{ 29: } 21,
{ 30: } 21,
{ 31: } 23,
{ 32: } 25,
{ 33: } 25,
{ 34: } 25,
{ 35: } 25,
{ 36: } 25,
{ 37: } 25,
{ 38: } 25,
{ 39: } 25,
{ 40: } 29,
{ 41: } 29,
{ 42: } 41,
{ 43: } 41,
{ 44: } 41,
{ 45: } 41,
{ 46: } 41,
{ 47: } 41,
{ 48: } 41,
{ 49: } 49,
{ 50: } 49,
{ 51: } 49,
{ 52: } 49,
{ 53: } 49,
{ 54: } 55,
{ 55: } 60,
{ 56: } 60,
{ 57: } 60,
{ 58: } 60,
{ 59: } 60,
{ 60: } 60,
{ 61: } 60,
{ 62: } 60,
{ 63: } 60,
{ 64: } 65,
{ 65: } 65,
{ 66: } 65,
{ 67: } 70,
{ 68: } 75,
{ 69: } 80,
{ 70: } 85,
{ 71: } 85,
{ 72: } 90,
{ 73: } 95,
{ 74: } 95,
{ 75: } 101,
{ 76: } 106,
{ 77: } 106,
{ 78: } 106,
{ 79: } 111,
{ 80: } 116,
{ 81: } 121,
{ 82: } 126,
{ 83: } 131,
{ 84: } 136,
{ 85: } 136,
{ 86: } 141,
{ 87: } 146,
{ 88: } 151,
{ 89: } 156,
{ 90: } 161,
{ 91: } 166,
{ 92: } 166,
{ 93: } 166,
{ 94: } 166,
{ 95: } 166,
{ 96: } 166,
{ 97: } 166,
{ 98: } 171,
{ 99: } 173,
{ 100: } 173,
{ 101: } 179,
{ 102: } 179,
{ 103: } 179,
{ 104: } 179,
{ 105: } 179,
{ 106: } 179,
{ 107: } 179,
{ 108: } 179,
{ 109: } 184,
{ 110: } 184,
{ 111: } 184,
{ 112: } 184,
{ 113: } 184,
{ 114: } 184,
{ 115: } 184,
{ 116: } 184,
{ 117: } 184,
{ 118: } 184,
{ 119: } 184,
{ 120: } 184,
{ 121: } 184,
{ 122: } 184,
{ 123: } 184,
{ 124: } 184,
{ 125: } 184,
{ 126: } 184,
{ 127: } 184,
{ 128: } 184,
{ 129: } 184,
{ 130: } 184,
{ 131: } 184,
{ 132: } 189,
{ 133: } 189,
{ 134: } 189,
{ 135: } 190,
{ 136: } 190,
{ 137: } 190,
{ 138: } 190,
{ 139: } 190,
{ 140: } 190,
{ 141: } 190,
{ 142: } 190,
{ 143: } 190,
{ 144: } 190,
{ 145: } 195,
{ 146: } 195,
{ 147: } 203,
{ 148: } 203,
{ 149: } 203,
{ 150: } 203,
{ 151: } 203,
{ 152: } 208,
{ 153: } 208,
{ 154: } 208,
{ 155: } 208,
{ 156: } 208,
{ 157: } 208,
{ 158: } 216,
{ 159: } 221,
{ 160: } 221,
{ 161: } 221,
{ 162: } 229,
{ 163: } 229
);

yyr : array [1..yynrules] of YYRRec = (
{ 1: } ( len: 0; sym: -25 ),
{ 2: } ( len: 2; sym: -25 ),
{ 3: } ( len: 2; sym: -25 ),
{ 4: } ( len: 2; sym: -25 ),
{ 5: } ( len: 0; sym: -8 ),
{ 6: } ( len: 1; sym: -8 ),
{ 7: } ( len: 2; sym: -8 ),
{ 8: } ( len: 0; sym: -10 ),
{ 9: } ( len: 1; sym: -10 ),
{ 10: } ( len: 2; sym: -10 ),
{ 11: } ( len: 0; sym: -4 ),
{ 12: } ( len: 2; sym: -4 ),
{ 13: } ( len: 2; sym: -4 ),
{ 14: } ( len: 2; sym: -4 ),
{ 15: } ( len: 3; sym: -4 ),
{ 16: } ( len: 5; sym: -4 ),
{ 17: } ( len: 0; sym: -7 ),
{ 18: } ( len: 1; sym: -7 ),
{ 19: } ( len: 4; sym: -7 ),
{ 20: } ( len: 0; sym: -9 ),
{ 21: } ( len: 1; sym: -9 ),
{ 22: } ( len: 2; sym: -9 ),
{ 23: } ( len: 7; sym: -9 ),
{ 24: } ( len: 5; sym: -9 ),
{ 25: } ( len: 9; sym: -9 ),
{ 26: } ( len: 3; sym: -9 ),
{ 27: } ( len: 3; sym: -9 ),
{ 28: } ( len: 3; sym: -9 ),
{ 29: } ( len: 3; sym: -9 ),
{ 30: } ( len: 4; sym: -9 ),
{ 31: } ( len: 1; sym: -9 ),
{ 32: } ( len: 1; sym: -9 ),
{ 33: } ( len: 0; sym: -11 ),
{ 34: } ( len: 1; sym: -11 ),
{ 35: } ( len: 3; sym: -11 ),
{ 36: } ( len: 2; sym: -12 ),
{ 37: } ( len: 0; sym: -13 ),
{ 38: } ( len: 1; sym: -13 ),
{ 39: } ( len: 3; sym: -13 ),
{ 40: } ( len: 1; sym: -19 ),
{ 41: } ( len: 2; sym: -19 ),
{ 42: } ( len: 3; sym: -20 ),
{ 43: } ( len: 2; sym: -14 ),
{ 44: } ( len: 4; sym: -14 ),
{ 45: } ( len: 0; sym: -16 ),
{ 46: } ( len: 1; sym: -16 ),
{ 47: } ( len: 2; sym: -16 ),
{ 48: } ( len: 2; sym: -5 ),
{ 49: } ( len: 1; sym: -6 ),
{ 50: } ( len: 1; sym: -6 ),
{ 51: } ( len: 3; sym: -15 ),
{ 52: } ( len: 5; sym: -15 ),
{ 53: } ( len: 1; sym: -26 ),
{ 54: } ( len: 3; sym: -26 ),
{ 55: } ( len: 1; sym: -21 ),
{ 56: } ( len: 1; sym: -2 ),
{ 57: } ( len: 1; sym: -2 ),
{ 58: } ( len: 1; sym: -2 ),
{ 59: } ( len: 1; sym: -2 ),
{ 60: } ( len: 1; sym: -2 ),
{ 61: } ( len: 1; sym: -2 ),
{ 62: } ( len: 0; sym: -3 ),
{ 63: } ( len: 3; sym: -3 ),
{ 64: } ( len: 3; sym: -3 ),
{ 65: } ( len: 3; sym: -3 ),
{ 66: } ( len: 3; sym: -3 ),
{ 67: } ( len: 3; sym: -3 ),
{ 68: } ( len: 3; sym: -3 ),
{ 69: } ( len: 3; sym: -3 ),
{ 70: } ( len: 3; sym: -3 ),
{ 71: } ( len: 2; sym: -3 ),
{ 72: } ( len: 1; sym: -3 ),
{ 73: } ( len: 1; sym: -3 ),
{ 74: } ( len: 2; sym: -3 ),
{ 75: } ( len: 3; sym: -3 ),
{ 76: } ( len: 4; sym: -3 ),
{ 77: } ( len: 3; sym: -3 ),
{ 78: } ( len: 1; sym: -3 ),
{ 79: } ( len: 4; sym: -3 ),
{ 80: } ( len: 1; sym: -3 ),
{ 81: } ( len: 1; sym: -24 ),
{ 82: } ( len: 1; sym: -24 ),
{ 83: } ( len: 3; sym: -24 ),
{ 84: } ( len: 3; sym: -24 ),
{ 85: } ( len: 3; sym: -24 ),
{ 86: } ( len: 3; sym: -24 ),
{ 87: } ( len: 3; sym: -24 ),
{ 88: } ( len: 3; sym: -24 ),
{ 89: } ( len: 3; sym: -24 ),
{ 90: } ( len: 3; sym: -24 ),
{ 91: } ( len: 1; sym: -22 ),
{ 92: } ( len: 1; sym: -18 ),
{ 93: } ( len: 0; sym: -23 ),
{ 94: } ( len: 1; sym: -23 ),
{ 95: } ( len: 3; sym: -23 )
);


const _error = 256; (* error token *)

function yyact(state, sym : Integer; var act : Integer) : Boolean;
  (* search action table *)
  var k : Integer;
  begin
    k := yyal[state];
    while (k<=yyah[state]) and (yya[k].sym<>sym) do inc(k);
    if k>yyah[state] then
      yyact := false
    else
      begin
        act := yya[k].act;
        yyact := true;
      end;
  end(*yyact*);

function yygoto(state, sym : Integer; var nstate : Integer) : Boolean;
  (* search goto table *)
  var k : Integer;
  begin
    k := yygl[state];
    while (k<=yygh[state]) and (yyg[k].sym<>sym) do inc(k);
    if k>yygh[state] then
      yygoto := false
    else
      begin
        nstate := yyg[k].act;
        yygoto := true;
      end;
  end(*yygoto*);

label parse, next, error, errlab, shift, reduce, accept, abort;

begin(*yyparse*)

  (* initialize: *)

  yystate := 0; yychar := -1; yynerrs := 0; yyerrflag := 0; yysp := 0;

{$ifdef yydebug}
  yydebug := true;
{$else}
  yydebug := false;
{$endif}

parse:

  (* push state and value: *)

  inc(yysp);
  if yysp>yymaxdepth then
    begin
      yyerror('yyparse stack overflow');
      goto abort;
    end;
  yys[yysp] := yystate; yyv[yysp] := yyval;

next:

  if (yyd[yystate]=0) and (yychar=-1) then
    (* get next symbol *)
    begin
      yychar := yylex; if yychar<0 then yychar := 0;
    end;

  if yydebug then writeln('state ', yystate, ', char ', yychar);

  (* determine parse action: *)

  yyn := yyd[yystate];
  if yyn<>0 then goto reduce; (* simple state *)

  (* no default action; search parse table *)

  if not yyact(yystate, yychar, yyn) then goto error
  else if yyn>0 then                      goto shift
  else if yyn<0 then                      goto reduce
  else                                    goto accept;

error:

  (* error; start error recovery: *)

  if yyerrflag=0 then yyerror('syntax error');

errlab:

  if yyerrflag=0 then inc(yynerrs);     (* new error *)

  if yyerrflag<=2 then                  (* incomplete recovery; try again *)
    begin
      yyerrflag := 3;
      (* uncover a state with shift action on error token *)
      while (yysp>0) and not ( yyact(yys[yysp], _error, yyn) and
                               (yyn>0) ) do
        begin
          if yydebug then
            if yysp>1 then
              writeln('error recovery pops state ', yys[yysp], ', uncovers ',
                      yys[yysp-1])
            else
              writeln('error recovery fails ... abort');
          dec(yysp);
        end;
      if yysp=0 then goto abort; (* parser has fallen from stack; abort *)
      yystate := yyn;            (* simulate shift on error *)
      goto parse;
    end
  else                                  (* no shift yet; discard symbol *)
    begin
      if yydebug then writeln('error recovery discards char ', yychar);
      if yychar=0 then goto abort; (* end of input; abort *)
      yychar := -1; goto next;     (* clear lookahead char and try again *)
    end;

shift:

  (* go to new state, clear lookahead character: *)

  yystate := yyn; yychar := -1; yyval := yylval;
  if yyerrflag>0 then dec(yyerrflag);

  goto parse;

reduce:

  (* execute action, pop rule from stack, and go to next state: *)

  if yydebug then writeln('reduce ', -yyn);

  yyflag := yyfnone; yyaction(-yyn);
  dec(yysp, yyr[-yyn].len);
  if yygoto(yys[yysp], yyr[-yyn].sym, yyn) then yystate := yyn;

  (* handle action calls to yyaccept, yyabort and yyerror: *)

  case yyflag of
    yyfaccept : goto accept;
    yyfabort  : goto abort;
    yyferror  : goto errlab;
  end;

  goto parse;

accept:

  yyparse := 0; exit;

abort:

  yyparse := 1; exit;

end(*yyparse*);


{$I gmclex.pas}

var
	output : textfile;

function typeExpr(expr : Expr) : Expr; forward;
function typeBoolExpr(expr : BoolExpr) : BoolExpr; forward;

function optimizeBoolExpr(expr : BoolExpr) : BoolExpr; forward;
function optimizeExpr(expr : Expr) : Expr; forward;

procedure showExpr(expr : Expr); forward;
procedure showBoolExpr(expr : BoolExpr); forward;

function typeToString(typ : integer) : string; forward;


procedure emit(line : string);
begin
  writeln(output, line);
end;

procedure compilerError(lineNum : integer; msg : string);
begin
  writeln('error (line ', lineNum, ', file ', yyfname, '): ', msg);
 
  yyerrors := true;
end;

procedure updateLabel(id : string; lbl : integer);
var
		a : integer;
    e : Env_Entry;
begin
  for a := 0 to environment.count - 1 do
    begin
    e := environment[a];
   
    if (e.id = id) then
      begin
			e.lbl := lbl;
      break; 
      end;
    end;
end;

procedure addEnvironment(lineNum : integer; id : string; typ, lbl, varTyp : integer);
var
	  e : Env_Entry;
begin
  if (lookupEnv(id) <> nil) then
    begin
    compilerError(lineNum, 'identifier redeclared');
    exit;
    end;
       
  e := Env_Entry.Create;
  e.id := id;
  e.typ := typ;
	e.lbl := lbl;
	e.varTyp := varTyp;
	
	if (varTyp = VARTYPE_GLOBAL) then
	  begin
	  e.displ := globalCount;
	  inc(globalCount);
	  end
	else
	 	e.displ := 0;		

  environment.add(e);
end;

function lookupEnv(id : string) : Env_Entry;
var
		a : integer;
    e : Env_Entry;
begin
  Result := nil;
 
  for a := 0 to environment.count - 1 do
    begin
    e := environment[a];
   
    if (e.id = id) then
      begin
      Result := e;
      break; 
      end;
    end;
end;

function typeToString(typ : integer) : string;
begin
  case typ of 
    _INT 		: Result := 'int';
    _BOOL 	: Result := 'bool';
    _STRING : Result := 'string';
    _FLOAT  : Result := 'float';
    _VOID		: Result := 'void';
    _EXTERNAL : Result := 'external';
   
    else Result := 'unknown (' + IntToStr(typ) + ')';
  end;
end;

function coerce(expr : Expr; src, dest: integer) : Expr;
var
	cn : Expr_Conv;
begin
  if ((src = _INT) or (src = _EXTERNAL)) and (dest = _FLOAT) then
    begin
    cn := Expr_Conv.Create;
		cn.ex := expr;
		cn.cnv := CONV_TO_FLOAT;
		cn.originaltyp := src;
		cn.typ := _FLOAT;

		Result := cn;
    end
  else
  if ((src = _FLOAT) or (src = _EXTERNAL) or (src = _BOOL)) and (dest = _INT) then
    begin
    cn := Expr_Conv.Create;
		cn.ex := expr;
		cn.cnv := CONV_TO_INT;
		cn.originaltyp := src;
		cn.typ := _INT;

		Result := cn;
    end
  else
  if ((src = _INT) or (src = _FLOAT) or (src = _EXTERNAL) or (src = _BOOL)) and (dest = _STRING) then
    begin
    cn := Expr_Conv.Create;
		cn.ex := expr;
		cn.cnv := CONV_TO_STRING;
		cn.originaltyp := src;
		cn.typ := _STRING;

		Result := cn;
    end
  else
    begin
    compilerError(expr.lineNum, 'no appropriate conversion from ''' + typeToString(src) + ''' to ''' + typeToString(dest) + '''');
		Result := expr;
    end;
end;

function typeBoolExpr(expr : BoolExpr) : BoolExpr;
var
	  t1, t2 : integer;
begin
  Result := expr;
  
  if (expr = nil) then
    exit;

	Result.typ := _BOOL;

  if (expr is BoolExpr_Const) then 
		expr.typ := _BOOL
  else
  if (expr is BoolExpr_And) then 
    begin
	  BoolExpr_And(expr).le := typeBoolExpr(BoolExpr_And(expr).le);
    BoolExpr_And(expr).re := typeBoolExpr(BoolExpr_And(expr).re);

		t1 := BoolExpr_And(expr).le.typ;
		t2 := BoolExpr_And(expr).re.typ;

    if (t1 <> _BOOL) or (t2 <> _BOOL) then
      compilerError(expr.lineNum, 'expression should be boolean');

    expr.typ := _BOOL;
    end
  else
  if (expr is BoolExpr_Or) then 
    begin
	  BoolExpr_Or(expr).le := typeBoolExpr(BoolExpr_Or(expr).le);
    BoolExpr_Or(expr).re := typeBoolExpr(BoolExpr_Or(expr).re);

		t1 := BoolExpr_Or(expr).le.typ;
		t2 := BoolExpr_Or(expr).re.typ;

    if (t1 <> _BOOL) or (t2 <> _BOOL) then
      compilerError(expr.lineNum, 'expression should be boolean');

    expr.typ := _BOOL;
    end
  else
  if (expr is BoolExpr_Rel) then 
    begin
    BoolExpr_Rel(expr).le := typeExpr(BoolExpr_Rel(expr).le);
    BoolExpr_Rel(expr).re := typeExpr(BoolExpr_Rel(expr).re);

		t1 := BoolExpr_Rel(expr).le.typ;
		t2 := BoolExpr_Rel(expr).re.typ;

    if (t1 <> t2) and (t1 <> _EXTERNAL) and (t2 <> _EXTERNAL) then
      compilerError(expr.lineNum, 'no appropriate conversion from ''' + typeToString(t1) + ''' to ''' + typeToString(t2) + '''');

    expr.typ := _BOOL;
    end;
end;

function typeExpr(expr : Expr) : Expr;
var
	  t1, t2 : integer;
begin
  Result := expr;

  if (expr = nil) then
    exit;

	Result.typ := _VOID;

  if (expr is Expr_Op) then
    begin
    Expr_Op(expr).le := typeExpr(Expr_Op(expr).le);
    Expr_Op(expr).re := typeExpr(Expr_Op(expr).re);

		t1 := Expr_Op(expr).le.typ;
		t2 := Expr_Op(expr).re.typ;
		
    if (t1 <> t2) and (t1 <> _EXTERNAL) and (t2 <> _EXTERNAL) then
      Expr_Op(expr).re := coerce(Expr_Op(expr).re, t2, t1);

    expr.typ := t1;
    end
  else
  if (expr is Expr_Func) then
    begin
    Expr_Func(expr).body := typeExpr(Expr_Func(expr).body);

		expr.typ := lookupEnv(Expr_Func(expr).id).typ;
		end
  else
  if (expr is Expr_Return) then
    begin
		t1 := lookupEnv(Expr_Func(expr).id).typ;
		
		if (t1 = _VOID) then
		  begin
		  if (Expr_Return(expr).ret <> nil) then
		    compilerError(expr.lineNum, 'can not assign return value to void function');
		    
		  end
		else
		  begin
			Expr_Return(expr).ret := typeExpr(Expr_Return(expr).ret);
  		t2 := Expr_Return(expr).ret.typ;
		
  		if (t1 <> t2) and (t1 <> _EXTERNAL) and (t2 <> _EXTERNAL) then
  		  Expr_Return(expr).ret := coerce(Expr_Return(expr).ret, t2, t1);
      end;
    end
  else
  if (expr is Expr_Call) then
    begin
		t1 := lookupEnv(Expr_Call(expr).id).typ;
   
    if (t1 <> -1) then
	    expr.typ := t1
    else
	    expr.typ := _VOID;
		end
  else
  if (expr is Expr_ConstInt) then
    expr.typ := _INT
  else
  if (expr is Expr_ConstFloat) then
    expr.typ := _FLOAT
  else
  if (expr is Expr_External) then
    expr.typ := _EXTERNAL
  else
  if (expr is Expr_String) then
    expr.typ := _STRING
  else
  if (expr is Expr_Bool) then
    begin
    Expr_Bool(expr).ex := typeBoolExpr(Expr_Bool(expr).ex);

    if (Expr_Bool(expr).ex.typ <> _BOOL) then
      compilerError(expr.lineNum, 'expected boolean expression');

    expr.typ := _BOOL;
    end
  else
  if (expr is Expr_Id) then
    begin
		t1 := lookupEnv(Expr_Id(expr).id).typ;
   
    if (t1 <> -1) then
      expr.typ := t1
    else
      expr.typ := _VOID;
    end
  else
  if (expr is Expr_If) then
    begin
    Expr_If(expr).ce := typeBoolExpr(Expr_If(expr).ce);
    Expr_If(expr).le := typeExpr(Expr_If(expr).le);
    Expr_If(expr).re := typeExpr(Expr_If(expr).re);

    expr.typ := _VOID;
		end
  else
  if (expr is Expr_Seq) then
    begin
    Expr_Seq(expr).ex := typeExpr(Expr_Seq(expr).ex);
    Expr_Seq(expr).seq := typeExpr(Expr_Seq(expr).seq);

		expr.typ := _VOID;
    end
  else
  if (expr is Expr_Assign) then
    begin
    Expr_Assign(expr).id := typeExpr(Expr_Assign(expr).id);
    Expr_Assign(expr).ex := typeExpr(Expr_Assign(expr).ex);

		t1 := Expr_Assign(expr).id.typ;
		t2 := Expr_Assign(expr).ex.typ;

    if (t1 <> t2) and (t1 <> _EXTERNAL) and (t2 <> _EXTERNAL) then
      Expr_Assign(expr).ex := coerce(Expr_Assign(expr).ex, t2, t1);

		expr.typ := _VOID;
    end
  else
  if (expr is Expr_Special) then
    begin
    Expr_Special(expr).ex := typeExpr(Expr_Special(expr).ex);

		expr.typ := Expr_Special(expr).ex.typ;
    end
  else
  if (expr is Expr_Loop) then
    begin
    Expr_Loop(expr).init := typeExpr(Expr_Loop(expr).init);
    Expr_Loop(expr).ce := typeBoolExpr(Expr_Loop(expr).ce);
    Expr_Loop(expr).step := typeExpr(Expr_Loop(expr).step);
    Expr_Loop(expr).body := typeExpr(Expr_Loop(expr).body);
    end
  else
  if (expr is Expr_Cast) then
    begin
    Expr_Cast(expr).ex := typeExpr(Expr_Cast(expr).ex);
    
    t1 := Expr_Cast(expr).ex.typ;

    Result := coerce(Expr_Cast(expr).ex, t1, Expr_Cast(expr).desttype);
    
    Expr_Cast(expr).Free;
    end;
end;

function optimizeBoolExpr(expr : BoolExpr) : BoolExpr;
var
	lval, rval : boolean;
begin
  Result := expr;

  if (expr is BoolExpr_And) then 
    begin
    BoolExpr_And(expr).le := optimizeBoolExpr(BoolExpr_And(expr).le);
    BoolExpr_And(expr).re := optimizeBoolExpr(BoolExpr_And(expr).re);

    if (BoolExpr_And(expr).le is BoolExpr_Const) and (BoolExpr_And(expr).re is BoolExpr_Const) then
      begin
      lval := BoolExpr_Const(BoolExpr_And(expr).le).value;
      rval := BoolExpr_Const(BoolExpr_And(expr).re).value;

      Result := BoolExpr_Const.Create;
      BoolExpr_Const(Result).value := lval and rval;

      BoolExpr_And(expr).le.Free;
      BoolExpr_And(expr).re.Free;
      expr.Free;
      end
    else
		if (BoolExpr_And(expr).le is BoolExpr_Const) then
		  begin
      lval := BoolExpr_Const(BoolExpr_And(expr).le).value;
      
      if (lval) then
        begin
        Result := BoolExpr_And(expr).re;
        BoolExpr_And(expr).le.Free;
        expr.Free;
        end
      else
        begin
        Result := BoolExpr_And(expr).le;
        BoolExpr_And(expr).re.Free;
        expr.Free;
        end;
      end
    else
		if (BoolExpr_And(expr).re is BoolExpr_Const) then
		  begin
      lval := BoolExpr_Const(BoolExpr_And(expr).re).value;
      
      if (lval) then
        begin
        Result := BoolExpr_And(expr).le;
        BoolExpr_And(expr).re.Free;
        expr.Free;
        end
      else
        begin
        Result := BoolExpr_And(expr).re;
        BoolExpr_And(expr).le.Free;
        expr.Free;
        end;
      end; 
    end
  else
  if (expr is BoolExpr_Or) then 
    begin
    BoolExpr_Or(expr).le := optimizeBoolExpr(BoolExpr_Or(expr).le);
    BoolExpr_Or(expr).re := optimizeBoolExpr(BoolExpr_Or(expr).re);

    if (BoolExpr_Or(expr).le is BoolExpr_Const) and (BoolExpr_Or(expr).re is BoolExpr_Const) then
      begin
      lval := BoolExpr_Const(BoolExpr_Or(expr).le).value;
      rval := BoolExpr_Const(BoolExpr_Or(expr).re).value;

      Result := BoolExpr_Const.Create;
      BoolExpr_Const(Result).value := lval and rval;

      BoolExpr_Or(expr).le.Free;
      BoolExpr_Or(expr).re.Free;
      expr.Free;
      end
    else
		if (BoolExpr_Or(expr).le is BoolExpr_Const) then
		  begin
      lval := BoolExpr_Const(BoolExpr_Or(expr).le).value;
      
      if (lval) then
        begin
        Result := BoolExpr_Or(expr).le;
        BoolExpr_Or(expr).re.Free;
        expr.Free;
        end
      else
        begin
        Result := BoolExpr_Or(expr).re;
        BoolExpr_Or(expr).le.Free;
        expr.Free;
        end;
      end
    else
		if (BoolExpr_Or(expr).re is BoolExpr_Const) then
		  begin
      lval := BoolExpr_Const(BoolExpr_Or(expr).re).value;
      
      if (lval) then
        begin
        Result := BoolExpr_Or(expr).re;
        BoolExpr_Or(expr).le.Free;
        expr.Free;
        end
      else
        begin
        Result := BoolExpr_Or(expr).le;
        BoolExpr_Or(expr).re.Free;
        expr.Free;
        end;
      end; 
    end
  else
  if (expr is BoolExpr_Rel) then 
    begin
    BoolExpr_Rel(expr).le := optimizeExpr(BoolExpr_Rel(expr).le);
    BoolExpr_Rel(expr).re := optimizeExpr(BoolExpr_Rel(expr).re);
    end;
end;

function optimizeExpr(expr : Expr) : Expr;
var
	lval, rval : integer;
  bval : boolean;
begin
  Result := expr;

  if (expr is Expr_Op) then
    begin
    Expr_Op(expr).le := optimizeExpr(Expr_Op(expr).le);
    Expr_Op(expr).re := optimizeExpr(Expr_Op(expr).re);

    if (Expr_Op(expr).le is Expr_ConstInt) and (Expr_Op(expr).re is Expr_ConstInt) then
      begin
      lval := Expr_ConstInt(Expr_Op(expr).le).value;
      rval := Expr_ConstInt(Expr_Op(expr).re).value;

      case Expr_Op(expr).op of
        '+': begin
             Result := Expr_ConstInt.Create;
             Expr_ConstInt(Result).value := lval + rval;
             end;
        '-': begin
             Result := Expr_ConstInt.Create;
             Expr_ConstInt(Result).value := lval - rval;
             end;
        '*': begin
             Result := Expr_ConstInt.Create;
             Expr_ConstInt(Result).value := lval * rval;
             end;
        '/': begin
             Result := Expr_ConstInt.Create;
             Expr_ConstInt(Result).value := lval div rval;
             end;
        '%': begin
             Result := Expr_ConstInt.Create;
             Expr_ConstInt(Result).value := lval mod rval;
             end;
  			'&': emit('BAND');
  			'|': emit('BOR');
      end;
   
			Expr_Op(expr).le.Free;
			Expr_Op(expr).re.Free;
      expr.Free;
      end;
    end
  else
  if (expr is Expr_Seq) then
    begin
    Expr_Seq(expr).ex := optimizeExpr(Expr_Seq(expr).ex);
    Expr_Seq(expr).seq := optimizeExpr(Expr_Seq(expr).seq);
    end
  else
  if (expr is Expr_Func) then
    begin
    Expr_Func(expr).body := optimizeExpr(Expr_Func(expr).body);
    end
  else
  if (expr is Expr_Return) then
    begin
    Expr_Return(expr).ret := optimizeExpr(Expr_Return(expr).ret);
    end
  else
  if (expr is Expr_Assign) then
    begin
    Expr_Assign(expr).ex := optimizeExpr(Expr_Assign(expr).ex);
    end
  else
  if (expr is Expr_Call) then
    begin
    Expr_Call(expr).params := optimizeExpr(Expr_Call(expr).params);
    end
  else
  if (expr is Expr_Conv) then
    begin
    Expr_Conv(expr).ex := optimizeExpr(Expr_Conv(expr).ex);

		case Expr_Conv(expr).cnv of
 			 CONV_TO_FLOAT : if (Expr_Conv(expr).ex is Expr_ConstInt) then
                         begin
                         Result := Expr_ConstFloat.Create;
                         Expr_ConstFloat(Result).value := Expr_ConstInt(Expr_Conv(expr).ex).value;
        
        								 Expr_Conv(expr).ex.Free;
        								 expr.Free;
                         end;
  			 CONV_TO_INT : if (Expr_Conv(expr).ex is Expr_ConstFloat) then
                         begin
                         Result := Expr_ConstInt.Create;
                         Expr_ConstInt(Result).value := trunc(Expr_ConstFloat(Expr_Conv(expr).ex).value);
        
        								 Expr_Conv(expr).ex.Free;
        								 expr.Free;
                         end;
    end;
    end
  else
  if (expr is Expr_Bool) then
    begin
    Expr_Bool(expr).ex := optimizeBoolExpr(Expr_Bool(expr).ex); 
    end
  else
  if (expr is Expr_If) then
    begin
    Expr_If(expr).ce := optimizeBoolExpr(Expr_If(expr).ce); 

    if (Expr_If(expr).ce is BoolExpr_Const) then
      begin
      bval := BoolExpr_Const(Expr_If(expr).ce).value;

      if (bval) then
        Result := Expr_If(expr).le
      else
        Result := Expr_If(expr).re;
      end;
    end
  else
  if (expr is Expr_Loop) then
    begin
    Expr_Loop(expr).init := optimizeExpr(Expr_Loop(expr).init);
    Expr_Loop(expr).ce := optimizeBoolExpr(Expr_Loop(expr).ce);
    Expr_Loop(expr).step := optimizeExpr(Expr_Loop(expr).step);
    Expr_Loop(expr).body := optimizeExpr(Expr_Loop(expr).body);
    end;
end;

procedure showBoolExpr(expr : BoolExpr);
begin
  if (expr = nil) then
    exit;

  if (expr is BoolExpr_Const) then 
    begin
    if (BoolExpr_Const(expr).value) then
      emit('PUSHI 1')
    else
      emit('PUSHI 0');
    end
  else
  if (expr is BoolExpr_And) then 
    begin
    showBoolExpr(BoolExpr_And(expr).le);
    showBoolExpr(BoolExpr_And(expr).re);
    emit('AND');
    end
  else
  if (expr is BoolExpr_Or) then 
    begin
    showBoolExpr(BoolExpr_Or(expr).le);
    showBoolExpr(BoolExpr_Or(expr).re);
    emit('OR');
    end
  else
  if (expr is BoolExpr_Rel) then 
    begin
    showExpr(BoolExpr_Rel(expr).le);
    showExpr(BoolExpr_Rel(expr).re);

    if (BoolExpr_Rel(expr).op = '>') then
      emit('GT')
    else
    if (BoolExpr_Rel(expr).op = '<') then
      emit('LT')
    else
    if (BoolExpr_Rel(expr).op = '>=') then
      emit('GTE')
    else
    if (BoolExpr_Rel(expr).op = '=<') then
      emit('LTE')
    else
    if (BoolExpr_Rel(expr).op = '==') then
      emit('EQ');
    end;
end;

procedure showExpr(expr : Expr);
var
	t : integer;
	num, displ, pdispl : integer;
	e : Env_Entry;
begin
  if (expr = nil) then
    exit;

  if (expr is Expr_Op) then
    begin
    showExpr(Expr_Op(expr).le);
    showExpr(Expr_Op(expr).re);

    case Expr_Op(expr).op of
      '+': emit('ADD');
      '-': emit('SUB');
      '*': emit('MUL');
      '/': emit('DIV');
			'%': emit('MOD');
			'&': emit('BAND');
			'|': emit('BOR');
    end;
    end
  else
  if (expr is Expr_ConstInt) then
    emit('PUSHI ' + IntToStr(Expr_ConstInt(expr).value))
  else
  if (expr is Expr_ConstFloat) then
    emit('PUSHF ' + FloatToStr(Expr_ConstFloat(expr).value))
  else
  if (expr is Expr_String) then
    emit('PUSHS ' + Expr_String(expr).value)
  else
  if (expr is Expr_If) then
    begin
    showBoolExpr(Expr_If(expr).ce); 

    if (Expr_If(expr).re = nil) and (Expr_If(expr).le = nil) then
      begin
      end
    else
    if (Expr_If(expr).re <> nil) then
      begin
      emit('JZ L' + IntToStr(Expr_If(expr).lElse));
      emit('L' + IntToStr(Expr_If(expr).lThen) + ':');

      showExpr(Expr_If(expr).le);

      emit('JMP L' + IntToStr(Expr_If(expr).lAfter));
	    emit('L' + IntToStr(Expr_If(expr).lElse) + ':');
	    showExpr(Expr_If(expr).re);
			end
    else 
      begin
      emit('JZ L' + IntToStr(Expr_If(expr).lAfter));
      emit('L' + IntToStr(Expr_If(expr).lThen) + ':');
      showExpr(Expr_If(expr).le);
      end;

    emit('L' + IntToStr(Expr_If(expr).lAfter) + ':');
    end
  else
  if (expr is Expr_Func) then
    begin
    if (Expr_Func(expr).body <> nil) then
      begin
      displ := 1;
      pdispl := -2;
      num := 0;
      
      for t := 0 to environment.count - 1 do
        begin
        e := environment[t];
        
        if (pos(Expr_Func(expr).id + ':', e.id) > 0) then
          begin
          if (e.varTyp = VARTYPE_PARAM) then
            begin
            inc(num);
            e.displ := pdispl;
            dec(pdispl);
            end
          else
          if (e.varTyp = VARTYPE_LOCAL) then
            begin
            e.displ := displ;
            inc(displ);
            end;
          end;
        end;
        
	    emit('L' + IntToStr(Expr_Func(expr).lStart) + ':');
	    emit('PUSHBP');
	    emit('MSPBP');
	    
	    if (displ > 1) then
  	    emit('ADDSP ' + IntToStr(displ - 1));

			showExpr(Expr_Func(expr).body);
			
			if (expr.typ <> _VOID) then
			  begin
			  emit('POPDISP ' + IntToStr(pdispl + 1));
			  dec(num);
			  end;
			 
      emit('MBPSP');
      emit('POPBP');

			if (num > 0) then
			  begin
			  emit('MTSD ' + IntToStr(num)); 
  			  
  			emit('SUBSP ' + IntToStr(num));
  			end;
  			
			emit('RET');
	    end;
    end
  else
  if (expr is Expr_Return) then
    begin
    showExpr(Expr_Return(expr).ret);
    end
  else
  if (expr is Expr_Call) then
    begin
		t := lookupEnv(Expr_Call(expr).id).lbl;

    if (t > 0) then
      begin
  		showExpr(Expr_Call(expr).params);		
  		emit('CALL L' + IntToStr(t));
			end
    else
    if (t = -1) then
      begin
  		showExpr(Expr_Call(expr).params);		
  		emit('CALLE ' + Expr_Call(expr).id);
			end;
    end
  else
  if (expr is Expr_Bool) then
    begin
    showBoolExpr(Expr_Bool(expr).ex); 
    end
  else
  if (expr is Expr_Seq) then
    begin
    showExpr(Expr_Seq(expr).ex);
    showExpr(Expr_Seq(expr).seq);
    end
  else
  if (expr is Expr_Id) then
    begin
    e := lookupEnv(Expr_Id(expr).id);
    
    if (e.varTyp = VARTYPE_GLOBAL) then
      emit('PUSHR R' + IntToStr(e.displ))
    else
      emit('PUSHDISP ' + IntToStr(e.displ));
    end 
  else
  if (expr is Expr_External) then
    begin
    e := lookupEnv(Expr_External(expr).id);
    
    if (e.varTyp = VARTYPE_GLOBAL) then
      emit('PUSHR R' + IntToStr(e.displ))
    else
      emit('PUSHDISP ' + IntToStr(e.displ));
      
		emit('PUSHS ' + Expr_External(expr).assoc);
    emit('GET');
    end
  else
  if (expr is Expr_Assign) then
    begin
    showExpr(Expr_Assign(expr).ex);

    e := lookupEnv(Expr_Id(Expr_Assign(expr).id).id);

		if (e.typ = _EXTERNAL) then
      emit('GET');
      
    if (e.varTyp = VARTYPE_GLOBAL) then
      emit('POPR R' + IntToStr(e.displ))
    else
      emit('POPDISP ' + IntToStr(e.displ));       
    end
  else
  if (expr is Expr_Asm) then
    begin
    emit(Expr_Asm(expr).line);
    end
  else
  if (expr is Expr_Special) then
    begin
    showExpr(Expr_Special(expr).ex);
    
    case Expr_Special(expr).spec of
      SPECIAL_TRAP:   emit('TRAP');
      SPECIAL_SLEEP:	emit('SLEEP');
      SPECIAL_WAIT:		emit('WAIT');
      SPECIAL_SIGNAL:	emit('SIGNAL');
    end;
    end
	else
  if (expr is Expr_Conv) then
    begin
    showExpr(Expr_Conv(expr).ex);

		case Expr_Conv(expr).cnv of
			CONV_TO_INT : emit('TOI');
			CONV_TO_FLOAT : emit('TOF');
			CONV_TO_STRING : emit('TOS');
    end;
    end
  else
  if (expr is Expr_Loop) then
    begin
    showExpr(Expr_Loop(Expr).init);

    emit('L' + IntToStr(Expr_Loop(expr).lStart) + ':');

    showExpr(Expr_Loop(Expr).body);
    showExpr(Expr_Loop(Expr).step);
    showBoolExpr(Expr_Loop(Expr).ce);
    emit('JNZ L' + IntToStr(Expr_Loop(expr).lStart));
    end;
end;

procedure startCompiler(root : Expr);
var
  a : integer;
  e : Env_Entry;
begin
  root := typeExpr(root);

  if (not yyerrors) then
    root := optimizeExpr(root);

  if (not yyerrors) then
    begin
    emit('$DATA ' + IntToStr(globalCount));
    
    for a := 0 to environment.count - 1 do
      begin
      e := environment[a];
   
      if (e.lbl > 0) then
        begin
        emit('$SYMBOL ' + e.id + ' L' + IntToStr(e.lbl));
        end;
      end;
      
    showExpr(root); 
    
	  writeln('Output file written, datasize is ', globalCount, ' element(s).');
		end;
end;

var
	ifname : string; 
  ofname : string;
  SI : TStartupInfo;
  PI : TProcessInformation;
  ex : DWORD;

begin
  DecimalSeparator := '.';
  writeln('GMCC - GMC ''Elise'' compiler v0.3'#13#10);

  if (paramcount < 1) then
    begin
    writeln('gmcc <input file>'#13#10);
    { writeln('     -o   turn optimizations on (not implemented at the moment)');
		writeln('     -c   just compile, do not call assembler'); }
    exit;
    end;

  ifname := paramstr(1);
  ofname := ChangeFileExt(ifname, '.asm');
  
  if (not FileExists(ifname)) then
    begin
    writeln('Could not open ', ifname);
    exit;
    end;

  yyopen(ifname);

  assignfile(output, ofname);
  {$I-}
  rewrite(output);
  {$I+}

  if (IOresult <> 0) then
    begin
    writeln('Could not open ', ofname);
    exit;
    end;

  environment := TList.Create;
  labelNum := 1;
  globalCount := 0;
  yylineno := 1;

  start(INITIAL);

  if yyparse=0 then { done; };

  closefile(output);

  if (not yyerrors) then
    begin
	  FillChar(SI, SizeOf(SI), 0);
	  SI.cb := SizeOf(SI);

	  CreateProcess(nil, PChar('gasm ' + ofname), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI);

	  repeat
	    GetExitCodeProcess(PI.hProcess, ex);
	  until (ex <> STILL_ACTIVE);
    end;
end.