/*
HEADER: 	;
TITLE: 		Frankenstein Cross Assemblers;
VERSION: 	2.0;
DESCRIPTION: "	Reconfigurable Cross-assembler producing Intel (TM)
		Hex format object records.  ";
KEYWORDS: 	cross-assemblers, 1805, 2650, 6301, 6502, 6805, 6809, 
		6811, tms7000, 8048, 8051, 8096, z8, z80;
SYSTEM: 	UNIX, MS-Dos ;
FILENAME: 	fryylex.c;
WARNINGS: 	"This software is in the public domain.  
		Any prior copyright claims are relinquished.  

		This software is distributed with no warranty whatever.  
		The author takes no responsibility for the consequences 
		of its use.

		Yacc (or Bison) required to compile."  ;
SEE-ALSO: 	as*.y (yacc input files);
AUTHORS: 	Mark Zenier;
COMPILERS: 	Microport Sys V/AT, ATT Yacc, Turbo C V1.5, Bison (CUG disk 285)
		(previous versions Xenix, Unisoft 68000 Version 7, Sun 3);
*/


/*
	description	lexical analyzer for framework cross assembler
	usage		Framework cross assembler, Unix
	history		September 13, 1987
			September 14, 1990  Dosify, 6 char unique names
			October, 1990  hand carved scanner
*/

#include <stdio.h>
#include "frasmdat.h"
#include "fraytok.h"

#ifndef DEBUG
#define DEBUG 0
#endif

	extern YYSTYPE yylval; 

	enum symflag {Symopcode, Symsym} whichsym = Symopcode;

	FILE *yyin;

	char finbuff[INBUFFSZ] = "L:"; 
		/* initialization nonreusable, wiped out by pass 2 */
	static char *frainptr = &finbuff[2];
		/* point to null byte after L: on start up */
	enum readacts nextreadact = Nra_normal;


frareadrec()
/*
	description	read a line, on end of file, pop the include file
			stack.
	return		FALSE	got a line
			TRUE	end of input
*/
{
	while( fgets(&finbuff[2], INBUFFSZ -2, yyin) == (char *)NULL)
	{
		if(currfstk == 0)
		{
			return TRUE;
		}
		else
		{
			fclose(yyin);
			yyin = infilestk[--currfstk].fpt;
			fprintf(intermedf, "X:%s\n",infilestk[currfstk].fnm);
		}
	}
	return FALSE;
}

static int currtok=0; /* subscript of next token to return */
static int intokcnt=0; /* number of tokens in queue */

static struct
{
	char *textstrt, *textend;
	YYSTYPE  lvalv;
	int tokv; 
	enum {Yetprint, Yetsymbol, Yetreserved, Yetopcode, 
		Yetconstant, Yetstring, Yetunprint, Yetinvalid } errtype;
}  scanqueue[INBUFFSZ], *lasttokfetch, *nexttokload;

static char tempstrpool[2*INBUFFSZ];
static char *tptrstr;

#define	 CXC00_SKIP	0
#define	 CXC01_SPACE	1
#define	 CXC02_NL	2
#define	 CXC03_LETTER	3
#define	 CXC04_QUOTE	4
#define	 CXC05_OTHER	5
#define	 CXC06_DOLLAR	6
#define	 CXC07_PERCENT	7
#define	 CXC08_APP	8
#define	 CXC09_BIN	9
#define	 CXC10_OCT	10
#define	 CXC11_DEC	11
#define	 CXC12_SEMIC	12
#define	 CXC13_LT	13
#define	 CXC14_EQ	14
#define	 CXC15_GT	15
#define	 CXC16_AT	16
#define	 CXC17_HEXU	17
#define	 CXC18_B	18
#define	 CXC19_D	19
#define	 CXC20_H	20
#define	 CXC21_OQ	21
#define	 CXC22_HEXL	22
#define	 CXC23_BL	23
#define	 CXC24_DL	24
#define	 CXC25_BSLASH	25
#define  NUMCHARSETS	26

