home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
vol_300
/
335_04
/
fryylex.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-12-04
|
30KB
|
1,089 lines
/*
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++;
}