static char chartrantab[128] = {
/* 00 nul soh stx etx*/  CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, CXC00_SKIP,
/* 04 eot enq ack bel*/  CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, CXC00_SKIP,
/* 08 bs  ht  nl  vt */  CXC00_SKIP, CXC01_SPACE, CXC02_NL, CXC00_SKIP,
/* 0c np  cr  so  si */  CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, CXC00_SKIP,
/* 10 dle dc1 dc2 dc3*/  CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, CXC00_SKIP,
/* 14 dc4 nak syn etb*/  CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, CXC00_SKIP,
/* 18 can em  sub esc*/  CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, CXC00_SKIP,
/* 1c fs  gs  rs  us */  CXC00_SKIP, CXC00_SKIP, CXC00_SKIP, CXC00_SKIP,
/* 20 sp  !  "  # */  CXC01_SPACE, CXC03_LETTER, CXC04_QUOTE, CXC05_OTHER,
/* 24  $  %  &  ' */  CXC06_DOLLAR, CXC07_PERCENT, CXC03_LETTER, CXC08_APP,
/* 28  (  )  *  + */  CXC05_OTHER, CXC05_OTHER, CXC05_OTHER, CXC05_OTHER,
/* 2c  ,  -  .  / */  CXC05_OTHER, CXC05_OTHER, CXC05_OTHER, CXC05_OTHER,
/* 30  0  1  2  3 */  CXC09_BIN, CXC09_BIN, CXC10_OCT, CXC10_OCT,
/* 34  4  5  6  7 */  CXC10_OCT, CXC10_OCT, CXC10_OCT, CXC10_OCT,
/* 38  8  9  :  ; */  CXC11_DEC, CXC11_DEC, CXC05_OTHER, CXC12_SEMIC,
/* 3c  <  =  >  ? */  CXC13_LT, CXC14_EQ, CXC15_GT, CXC05_OTHER,
/* 40  @  A  B  C */  CXC16_AT, CXC17_HEXU, CXC18_B, CXC17_HEXU,
/* 44  D  E  F  G */  CXC19_D, CXC17_HEXU, CXC17_HEXU, CXC03_LETTER,
/* 48  H  I  J  K */  CXC20_H, CXC03_LETTER, CXC03_LETTER, CXC03_LETTER,
/* 4c  L  M  N  O */  CXC03_LETTER, CXC03_LETTER, CXC03_LETTER, CXC21_OQ,
/* 50  P  Q  R  S */  CXC03_LETTER, CXC21_OQ, CXC03_LETTER, CXC03_LETTER,
/* 54  T  U  V  W */  CXC03_LETTER, CXC03_LETTER, CXC03_LETTER, CXC03_LETTER,
/* 58  X  Y  Z  [ */  CXC03_LETTER, CXC03_LETTER, CXC03_LETTER, CXC05_OTHER,
/* 5c  \  ]  ^  _ */  CXC25_BSLASH, CXC05_OTHER, CXC03_LETTER, CXC03_LETTER,
/* 60  `  a  b  c */  CXC05_OTHER, CXC22_HEXL, CXC23_BL, CXC22_HEXL,
/* 64  d  e  f  g */  CXC24_DL, CXC22_HEXL, CXC22_HEXL, CXC03_LETTER,
/* 68  h  i  j  k */  CXC20_H, CXC03_LETTER, CXC03_LETTER, CXC03_LETTER,
/* 6c  l  m  n  o */  CXC03_LETTER, CXC03_LETTER, CXC03_LETTER, CXC21_OQ,
/* 70  p  q  r  s */  CXC03_LETTER, CXC21_OQ, CXC03_LETTER, CXC03_LETTER,
/* 74  t  u  v  w */  CXC03_LETTER, CXC03_LETTER, CXC03_LETTER, CXC03_LETTER,
/* 78  x  y  z  { */  CXC03_LETTER, CXC03_LETTER, CXC03_LETTER, CXC05_OTHER,
/* 7c vb  }  ~  del*/  CXC05_OTHER, CXC05_OTHER, CXC03_LETTER, CXC00_SKIP } ;


#if DEBUG

static char * statelab[] = {
		" 0 start of label",
		" 1 comment",
		" 2 label",
		" 3 rest of line",
		" 4 symbol",
		" 5 dollar",
		" 6 hex dollar",
		" 7 at sign",
		" 8 octal at",
		" 9 percent",
		"10 bin percent",
		"11 quote string",
		"12 appos. string",
		"13 greater than",
		"14 less than",
		"15 base 2 maybe",
		"16 base 8 maybe",
		"17 base 10 maybe",
		"18 hex",
		"19 found b ",
		"20 found d",
		"21 bslash quote",
		"22 bslash appos",
		};
			
static char *actlab[] = {
		" 0 skip/no op",
		" 1 load EOL token",
		" 2 start string",
		" 3 process label",
		" 4 save string char",
		" 5 load single char token",
		" 6 load EQ token",
		" 7 process symbol",
		" 8 load $ token",
		" 9 setup for $hex",
		"10 accumulate 0-9 constant",
		"11 accumulate A-F constant",
		"12 accumulate a-f constant",
		"13 load Constant token",
		"14 load @ token",
		"15 setup for @octal",
		"16 setup for %binary",
		"17 load % token",
		"18 load String token",
		"19 load GE token",
		"20 load GT token",
		"21 load LE token",
		"22 load NE token",
		"23 load LT token",
		"24 save numeric char 0-9",
		"25 save numeric char A-F",
		"26 save numeric char a-f",
		"27 convert numeric string base 2",
		"28 convert numeric string base 8",
		"29 convert numeric string base 10",
		"30 convert numeric string base 16",
		"31 save numeric 0xb",
		"32 save numeric 0xd",
		"33 set text start",
		"34 token choke"
		};

#endif  /* DEBUG */

static struct
{
	char action;
	char nextstate;
	char contin;
} 	*thisact, characttab [23][NUMCHARSETS] =
{
/*
	STATE 0 =	{start of label}
*/
	{
	/* SKIP    */  	/* SPACE   */	/* NL      */  	/* LETTER  */ 
	/* QUOTE   */  	/* OTHER   */	/* DOLLAR  */  	/* PERCENT */ 
	/* APP     */  	/* BIN     */ 	/* OCT     */  	/* DEC     */ 
	/* SEMIC   */  	/* LT      */	/* EQ      */  	/* GT      */ 
	/* AT      */  	/* HEXU    */	/* B       */  	/* D       */ 
	/* H       */  	/* OQ      */	/* HEXL    */  	/* BL      */ 
	/* DL      */ 	/* BSLASH  */
	{0, 0, FALSE},	{0, 3, FALSE},	{1, 0, FALSE},	{2, 2, TRUE},
	{2,11, FALSE},	{5, 3, FALSE},	{33, 5, FALSE},	{33, 9, FALSE},
	{2,12, FALSE},	{2,15, TRUE},	{2,16, TRUE},	{2,17, TRUE},
	{0, 1, FALSE},	{0,14, FALSE},	{6, 3, FALSE},	{0,13, FALSE},
	{33, 7, FALSE},	{2, 2, TRUE},	{2, 2, TRUE},	{2, 2, TRUE},
	{2, 2, TRUE},	{2, 2, TRUE},	{2, 2, TRUE},	{2, 2, TRUE},
	{2, 2, TRUE},	{5, 3, FALSE}
	},

/*
	STATE 1 =	{comment}
*/
	{
	{0, 1, FALSE},	{0, 1, FALSE},	{1, 0, FALSE},	{0, 1, FALSE},
	{0, 1, FALSE},	{0, 1, FALSE},	{0, 1, FALSE},	{0, 1, FALSE},
	{0, 1, FALSE},	{0, 1, FALSE},	{0, 1, FALSE},	{0, 1, FALSE},
	{0, 1, FALSE},	{0, 1, FALSE},	{0, 1, FALSE},	{0, 1, FALSE},
	{0, 1, FALSE},	{0, 1, FALSE},	{0, 1, FALSE},	{0, 1, FALSE},
	{0, 1, FALSE},	{0, 1, FALSE},	{0, 1, FALSE},	{0, 1, FALSE},
	{0, 1, FALSE},	{0, 1, FALSE} 
	},

/*
	STATE 2 =	{label}
*/
	{
	{0, 2, FALSE},	{3, 3, FALSE},	{3, 3, TRUE},	{4, 2, FALSE},
	{3, 3, TRUE},	{3, 3, TRUE},	{3, 3, TRUE},	{3, 3, TRUE},
	{3, 3, TRUE},	{4, 2, FALSE},	{4, 2, FALSE},	{4, 2, FALSE},
	{3, 1, FALSE},	{3,14, FALSE},	{3, 3, TRUE},	{3,13, FALSE},
	{3, 3, TRUE},	{4, 2, FALSE},	{4, 2, FALSE},	{4, 2, FALSE},
	{4, 2, FALSE},	{4, 2, FALSE},	{4, 2, FALSE},	{4, 2, FALSE},
	{4, 2, FALSE},  {3, 3, TRUE} 
	},

/*
	STATE 3  =	{rest of line}
*/
	{
	{0, 3, FALSE},	{0, 3, FALSE},	{1, 0, FALSE},	{2, 4, TRUE},
	{2,11, FALSE},	{5, 3, FALSE},	{33, 5, FALSE},	{33, 9, FALSE},
	{2,12, FALSE},	{2,15, TRUE},	{2,16, TRUE},	{2,17, TRUE},
	{0, 1, FALSE},	{0,14, FALSE},	{6, 3, FALSE},	{0,13, FALSE},
	{33, 7, FALSE},	{2, 4, TRUE},	{2, 4, TRUE},	{2, 4, TRUE},
	{2, 4, TRUE},	{2, 4, TRUE},	{2, 4, TRUE},	{2, 4, TRUE},
	{2, 4, TRUE} ,	{5, 3, FALSE}
	},

/*
	STATE 4 =	{symbol}
*/
	{
	{0, 4, FALSE},	{7, 3, FALSE},	{7, 3, TRUE},	{4, 4, FALSE},
	{7, 3, TRUE},	{7, 3, TRUE},	{7, 3, TRUE},	{7, 3, TRUE},
	{7, 3, TRUE},	{4, 4, FALSE},	{4, 4, FALSE},	{4, 4, FALSE},
	{7, 1, FALSE},	{7,14, FALSE},	{7, 3, TRUE},	{7,13, FALSE},
	{7, 3, TRUE},	{4, 4, FALSE},	{4, 4, FALSE},	{4, 4, FALSE},
	{4, 4, FALSE},	{4, 4, FALSE},	{4, 4, FALSE},	{4, 4, FALSE},
	{4, 4, FALSE},	{7, 3, TRUE}
	},

/*
	STATE 5 =	{dollar}
*/
	{
	{0, 5, FALSE},	{8, 3, FALSE},	{8, 3, TRUE},	{8, 3, TRUE},
	{8, 3, TRUE},	{8, 3, TRUE},	{8, 3, TRUE},	{8, 3, TRUE},
	{8, 3, TRUE},	{9, 6, TRUE},	{9, 6, TRUE},	{9, 6, TRUE},
	{8, 1, FALSE},	{8,14, FALSE},	{8, 3, TRUE},	{8,13, FALSE},
	{8, 3, TRUE},	{9, 6, TRUE},	{9, 6, TRUE},	{9, 6, TRUE},
	{8, 3, TRUE},	{8, 3, TRUE},	{9, 6, TRUE},	{9, 6, TRUE},
	{9, 6, TRUE} ,	{8, 3, TRUE}
	},

/*
	STATE 6 =	{dollar hex}
*/

	{
	{0, 6, FALSE},	{13, 3, FALSE},	{13, 3, TRUE},	{13, 3, TRUE},
	{13, 3, TRUE},	{13, 3, TRUE},	{13, 3, TRUE},	{13, 3, TRUE},
	{13, 3, TRUE},	{10, 6, FALSE},	{10, 6, FALSE},	{10, 6, FALSE},
	{13, 1, FALSE},	{13,14, FALSE},	{13, 3, TRUE},	{13,13, FALSE},
	{13, 3, TRUE},	{11, 6, FALSE},	{11, 6, FALSE},	{11, 6, FALSE},
	{13, 3, TRUE},	{13, 3, TRUE},	{12, 6, FALSE},	{12, 6, FALSE},
	{12, 6, FALSE},	{13, 3, TRUE}
	},
/*
	STATE 7 =	{at sign}
*/
	{
	{0, 7, FALSE},	{14, 3, FALSE},	{14, 3, TRUE},	{14, 3, TRUE},
	{14, 3, TRUE},	{14, 3, TRUE},	{14, 3, TRUE},	{14, 3, TRUE},
	{14, 3, TRUE},	{15, 8, TRUE},	{15, 8, TRUE},	{14, 3, TRUE},
	{14, 1, FALSE},	{14,14, FALSE},	{14, 3, TRUE},	{14,13, FALSE},
	{14, 3, TRUE},	{14, 3, TRUE},	{14, 3, TRUE},	{14, 3, TRUE},
	{14, 3, TRUE},	{14, 3, TRUE},	{14, 3, TRUE},	{14, 3, TRUE},
	{14, 3, TRUE},	{14, 3, TRUE}
	},

/*
	STATE 8 =	{at octal}
*/
	{
	{0, 8, FALSE},	{13, 3, FALSE},	{13, 3, TRUE},	{13, 3, TRUE},
	{13, 3, TRUE},	{13, 3, TRUE},	{13, 3, TRUE},	{13, 3, TRUE},
	{13, 3, TRUE},	{10, 8, FALSE},	{10, 8, FALSE},	{13, 3, TRUE},
	{13, 1, FALSE},	{13,14, FALSE},	{13, 3, TRUE},	{13,13, FALSE},
	{13, 3, TRUE},	{13, 3, TRUE},	{13, 3, TRUE},	{13, 3, TRUE},
	{13, 3, TRUE},	{13, 3, TRUE},	{13, 3, TRUE},	{13, 3, TRUE},
	{13, 3, TRUE},	{13, 3, TRUE}
	},

/*
	STATE 9 =	{percent}
*/
	{
	{0, 9, FALSE},	{17, 3, FALSE},	{17, 3, TRUE},	{17, 3, TRUE},
	{17, 3, TRUE},	{17, 3, TRUE},	{17, 3, TRUE},	{17, 3, TRUE},
	{17, 3, TRUE},	{16,10, TRUE},	{17, 3, TRUE},	{17, 3, TRUE},
	{17, 1, FALSE},	{17,14, FALSE},	{17, 3, TRUE},	{17,13, FALSE},
	{17, 3, TRUE},	{17, 3, TRUE},	{17, 3, TRUE},	{17, 3, TRUE},
	{17, 3, TRUE},	{17, 3, TRUE},	{17, 3, TRUE},	{17, 3, TRUE},
	{17, 3, TRUE},	{17, 3, TRUE}
	},

/*
	STATE 10 =	{percent binary}
*/
	{
	{0,10, FALSE},	{13, 3, FALSE},	{13, 3, TRUE},	{13, 3, TRUE},
	{13, 3, TRUE},	{13, 3, TRUE},	{13, 3, TRUE},	{13, 3, TRUE},
	{13, 3, TRUE},	{10,10, FALSE},	{13, 3, TRUE},	{13, 3, TRUE},
	{13, 1, FALSE},	{13,14, FALSE},	{13, 3, TRUE},	{13,13, FALSE},
	{13, 3, TRUE},	{13, 3, TRUE},	{13, 3, TRUE},	{13, 3, TRUE},
	{13, 3, TRUE},	{13, 3, TRUE},	{13, 3, TRUE},	{13, 3, TRUE},
	{13, 3, TRUE},	{13, 3, TRUE}
	},

/*
	STATE 11 =	{quote string}
*/
	{
	{0,11, FALSE},	{4,11, FALSE},	{34, 3, TRUE},	{4,11, FALSE},
	{18, 3, FALSE},	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},
	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},
	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},
	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},
	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},
	{4,11, FALSE},  {4,21, FALSE}
	},

/*
	STATE 12 =	{app string}
*/
	{
	{0,12, FALSE},	{4,12, FALSE},	{34, 3, TRUE},	{4,12, FALSE},
	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},
	{18, 3, FALSE},	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},
	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},
	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},
	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},
	{4,12, FALSE},	{4,22, FALSE}
	},

/*
	STATE 13 =	{greater than}
*/
	{
	{0,13, FALSE},	{20, 3, FALSE},	{20, 3, TRUE},	{20, 3, TRUE},
	{20, 3, TRUE},	{20, 3, TRUE},	{20, 3, TRUE},	{20, 3, TRUE},
	{20, 3, TRUE},	{20, 3, TRUE},	{20, 3, TRUE},	{20, 3, TRUE},
	{20, 1, FALSE},	{20,14, FALSE},	{19, 3, FALSE},	{20,13, FALSE},
	{20, 3, TRUE},	{20, 3, TRUE},	{20, 3, TRUE},	{20, 3, TRUE},
	{20, 3, TRUE},	{20, 3, TRUE},	{20, 3, TRUE},	{20, 3, TRUE},
	{20, 3, TRUE},	{20, 3, TRUE}
	},

/*
	STATE 14 =	{less than}
*/
	{
	{0,14, FALSE},	{23, 3, FALSE},	{23, 3, TRUE},	{23, 3, TRUE},
	{23, 3, TRUE},	{23, 3, TRUE},	{23, 3, TRUE},	{23, 3, TRUE},
	{23, 3, TRUE},	{23, 3, TRUE},	{23, 3, TRUE},	{23, 3, TRUE},
	{23, 1, FALSE},	{23,14, FALSE},	{21, 3, FALSE},	{22,13, FALSE},
	{23, 3, TRUE},	{23, 3, TRUE},	{23, 3, TRUE},	{23, 3, TRUE},
	{23, 3, TRUE},	{23, 3, TRUE},	{23, 3, TRUE},	{23, 3, TRUE},
	{23, 3, TRUE},	{23, 3, TRUE}
	},

/*
	STATE 15 =	{base 2 maybe}
*/
	{
	{0,15, FALSE},	{29, 3, FALSE},	{29, 3, TRUE},	{29, 3, TRUE},
	{29, 3, TRUE},	{29, 3, TRUE},	{29, 3, TRUE},	{29, 3, TRUE},
	{29, 3, TRUE},	{24,15, FALSE},	{24,16, FALSE},	{24,17, FALSE},
	{29, 1, FALSE},	{29,14, FALSE},	{29, 3, TRUE},	{29,13, FALSE},
	{29, 3, TRUE},	{25,18, FALSE},	{0,19, FALSE},	{0,20, FALSE},
	{30, 3, FALSE},	{28, 3, FALSE},	{26,18, FALSE},	{0,19, FALSE},
	{0,20, FALSE},	{29, 3, TRUE}
	},

/*
	STATE 16 =	{base 8 maybe}
*/
	{	
	{0,16, FALSE},	{29, 3, FALSE},	{29, 3, TRUE},	{29, 3, TRUE},
	{29, 3, TRUE},	{29, 3, TRUE},	{29, 3, TRUE},	{29, 3, TRUE},
	{29, 3, TRUE},	{24,16, FALSE},	{24,16, FALSE},	{24,17, FALSE},
	{29, 1, FALSE},	{29,14, FALSE},	{29, 3, TRUE},	{29,13, FALSE},
	{29, 3, TRUE},	{25,18, FALSE},	{25,18, FALSE},	{0,20, FALSE},
	{30, 3, FALSE},	{28, 3, FALSE},	{26,18, FALSE},	{26,18, FALSE},
	{0,20, FALSE},	{29, 3, TRUE}
	},

/*
	STATE 17 =	{base10 maybe}
*/
	{	
	{0,17, FALSE},	{29, 3, FALSE},	{29, 3, TRUE},	{29, 3, TRUE},
	{29, 3, TRUE},	{29, 3, TRUE},	{29, 3, TRUE},	{29, 3, TRUE},
	{29, 3, TRUE},	{24,17, FALSE},	{24,17, FALSE},	{24,17, FALSE},
	{29, 1, FALSE},	{29,14, FALSE},	{29, 3, TRUE},	{29,13, FALSE},
	{29, 3, TRUE},	{25,18, FALSE},	{25,18, FALSE},	{0,20, FALSE},
	{30, 3, FALSE},	{34, 3, FALSE},	{26,18, FALSE},	{26,18, FALSE},
	{0,20, FALSE},	{29, 3, TRUE}
	},

/*
	STATE 18 =	{hex}
*/
	{	
	{0,18, FALSE},	{34, 3, FALSE},	{34, 3, TRUE},	{34, 3, TRUE},
	{34, 3, TRUE},	{34, 3, TRUE},	{34, 3, TRUE},	{34, 3, TRUE},
	{34, 3, TRUE},	{24,18, FALSE},	{24,18, FALSE},	{24,18, FALSE},
	{34, 1, FALSE},	{34,14, FALSE},	{34, 3, TRUE},	{34,13, FALSE},
	{34, 3, TRUE},	{25,18, FALSE},	{25,18, FALSE},	{25,18, FALSE},
	{30, 3, FALSE},	{34, 3, TRUE},	{26,18, FALSE},	{26,18, FALSE},
	{26,18, FALSE},	{34, 3, TRUE}
	},

/*
	STATE 19 =	{bin or hex}
*/
	{	
	{0,19, FALSE},	{27, 3, FALSE},	{27, 3, TRUE},	{27, 3, TRUE},
	{27, 3, TRUE},	{27, 3, TRUE},	{27, 3, TRUE},	{27, 3, TRUE},
	{27, 3, TRUE},	{31,18, TRUE},	{31,18, TRUE},	{31,18, TRUE},
	{27, 1, FALSE},	{27,14, FALSE},	{27, 3, TRUE},	{27,13, FALSE},
	{27, 3, TRUE},	{31,18, TRUE},	{31,18, TRUE},	{31,18, TRUE},
	{31,18, TRUE},	{27, 3, TRUE},	{31,18, TRUE},	{31,18, TRUE},
	{31,18, TRUE},	{27, 3, TRUE}
	},

/*
	STATE 20 =	{dec or hex}
*/
	{	
	{0,20, FALSE},	{29, 3, FALSE},	{29, 3, TRUE},	{29, 3, TRUE},
	{29, 3, TRUE},	{29, 3, TRUE},	{29, 3, TRUE},	{29, 3, TRUE},
	{29, 3, TRUE},	{32,18, TRUE},	{32,18, TRUE},	{32,18, TRUE},
	{29, 1, FALSE},	{29,14, FALSE},	{29, 3, TRUE},	{29,13, FALSE},
	{29, 3, TRUE},	{32,18, TRUE},	{32,18, TRUE},	{32,18, TRUE},
	{32,18, TRUE},	{29, 3, TRUE},	{32,18, TRUE},	{32,18, TRUE},
	{32,18, TRUE},	{29, 3, TRUE}
	},

/*
	STATE 21 =	{bslash quote}
*/
	{
	{0,21, FALSE},	{4,11, FALSE},	{34, 3, TRUE},	{4,11, FALSE},
	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},
	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},
	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},
	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},
	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},	{4,11, FALSE},
	{4,11, FALSE},  {4,11, FALSE}
	},

/*
	STATE 22 =	{bslash appos}
*/
	{
	{0,22, FALSE},	{4,12, FALSE},	{34, 3, TRUE},	{4,12, FALSE},
	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},
	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},
	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},
	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},
	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},	{4,12, FALSE},
	{4,12, FALSE},	{4,12, FALSE}
	}
};
	
#define YEXL 32
static char yytext[YEXL];

static char *erryytextex(type)
	int type;
{
	char * strptr, *endptr;
	int charcnt;

	strptr = (lasttokfetch -> textstrt) - 1;
	if(type == STRING)
	{
		endptr = (lasttokfetch -> textend) - 1;
		if(*endptr == '\n')
			endptr --;
	}
	else
	{
		endptr = (lasttokfetch -> textend) - 2;
	}

	for(charcnt = 0; (strptr <= endptr) && charcnt < (YEXL - 1); charcnt ++)
	{
		yytext[charcnt] = *strptr++;
	}
	yytext[charcnt] = '\0';
}

int yylex()
{
	int scanstate;
	char *thistokstart;
	register char nextchar;
	int charset;
	long consaccum, consbase;



	if(currtok >= intokcnt)
	{
		switch(nextreadact)
		{
		case Nra_new:  /* access next file */
			fprintf(intermedf, "F:%s\n", infilestk[++currfstk].fnm);
			yyin = infilestk[currfstk].fpt;
			nextreadact = Nra_normal;
		case Nra_normal:
			if(frareadrec())
			{
				/* EOF */;
				return 0;
			}
			break;

		case Nra_end:  /* pop file and access previous */
			if(currfstk > 0)
			{
				fclose(yyin);
				yyin = infilestk[--currfstk].fpt;
				fprintf(intermedf, "X:%s\n",
					infilestk[currfstk].fnm);
				if(frareadrec())
				{
					/* EOF */;
					return 0;
				}
				else
				{
					nextreadact = Nra_normal;
				}
			}
			else
			{
				/* EOF */;
				return 0;
			}
			break;
		}

		if(listflag)
		{
			fputs(finbuff, intermedf);
		}
		else
		{
			fputs("L:\n", intermedf);
		}

		/* Scan a line */

		frainptr = &finbuff[2];

		currtok = intokcnt = 0;
		nexttokload = & scanqueue[0];

		tptrstr = &tempstrpool[0];
		scanstate = 0;
		whichsym = Symopcode;

		while( (nextchar = *frainptr++) != '\0' )
		{
			charset = chartrantab[nextchar & 0x7f];
			do {
				thisact =  & characttab [scanstate][charset];

#if DEBUG
	if(isprint(nextchar))
		printf("%c    ", nextchar);
	else
		printf("0x%2.2x ", nextchar);
	printf("%-18s %-33s %-11s  %2.2d\n",
		statelab[scanstate],
		actlab[thisact -> action],
		thisact -> contin ? "Continue" : "Swallow",
		thisact -> nextstate);
#endif

				switch(thisact -> action)
				{
				case 0: /* skip/no op */
					break;

				case 1: /* load EOL token */
					nexttokload -> lvalv.longv = 0;
					nexttokload -> tokv = EOL;
					nexttokload -> errtype = Yetunprint;
					nexttokload++;
					intokcnt++; 
					break;

				case 2: /* start string */
					thistokstart = tptrstr;
					nexttokload -> textstrt = frainptr;
					break;

				case 3: /* process label */
					{
			struct symel *tempsym;

			*tptrstr++ = '\0';
			tempsym = symbentry(thistokstart, SYMBOL);
			if((tempsym -> seg) != SSG_RESV)
			{
				nexttokload -> tokv = LABEL;
				nexttokload -> errtype = Yetsymbol;
				nexttokload -> lvalv.symb = tempsym;
			}
			else
			{
				nexttokload -> tokv = tempsym -> tok;
				nexttokload -> errtype = Yetreserved;
				nexttokload -> lvalv.intv = tempsym -> value;
			}
			nexttokload -> textend = frainptr;
			nexttokload++;
			intokcnt++; 
					}
					break;

				case 4: /* save string char */
					*tptrstr++ = nextchar;
					break;

				case 5: /* load single char token */
					nexttokload -> lvalv.longv = 0;
					nexttokload -> tokv = nextchar;
					nexttokload -> errtype = Yetprint;
					nexttokload++;
					intokcnt++; 
					break;

				case 6: /* load EQ token */
					nexttokload -> lvalv.longv = 0;
					nexttokload -> tokv = KEOP_EQ;
					nexttokload -> errtype = Yetunprint;
					nexttokload++;
					intokcnt++;
					break;

				case 7: /* process symbol */
					{
			register struct symel *symp;
			register char *ytp;
			int tempov;

			*tptrstr++ = '\0';
			if(whichsym == Symopcode)
			{
				for(ytp = thistokstart; *ytp != '\0'; 
					ytp++)
				{
					if(islower(*ytp))
					{
						*ytp = toupper(*ytp);
					}
				}
				nexttokload -> lvalv.intv 
					= tempov = findop(thistokstart);
				nexttokload -> tokv = 
					optab[tempov].token;
				nexttokload -> errtype = Yetopcode;
				whichsym = Symsym;
			}
			else
			{
				symp = symbentry(thistokstart,SYMBOL);
				if(symp -> seg != SSG_RESV)
				{
					nexttokload -> lvalv.symb = symp;
					nexttokload -> errtype = Yetsymbol;
				}
				else
				{
					nexttokload -> lvalv.intv 
						= symp->value;
					nexttokload -> errtype = Yetreserved;
				}

				nexttokload -> tokv = symp -> tok;
			}

			nexttokload -> textend = frainptr;
			nexttokload++;
			intokcnt++;
					}
					break;

				case 8: /* load $ token */
					nexttokload -> lvalv.longv = 0;
					nexttokload -> tokv = '$';
					nexttokload -> errtype = Yetprint;
					nexttokload++;
					intokcnt++;
					break;

				case 9: /* setup for $hex */
					consbase = 16;
					consaccum = 0;
					break;

				case 10: /* accumulate 0-9 constant */
					consaccum = (consaccum * consbase)
						+ (nextchar - '0');
					break;

				case 11: /* accumulate A-F constant  */
					consaccum = (consaccum * consbase)
						+ (nextchar - 'A' + 10);
					break;

				case 12: /* accumulate a-f constant */
					consaccum = (consaccum * consbase)
						+ (nextchar - 'a' + 10);
					break;

				case 13: /* load Constant token */
					nexttokload -> lvalv.longv = 
						consaccum;
					nexttokload -> tokv = CONSTANT;
					nexttokload -> errtype = Yetconstant;
					nexttokload -> textend = frainptr;
					nexttokload++;
					intokcnt++;
					break;

				case 14: /* load @ token */
					nexttokload -> lvalv.longv = 0;
					nexttokload -> tokv = '@';
					nexttokload -> errtype = Yetprint;
					nexttokload++;
					intokcnt++;
					break;

				case 15: /* setup for @octal */
					consbase = 8;
					consaccum = 0;
					break;

				case 16: /* setup for %binary */
					consbase = 2;
					consaccum = 0;
					break;

				case 17: /* load % token */
					nexttokload -> lvalv.longv = 0;
					nexttokload -> tokv = '%';
					nexttokload -> errtype = Yetprint;
					nexttokload++;
					intokcnt++;
					break;

				case 18: /* load String token */
					*tptrstr++  = '\0';
					nexttokload -> lvalv.strng = 
						thistokstart;
					nexttokload -> tokv = STRING;
					nexttokload -> errtype = Yetstring;
					nexttokload -> textend = frainptr;
					nexttokload++;
					intokcnt++;
					break;

				case 19: /* load GE token */
					nexttokload -> lvalv.longv = 0;
					nexttokload -> tokv = KEOP_GE;
					nexttokload -> errtype = Yetunprint;
					nexttokload++;
					intokcnt++;
					break;

				case 20: /* load GT token */
					nexttokload -> lvalv.longv = 0;
					nexttokload -> tokv = KEOP_GT;
					nexttokload -> errtype = Yetunprint;
					nexttokload++;
					intokcnt++;
					break;

				case 21: /* load LE token */
					nexttokload -> lvalv.longv = 0;
					nexttokload -> tokv = KEOP_LE;
					nexttokload -> errtype = Yetunprint;
					nexttokload++;
					intokcnt++;
					break;

				case 22: /* load NE token */
					nexttokload -> lvalv.longv = 0;
					nexttokload -> tokv = KEOP_NE;
					nexttokload -> errtype = Yetunprint;
					nexttokload++;
					intokcnt++;
					break;

				case 23: /* load LT token */
					nexttokload -> lvalv.longv = 0;
					nexttokload -> tokv = KEOP_LT;
					nexttokload -> errtype = Yetunprint;
					nexttokload++;
					intokcnt++;
					break;

				case 24: /* save numeric char 0-9 */
					*tptrstr++ = nextchar - '0';
					break;

				case 25: /* save numeric char A-F */
					*tptrstr++ = nextchar - 'A' + 10;
					break;

				case 26: /* save numeric char a-f */
					*tptrstr++ = nextchar - 'a' + 10;
					break;

				case 27: /* convert numeric string base 2 */
					{
			consaccum = 0;
			while(thistokstart < tptrstr)
			{
				consaccum = (consaccum * 2) + *thistokstart++;
			}
			nexttokload -> lvalv.longv = consaccum;
			nexttokload -> tokv = CONSTANT;
			nexttokload -> errtype = Yetconstant;
			nexttokload -> textend = frainptr;
			nexttokload++;
			intokcnt++;
					}
					break;

				case 28: /* convert numeric string base 8 */
					{
			consaccum = 0;
			while(thistokstart < tptrstr)
			{
				consaccum = (consaccum * 8) + *thistokstart++;
			}
			nexttokload -> lvalv.longv = consaccum;
			nexttokload -> tokv = CONSTANT;
			nexttokload -> errtype = Yetconstant;
			nexttokload -> textend = frainptr;
			nexttokload++;
			intokcnt++;
					}
					break;

				case 29: /* convert numeric string base 10 */
					{
			consaccum = 0;
			while(thistokstart < tptrstr)
			{
				consaccum = (consaccum * 10) + *thistokstart++;
			}
			nexttokload -> lvalv.longv = consaccum;
			nexttokload -> tokv = CONSTANT;
			nexttokload -> errtype = Yetconstant;
			nexttokload -> textend = frainptr;
			nexttokload++;
			intokcnt++;
					}
					break;

				case 30: /* convert numeric string base 16 */
					{
			consaccum = 0;
			while(thistokstart < tptrstr)
			{
				consaccum = (consaccum * 16) + *thistokstart++;
			}
			nexttokload -> lvalv.longv = consaccum;
			nexttokload -> tokv = CONSTANT;
			nexttokload -> errtype = Yetconstant;
			nexttokload -> textend = frainptr;
			nexttokload++;
			intokcnt++;
					}
					break;

				case 31: /* save numeric 0xb */
					*tptrstr++ = 0xb;
					break;

				case 32: /* save numeric 0xd */
					*tptrstr++ = 0xd;
					break;

				case 33: /* set text start */
					nexttokload -> textstrt = frainptr;
					break;
				
				case 34: /* token choke */
					nexttokload -> lvalv.longv = 0L;
					nexttokload -> tokv = KTK_invalid;
					nexttokload -> errtype = Yetinvalid;
					nexttokload -> textend = frainptr;
					nexttokload++;
					intokcnt++;
					break;
				}

				scanstate = thisact -> nextstate;

			}  while( thisact -> contin);
		}

		if(intokcnt <= 0)
		{ /* no tokens in line (comment or whitespace overlength) */
			scanqueue[0].tokv = EOL;
			scanqueue[0].errtype = Yetunprint;
			scanqueue[0].lvalv.longv = 0;
			intokcnt = 1;
		}

		if(scanstate != 0)
		{ /* no EOL */
			fraerror("Overlength/Unterminated Line");
		}
	}
	lasttokfetch = &scanqueue[currtok++];
	yylval = lasttokfetch -> lvalv;
	return lasttokfetch -> tokv;
}


yyerror(str)
	char *str;
/*	
	description	first pass - output a parser error to intermediate file
*/
{
	char * taglab;

	switch(lasttokfetch -> errtype)
	{
	case Yetprint:
		if( ! isprint(lasttokfetch -> tokv))
		{
			fprintf(intermedf, 
				"E: ERROR - %s at/before character \"^%c\"\n",
				str, PRINTCTRL(lasttokfetch -> tokv));
		}
		else
		{
			fprintf(intermedf, 
				"E: ERROR - %s at/before character \"%c\"\n",
				str, lasttokfetch -> tokv );
		}
		break;

	case Yetsymbol: 
	case Yetreserved: 
	case Yetopcode: 
	case Yetconstant: 
		erryytextex(SYMBOL);
		fprintf(intermedf, "E: ERROR - %s at/before token \"%s\" \n",
			str, yytext);
		break;

	case Yetinvalid: 
		erryytextex(SYMBOL);
		fprintf(intermedf, "E: ERROR - %s at invalid token \"%s\" \n",
			str, yytext);
		break;

	case Yetstring:
		erryytextex(STRING);
		fprintf(intermedf, "E: ERROR - %s at/before string %s \n",
			str, yytext);
		break;

	case Yetunprint:
		switch(lasttokfetch -> tokv)
		{
		case EOL:
			taglab = "End of Line";
			break;
		case KEOP_EQ:
			taglab = "\"=\"";
			break;
		case KEOP_GE:
			taglab = "\">=\"";
			break;
		case KEOP_GT:
			taglab = "\">\"";
			break;
		case KEOP_LE:
			taglab = "\"<=\"";
			break;
		case KEOP_NE:
			taglab = "\"<>\"";
			break;
		case KEOP_LT:
			taglab = "\"<\"";
			break;
		default:
			taglab = "Undeterminable Symbol";
			break;
		}
		fprintf(intermedf, "E: ERROR - %s at/before %s\n",
			str, taglab);
		break;

	default:
		fprintf(intermedf, "E: ERROR - %s - undetermined yyerror type\n",
			str);
		break;
	}

	errorcnt++;
}
