/* * makedev.c: Generate /dev entries * * Based on the MAKEDEV shell script, version 2.0, distributed with * util-linux 1.10 and written by Nick Holloway. * * A number of bugs were fixed, and some additional features added. * Written 10-Dec-94 by David A. Holland, dholland@husc.harvard.edu * * Copyright 1994, 1995. All rights reserved. * See the file LEGAL.NOTICE for conditions of redistribution. * * Bugs: * None known right now. * * History: * * Version 1.4a: Sun Feb 26 18:08:45 1995, faith@cs.unc.edu * Forced devinfo and makedev to be in /etc * Version 1.4: 15-Jan-95 Wrote man pages. Now reads DEVINFO.local. * Version 1.3: 31-Dec-94 Bug fixes. Added batches. Added omits. * Version 1.2: 11-Dec-94 Add configuration file parsing. * Version 1.1: 11-Dec-94 Distinguish block and character devices in the * table of major device numbers. Changed the name and format of the * update cache file to include the type. It appears that the old script * was broken in this regard. * Version 1.0: 10-Dec-94 Initial version. */ static const char *version = "MAKEDEV-C version 1.4a"; #include #include #include #include #include #include #include #include #include #define YES 1 #define NO 0 static int isverbose=NO; /* flag: print out what we do? */ static int deletion=NO; /* flag: delete instead of create */ static int donothing=NO; /* flag: don't actually do anything */ /* * Proto for main operative function. */ typedef enum { M_CREATE, M_OMIT } makeopts; static void make(const char *batch_or_grp_or_devname, makeopts); /* * Roll over and die. */ static void crash(const char *msg) { fprintf(stderr, "MAKEDEV: %s\n", msg); exit(1); } /* * Print a warning. */ static void warn(const char *format, ...) { va_list ap; va_start(ap, format); fprintf(stderr, "MAKEDEV: "); vfprintf(stderr, format, ap); fprintf(stderr, "\n"); va_end(ap); } /* * Translate string name to uid. */ static uid_t name2uid(const char *name) { struct passwd *p = getpwnam(name); if (!p) warn("undefined user: %s, using uid 0", name); return p ? p->pw_uid : 0; /* make things owned by root by default */ } /* * Translate string name to gid. */ static gid_t name2gid(const char *name) { struct group *g = getgrnam(name); if (!g) warn("undefined group: %s, using gid 0", name); return g ? g->gr_gid : 0; /* group 0 is a good default too */ } /* * Proto for parser. */ static void doparse(FILE *f, int filetype, const char *filename); /************************* device classes *************************/ /* * A device class is a string attached to the device which tells us * what set of permissions and ownership should be used. This is the * table of classes. */ typedef struct { const char *classname; const char *owner; const char *group; int mode; } devclass; #define MAXCLASSES 32 static devclass classes[MAXCLASSES]; static int nclasses=0; static void addclass(const char *name, const char *o, const char *g, int m) { if (nclasses>=MAXCLASSES) crash("out of space for device classes"); classes[nclasses].classname = name; classes[nclasses].owner = o; classes[nclasses].group = g; classes[nclasses].mode = m; nclasses++; name2uid(o); /* check for undefined users/groups */ name2gid(g); } static void loadclasses(void) { FILE *f = fopen("/etc/makedev.cfg", "r"); if (!f) crash("can't find makedev.cfg"); doparse(f, 4, "makedev.cfg"); fclose(f); } /* * Return the index into the above table for a particular class name. */ static int which_class(const char *name) { int i; for (i=0; i=0; i--, z<<=1) if (!(mode&z)) rv[i]='-'; return rv; } /* * Create (or delete, or update) a block or character device. */ static void class_makedev(const char *name, const char *class, int major, int minor, char type) { int x = which_class(class), mode = classes[x].mode; const char *owner = classes[x].owner, *group = classes[x].group; if (isverbose) { if (deletion) printf("rm -f %s\n", name); else printf("%c%s 1 %-8s %-8s %3d, %3d for %s\n", type, modestring(mode), owner, group, major, minor, name); } if (donothing) return; if (unlink(name) && deletion) warn("Couldn't remove %s\n", name); if (!deletion) { dev_t q = (major<<8) | minor; if (mknod(name, type=='c' ? S_IFCHR : S_IFBLK, q) || chown(name, name2uid(owner), name2gid(group)) || chmod(name, mode)) { warn("couldn't create %s: %s", name, strerror(errno)); } } } /************************* major number list *************************/ /* * In Linux device major numbers can be allocated dynamically, so we go * look in /proc/devices to see what they are. This keeps track of things. */ typedef struct { const char *procname; int flag; } majorentry; #define MAXMAJORS 256 static majorentry cmajors[MAXMAJORS]; /* initialized to 0 */ static majorentry bmajors[MAXMAJORS]; /* initialized to 0 */ static int no_proc=0; /* true if we didn't find /proc/devices */ /* * Store the name associated with a particular major device number. */ static void set_major(const char *procname, int ischar, int num) { if (num<0 || num>255) { warn("warning: got bogus major number %d for %s", num, procname); return; } if (ischar) cmajors[num].procname=procname; else bmajors[num].procname=procname; } /* * Look up a major device number by name; return the default value * if provided. A default value of -1 implies the device is only * dynamic, and so if there's no entry we shouldn't even note its * existence. */ static int get_major(const char *procname, int ischar, int defaalt) { int i; if (!procname) return defaalt; if (ischar) { for (i=0; i=MAXALIASES) crash("out of space for aliases"); aliases[naliases].procname = procname; aliases[naliases].groupname = groupname; naliases++; } static void ignore_procname(const char *procname) { addalias(procname, NULL); } static const char *procnameof(const char *groupname) { int i; for (i=0; i=MAXBATCHES) crash("Out of space for batches"); b = &batches[nbatches++]; b->name = name; b->busy = NO; return b; } /* * Add something to a batch. */ static batch *add2batch(batch *b, const char *target) { if (b->ntargets>=MAXTARGETS) { warn("Too many targets for batch %s (max %d)", b->name, MAXTARGETS); return b; } b->targets[b->ntargets++] = target; return b; } /* * Run a batch. */ static void run_batch(const batch *b, makeopts m) { int i; for (i=0; intargets; i++) make(b->targets[i], m); } /* * Try to run a batch; returns YES if it found one. */ static int try_run_batch(const char *name, makeopts m) { int i; for (i=0; i owner and permissions) */ int major, minor; /* device number */ char type; /* 'c', 'b', or 'l' for symbolic link */ int omit; /* don't make me if this is nonzero */ } device; /* * Create a device (link or actual "special file") - special files are * passed on to class_makedev(). */ void makedev(device *d, makeopts m) { if (m==M_OMIT) { d->omit=1; } if (d->omit==1) return; if (d->type=='l') { if (isverbose) { if (deletion) printf("rm -f %s\n", d->name); else printf("lrwxrwxrwx %s -> %s\n", d->name, d->class); } if (donothing) return; if (unlink(d->name) && deletion) warn("Couldn't remove %s\n", d->name); if (!deletion) { if (symlink(d->class, d->name)) /* class holds thing pointed to */ warn("couldn't link %s -> %s: %s", d->name, d->class, strerror(errno)); } } else class_makedev(d->name, d->class, d->major, d->minor, d->type); } /* * Array of devices. We allocate it once from main(); it doesn't grow. * Should maybe make it growable sometime. This keeps track of all possible * devices. We build this thing first, and then create devices from it as * requested. */ static device *devices = NULL; static int maxdevices, ndevices; /* * Allocate space for the device array. */ static void allocate_devs(int nd) { devices = malloc(nd * sizeof(device)); if (!devices) crash("Out of memory"); ndevices = 0; maxdevices = nd; } /* * Check all the devices for having valid device classes. */ static void check_classes(void) { int i; const char *q=NULL; for (i=0; i=maxdevices) crash("out of space for devices"); devices[ndevices].name = name; devices[ndevices].grp = grp; devices[ndevices].class = class; devices[ndevices].major = major; devices[ndevices].minor = minor; devices[ndevices].type = type; devices[ndevices].omit = 0; ndevices++; } /* * Create an entry for a symbolic link "device", such as /dev/fd * (which is a symbolic link to /proc/self/fd) */ static void initlink(const char *name, const char *grp, const char *target) { init(name, grp, target, 0, 0, 'l'); } /* * Init lots of devices. This creates a number of devices, numbered between * lo and hi. The idea is that "base" contains a %d or %x (or something like * that) in it which pulls in the number. The device group can also do this, * though this will in most cases not be useful. "baseminor" is the minor * number of the first device created. */ static void initlots(const char *base, int lo, int hi, const char *grp, const char *class, int maj, int baseminor, int type) { char buf[32], gbuf[32]; int i; if (maj<0) return; for (i=lo; i=high) return; b = addbatch(base); for (i=low; i<=high; i++) { char *q; sprintf(buf, "%s%c", base, i); q = strdup(buf); init(q, q, "disk", maj, (i-low)*minmult, 'b'); strcpy(buf2, buf); strcat(buf2, "%d"); initlots(buf2, 1, nparts, buf, "disk", maj, (i-low)*minmult+1, 'b'); add2batch(b, q); } } static void initdevs(void) { FILE *f = fopen("/etc/devinfo", "r"); if (!f) crash("Can't find devinfo"); doparse(f,3, "devinfo"); fclose(f); f = fopen("/etc/devinfo.local", "r"); if (!f) f = fopen("/usr/local/etc/devinfo.local", "r"); if (f) { doparse(f,3, "devinfo.local"); fclose(f); } } /************************** update *************************/ /* * Call make() with our names for something that appeared in /proc/devices. */ static void transmake(const char *procname, makeopts m) { const char *gname = groupnameof(procname); if (gname) make(gname, m); } /* * Update a device that appeared in MAKEDEV.cache. Whenever we update, * we save what we did into MAKEDEV.cache; this lets us avoid doing * them over the next time. We only do something if the device has * disappeared or the major number has changed. * * Note that this caching made the shell version go much faster (it took * around 15 seconds with the cache, vs. over a minute if the cache was * blown away.) For us, it still does, but it hardly matters: it shaves * one second off a two-second execution. * * Also note the old script used DEVICES instead of MAKEDEV.cache. We * changed because the old file didn't record whether something was * a block or character device; since the sets of numbers are independent, * this was bound to break. */ static void update2(const char *name, int ischar, int major) { int now = get_major(name, ischar, -1); if (now<0) { deletion = 1; /* must have been zero if we're doing an update */ transmake(name, M_CREATE); deletion = 0; } else if (now!=major) { /* oops, it moved; remake it */ transmake(name, M_CREATE); if (ischar) cmajors[now].flag=1; else bmajors[now].flag=1; } else { if (ischar) cmajors[now].flag=1; /* unchanged; inhibit remaking it */ else bmajors[now].flag=1; /* unchanged; inhibit remaking it */ } } static void updatefromcache(const char *name, int major, int type) { update2(name, type=='c', major); } /* * Update. Read the information stored in MAKEDEV.cache from the last * update; fix anything that changed; then create any new devices that * weren't listed the last time. (We use the "flag" field in the * majors array to check this.) At that point, write out a new * cache file. */ #define CACHEFILE "MAKEDEV.cache" static void update(void) { FILE *f; int i; if (no_proc) { warn("Couldn't read anything from /proc/devices"); return; } if (deletion) { warn("update and -d are incompatible"); return; } f = fopen(CACHEFILE, "r"); if (f) { doparse(f, 2, CACHEFILE); fclose(f); } for (i=0; i #include #include #include #define RULE_CONTEXT (&((PCB).cs[(PCB).ssx])) #define ERROR_CONTEXT ((PCB).cs[(PCB).error_frame_ssx]) #define CONTEXT ((PCB).cs[(PCB).ssx]) parse_pcb_type parse_pcb; #define PCB parse_pcb #line 698 "/usr/local/src/makedev/makedev.syn" /************************* parsing support *************************/ /* * Don't use the built-in error printing. */ #define SYNTAX_ERROR #define PARSER_STACK_OVERFLOW #define REDUCTION_TOKEN_ERROR static void doparse(FILE *f, int filetype, const char *filename) { char *x; int i=0, len; if (filetype<1 || filetype>4) crash("tried to parse a bad file type"); if (filetype!=1) { /* /proc/devices won't stat intelligently */ struct stat buf; if (fstat(fileno(f), &buf)) crash("fstat failed?!?"); len = buf.st_size; } else len=1023; x = malloc(len+1); if (!x) crash("Out of memory"); len = fread(x, 1, len, f); /* it shouldn't return a short count... */ if (len<0) crash("fread failed?!?"); x[len]=0; init_parse(); PCB.input_code = filetype+'0'; parse(); PCB.column--; /* correct for the filetype token */ while (!PCB.exit_flag) { PCB.input_code = x[i++]; parse(); } if (PCB.exit_flag == AG_SYNTAX_ERROR_CODE) { warn("syntax error: %s, line %d, column %d in file %s", PCB.error_message, PCB.line, PCB.column, filename); crash("Sorry, can't continue."); } else if (PCB.exit_flag != AG_SUCCESS_CODE) { crash("parser stack overflow!"); } } #define STRINGSIZE 8192 static char string_space[STRINGSIZE]; static int stringptr=0; static const char *string_start(int c) { if (stringptr>=STRINGSIZE) crash("out of string space"); return string_space[stringptr]=c, string_space+stringptr++; } static void string_push(int c) { if (stringptr>=STRINGSIZE) crash("out of string space"); string_space[stringptr++] = c; } static void string_finish(void) { string_push(0); } #line 790 "makedev.c" #line 840 "/usr/local/src/makedev/makedev.syn" static const char *cur_group=NULL, *cur_class=NULL; static int cur_type; static int cur_maj=0, cur_min=0, cur_bot=0, cur_top=0, ishex=0; static void dhsproc(const char *g, const char *p, int t, int m) { cur_group = g; cur_type = t; cur_maj = get_major(p, (t=='c'), m); cur_min = 0; cur_bot = cur_top = ishex = 0; if (p) addalias(p,g); } static void newdev(const char *n) { if (cur_maj<0) return; init(n, cur_group, cur_class, cur_maj, cur_min, cur_type); } static void devrange(const char *n, const char *n1) { char temp[32]; if (cur_maj<0) return; sprintf(temp, "%s%%d%s", n, n1 ? n1 : ""); initlots(temp, cur_bot, cur_top, cur_group, cur_class, cur_maj, cur_min, cur_type); } static void doinitlink(const char *src, const char *tg) { if (cur_maj>=0) initlink(src, cur_group, tg); } #line 820 "makedev.c" #ifndef CONVERT_CASE #define CONVERT_CASE(c) (c) #endif #ifndef TAB_SPACING #define TAB_SPACING 8 #endif #define ag_rp_1(n, s) (set_major(s,YES,n)) #define ag_rp_2(n, s) (set_major(s,NO,n)) #define ag_rp_3(n, maj, t) (updatefromcache(n,maj,t)) #define ag_rp_4() ('b') #define ag_rp_5() ('c') #define ag_rp_8(n, i) (add2batch(addbatch(n), i)) #define ag_rp_9(b, i) (add2batch(b,i)) #define ag_rp_10(n) (n) #define ag_rp_11(n) (ignore_procname(n)) #define ag_rp_12(t, g, p) (dhsproc(g,p,t,-1)) #define ag_rp_13(t, g, p, m) (dhsproc(g,p,t,m)) #define ag_rp_14(t, g, m) (dhsproc(g,NULL,t,m)) #define ag_rp_15(classname) (classname) #define ag_rp_16(c, min) ((cur_class=c, cur_min=min)) #define ag_rp_17(a, b) (cur_bot=a, cur_top=b, ishex=0) #define ag_rp_18(a, b) (cur_bot=a, cur_top=b, ishex=1) #define ag_rp_19(n) (newdev(n)) #define ag_rp_20(n, n1) (devrange(n,n1)) #define ag_rp_21(n) (devrange(n,NULL)) #define ag_rp_22(n, a, b, p, m) (initdisk(n, a, b, p, cur_maj, m)) #define ag_rp_23(n, tg) (doinitlink(n, tg)) #define ag_rp_24(n) (n) #define ag_rp_25(n) (n) #define ag_rp_26(n) (n) #define ag_rp_27(n, o, g, m) (addclass(n,o,g,m)) #define ag_rp_28(n) (make(n, M_OMIT)) #define ag_rp_29(n) (make(n, M_OMIT)) #define ag_rp_30(n) (n) #define ag_rp_31(s) (string_finish(), s) #define ag_rp_32(s) (s) #define ag_rp_33(c) (string_start(c)) #define ag_rp_34(s, c) (string_push(c), s) #define ag_rp_35(s) (string_finish(), s) #define ag_rp_36(c) (string_start(c)) #define ag_rp_37(s, c) (string_push(c), s) #define ag_rp_38(c) (c) #define ag_rp_39() ('\\') #define ag_rp_40() ('"') #define ag_rp_41(d) (d-'0') #define ag_rp_42(n, d) (n*10 + d-'0') #define ag_rp_43(d) (d) #define ag_rp_44(n, d) (16*n+d) #define ag_rp_45(d) (d) #define ag_rp_46(n, d) (16*n+d) #define ag_rp_47(d) (d-'0') #define ag_rp_48(d) (10 + (d&7)) #define ag_rp_49(d) (d-'0') #define ag_rp_50(n, d) (n*8+d-'0') #define ag_rp_51(x, t) (x+t) #define ag_rp_52(x, t) (x-t) #define ag_rp_53(t, f) (t*f) #define ag_rp_54(f) (-f) #define ag_rp_55(x) (x) #define READ_COUNTS #define WRITE_COUNTS static parse_vs_type ag_null_value; #define V(i,t) (*(t *) (&(PCB).vs[(PCB).ssx + i])) #define VS(i) (PCB).vs[(PCB).ssx + i] #ifndef GET_CONTEXT #define GET_CONTEXT CONTEXT = (PCB).input_context #endif typedef enum { ag_action_1, ag_action_2, ag_action_3, ag_action_4, ag_action_5, ag_action_6, ag_action_7, ag_action_8, ag_action_9, ag_action_10, ag_action_11, ag_action_12 } ag_parser_action; static int ag_ap; static const unsigned char ag_rpx[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 3, 4, 5, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 0, 0, 0, 0, 0, 25, 26, 0, 0, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 0, 41, 42, 43, 44, 45, 46, 47, 48, 0, 49, 50, 0, 51, 0, 0, 52, 53 }; static unsigned char ag_key_itt[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static unsigned short ag_key_pt[] = { 1,121, 1,122, 1,125, 1,126, 1,138, 1,139,0 }; static unsigned char ag_key_ch[] = { 0, 47,255, 42,255, 42, 47,255, 88,120,255, 97,108,255,104,108,255, 45, 47, 48, 66, 67, 98, 99,105,111,255, 42, 47,255, 47, 99,111,255, 42, 47, 255, 97,108,255, 47, 98, 99,105,255, 42, 47,255, 47,255, 42, 47,255, 47, 66, 67,255, 47, 99,111,255, 97,108,255, 47, 98, 99,105,255, 47,255, 47, 66, 67,255, 42, 47,255, 97,108,255,104,108,255, 47, 66, 67, 98, 99,105, 111,255, 97,108,255,104,108,255, 47, 66, 67, 98, 99,105,111,255, 99,111, 255, 97,108,255, 98, 99,105,255, 66, 67,255, 42, 47,255, 45, 47,255, 88, 120,255, 47, 48,255, 42, 47,255, 47, 98, 99,255, 98, 99,255, 42, 47,255, 97,108,255,104,108,255, 47, 98, 99,105,111,255, 45,255, 88,120,255, 48, 255 }; static unsigned char ag_key_act[] = { 0,3,4,3,4,0,0,4,0,0,4,7,7,4,7,7,4,3,2,2,3,3,2,2,7,7,4,0,0,4,2,7,7,4,0, 0,4,7,7,4,2,2,7,7,4,0,0,4,2,4,0,0,4,2,3,3,4,3,7,7,4,7,7,4,3,2,7,7,4,3, 4,3,3,3,4,0,0,4,7,7,4,7,7,4,2,3,3,2,2,7,7,4,7,7,4,7,7,4,3,3,3,2,2,7,7, 4,7,7,4,7,7,4,2,7,7,4,3,3,4,0,0,4,3,2,4,0,0,4,3,2,4,0,0,4,2,7,7,4,7,7, 4,0,0,4,7,7,4,7,7,4,2,2,2,7,7,4,3,4,0,0,4,2,4 }; static unsigned char ag_key_parm[] = { 0, 80, 0, 84, 0, 80, 86, 0,145,144, 0, 6, 0, 0, 2, 8, 0,137, 0, 0,118,117, 0, 0, 4, 10, 0, 80, 86, 0, 0, 8, 10, 0, 80, 86, 0, 6, 0, 0, 0, 0, 2, 4, 0, 80, 86, 0, 0, 0, 80, 86, 0, 0, 118,117, 0, 86, 8, 10, 0, 6, 0, 0, 86, 0, 2, 4, 0, 86, 0, 86, 118,117, 0, 80, 86, 0, 6, 0, 0, 2, 8, 0, 0,118,117, 0, 0, 4, 10, 0, 6, 0, 0, 2, 8, 0, 86,118,117, 0, 0, 4, 10, 0, 8, 10, 0, 6, 0, 0, 0, 2, 4, 0,118,117, 0, 80, 86, 0,137, 0, 0,145, 144, 0, 80, 0, 0, 80, 86, 0, 0, 0, 2, 0, 0, 2, 0, 80, 86, 0, 6, 0, 0, 2, 8, 0, 0, 0, 0, 4, 10, 0,137, 0,145,144, 0, 0, 0 }; static unsigned short ag_key_jmp[] = { 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 38, 42, 0, 46, 49, 0, 4, 5, 8, 6, 20, 11, 14, 53, 59, 0, 0, 0, 0, 27, 63, 68, 0, 0, 0, 0, 72, 76, 0, 34, 37, 80, 84, 0, 0, 0, 0, 45, 0, 0, 0, 0, 50, 90,104, 0,122,124,129, 0,135,139, 0,133, 61,143,147, 0,153, 0,155, 157,171, 0, 0, 0, 0,221,225, 0,229,232, 0, 75,189,203, 78, 81,236, 242, 0,280,284, 0,288,291, 0,246,248,262, 92, 95,295,301, 0,305,310, 0,314,318, 0,109,322,326, 0,332,346, 0, 0, 0, 0,364,119, 0, 0, 0, 0,366,125, 0, 0, 0, 0,131,368,373, 0,377,382, 0, 0, 0, 0, 386,390, 0,394,397, 0,141,144,147,401,407, 0,411, 0, 0, 0, 0,158, 0 }; static unsigned short ag_key_index[] = { 1, 3, 17, 0, 3, 3, 30, 40, 48, 53, 57, 64, 69, 71, 0, 0, 84, 98, 106,112, 0,116, 0, 1, 1, 0, 0,106, 48, 48, 48, 48, 1, 1, 0, 0, 0, 69,112, 0,122, 48, 0, 0, 48, 48, 69, 69,116, 48, 69, 69, 0,128, 0, 0, 0, 69, 0, 69, 0, 0,134,138, 0, 0, 0,128, 0, 0, 69, 48, 69, 0,150, 64, 0,156, 0, 69, 0,116, 0,116, 69, 0, 0, 0, 1, 0, 0, 69, 69, 0, 1, 0,128,161, 0, 0, 0, 0, 0, 69, 69, 0, 57, 0, 0, 0, 69, 0, 64, 69, 1, 0, 1, 1, 0, 0, 0, 0, 0,161, 64, 48, 69, 69, 48, 0,128, 0, 48, 0, 0,161,161, 69, 69, 69, 69, 0, 0, 0, 0, 0,128,161,161,128,161, 1, 0, 69, 69, 0, 1, 0, 69, 0 }; static unsigned char ag_key_ends[] = { 42,0, 47,0, 62,0, 108,111,99,107,32,100,101,118,105,99,101,115,58,0, 104,97,114,97,99,116,101,114,32,100,101,118,105,99,101,115,58,0, 116,99,104,0, 111,99,107,0, 97,114,0, 97,115,115,0, 103,110,111,114,101,0, 109,105,116,0, 108,97,115,115,0, 109,105,116,0, 116,99,104,0, 111,99,107,0, 104,97,114,0, 103,110,111,114,101,0, 108,111,99,107,32,100,101,118,105,99,101,115,58,0, 104,97,114,97,99,116,101,114,32,100,101,118,105,99,101,115,58,0, 47,0, 108,97,115,115,0, 109,105,116,0, 47,0, 116,99,104,0, 111,99,107,0, 104,97,114,0, 103,110,111,114,101,0, 47,0, 47,0, 108,111,99,107,32,100,101,118,105,99,101,115,58,0, 104,97,114,97,99,116,101,114,32,100,101,118,105,99,101,115,58,0, 108,111,99,107,32,100,101,118,105,99,101,115,58,0, 104,97,114,97,99,116,101,114,32,100,101,118,105,99,101,115,58,0, 116,99,104,0, 111,99,107,0, 97,114,0, 97,115,115,0, 103,110,111,114,101,0, 109,105,116,0, 47,0, 108,111,99,107,32,100,101,118,105,99,101,115,58,0, 104,97,114,97,99,116,101,114,32,100,101,118,105,99,101,115,58,0, 116,99,104,0, 111,99,107,0, 97,114,0, 97,115,115,0, 103,110,111,114,101,0, 109,105,116,0, 108,97,115,115,0, 109,105,116,0, 116,99,104,0, 111,99,107,0, 104,97,114,0, 103,110,111,114,101,0, 108,111,99,107,32,100,101,118,105,99,101,115,58,0, 104,97,114,97,99,116,101,114,32,100,101,118,105,99,101,115,58,0, 62,0, 42,0, 108,111,99,107,0, 104,97,114,0, 108,111,99,107,0, 104,97,114,0, 116,99,104,0, 111,99,107,0, 97,114,0, 97,115,115,0, 103,110,111,114,101,0, 109,105,116,0, 62,0, }; #define AG_TCV(x) (((int)(x) >= -1 && (int)(x) <= 255) ? ag_tcv[(x) + 1] : 0) static const unsigned char ag_tcv[] = { 18, 18,152,152,152,152,152,152,152,152,150, 93,152,152,150,152,152,152, 152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,151,153, 95, 87,153,153,153,153,130,128,149,148,127,133,153,135,154,113,114,115,116, 154,154,154,155,155,131,153,153,129,153,153,153,156,156,156,156,156,156, 157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157, 157,157,134, 99,132,153,157,153,156,119,120,156,156,156,157,157,157,157, 157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,124,153, 123,153,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152, 152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152, 152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152, 152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152, 152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152, 152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152, 152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152, 152,152,152,152,152 }; #ifndef SYNTAX_ERROR #define SYNTAX_ERROR fprintf(stderr,"%s, line %d, column %d\n", \ (PCB).error_message, (PCB).line, (PCB).column) #endif #ifndef FIRST_LINE #define FIRST_LINE 1 #endif #ifndef FIRST_COLUMN #define FIRST_COLUMN 1 #endif #ifndef PARSER_STACK_OVERFLOW #define PARSER_STACK_OVERFLOW {fprintf(stderr, \ "\nParser stack overflow, line %d, column %d\n",\ (PCB).line, (PCB).column);} #endif #ifndef REDUCTION_TOKEN_ERROR #define REDUCTION_TOKEN_ERROR {fprintf(stderr, \ "\nReduction token error, line %d, column %d\n", \ (PCB).line, (PCB).column);} #endif typedef enum {ag_accept_key, ag_set_key, ag_jmp_key, ag_end_key, ag_no_match_key, ag_cf_accept_key, ag_cf_set_key, ag_cf_end_key} key_words; static void ag_track(void) { int ag_k = 0; while (ag_k < (PCB).rx) { int ag_ch = (PCB).lab[ag_k++]; switch (ag_ch) { case '\n': (PCB).column = 1, (PCB).line++; case '\r': case '\f': break; case '\t': (PCB).column += (TAB_SPACING) - ((PCB).column - 1) % (TAB_SPACING); break; default: (PCB).column++; } } ag_k = 0; while ((PCB).rx < (PCB).fx) (PCB).lab[ag_k++] = (PCB).lab[(PCB).rx++]; (PCB).fx = ag_k; (PCB).rx = 0; } static void ag_prot(void) { int ag_k = 38 - ++(PCB).btsx; if (ag_k <= (PCB).ssx) { (PCB).exit_flag = AG_STACK_ERROR_CODE; PARSER_STACK_OVERFLOW; return; } (PCB).bts[(PCB).btsx] = (PCB).sn; (PCB).bts[ag_k] = (PCB).ssx; (PCB).vs[ag_k] = (PCB).vs[(PCB).ssx]; (PCB).ss[ag_k] = (PCB).ss[(PCB).ssx]; } static void ag_undo(void) { if ((PCB).drt == -1) return; while ((PCB).btsx) { int ag_k = 38 - (PCB).btsx; (PCB).sn = (PCB).bts[(PCB).btsx--]; (PCB).ssx = (PCB).bts[ag_k]; (PCB).vs[(PCB).ssx] = (PCB).vs[ag_k]; (PCB).ss[(PCB).ssx] = (PCB).ss[ag_k]; } (PCB).token_number = (parse_token_type) (PCB).drt; (PCB).ssx = (PCB).dssx; (PCB).sn = (PCB).dsn; (PCB).drt = -1; } static const unsigned char ag_tstt[] = { 151,150,80,0,2,111,112, 157,156,155,154,153,152,151,150,149,148,135,134,133,132,131,130,129,128,127, 124,123,120,119,116,115,114,113,99,95,93,87,0,82,83, 151,150,80,0,2, 116,115,114,113,0,5,6,8,10,12, 157,156,155,154,153,152,151,150,149,148,135,134,133,132,131,130,129,128,127, 124,123,120,119,116,115,114,113,99,95,93,87,0, 84,0, 151,150,80,0,2,111,112, 151,150,80,0,2,111,112, 151,150,80,0,2,111,112, 151,150,80,0,2,111,112, 139,138,93,87,86,0,3,13,14,15,85,88,92,140, 126,125,122,121,120,119,93,87,86,0,3,11,14,15,85,88,92,140, 157,156,133,120,119,95,93,87,86,0,3,9,14,15,85,88,92,140, 118,117,93,87,86,0,3,7,14,15,85,88,92,140, 157,156,155,154,153,152,151,150,149,148,135,134,133,132,131,130,129,128,127, 124,123,120,119,116,115,114,113,99,95,87,18,0,90,91, 93,0, 151,150,80,0,2,111,112, 157,156,155,154,139,138,133,127,126,125,123,122,121,120,119,118,117,116,115, 114,113,95,93,87,86,18,0,3,88,92,140, 139,138,0,69,70,71,72,73,75, 126,125,122,121,120,119,0,29,30,31,32,33,34,35,36,42,45, 157,156,133,120,119,95,0,1,4,26,27,28,141,142, 118,117,0,16,17,19,22, 157,156,155,154,153,152,151,150,149,148,135,134,133,132,131,130,129,128,127, 124,123,120,119,116,115,114,113,99,95,87,18,0, 151,150,80,0,2,111,112, 151,150,80,0,2,111,112, 157,156,133,124,120,119,95,0,1,4,26,37,141,142, 157,156,133,120,119,95,0,1,4,26,141,142, 139,138,18,0,69,71,72,73,75, 151,150,80,0,2,111,112, 151,150,80,0,2,111,112, 151,150,80,0,2,111,112, 151,150,80,0,2,111,112, 151,150,80,0,2,111,112, 151,150,80,0,2,111,112, 130,0,50, 157,156,133,120,119,95,0,1,4,26,46,141,142, 124,0,37, 157,156,133,124,120,119,95,93,87,86,0,3,14,15,37,85,88,92,140, 126,125,122,121,120,119,18,0,29,30,31,32,33,34,36,42,45, 157,156,155,154,153,151,149,148,135,134,133,132,131,130,129,128,127,124,123, 120,119,116,115,114,113,99,87,0,96,97, 151,150,80,0,2,111,112, 157,156,155,154,151,150,133,120,119,116,115,114,113,80,0,2,111,112, 155,154,116,115,114,113,0,25,100, 157,156,133,120,119,95,18,0,1,4,26,27,141,142, 151,150,80,0,2,111,112, 151,150,80,0,2,111,112, 87,86,0,3,14,85,88,92,140, 87,86,0,3,14,85,88,92,140, 118,117,18,0,16,19,22, 151,150,80,0,2,111,112, 157,156,133,120,119,95,93,87,86,0,3,14,15,85,88,92,140, 87,86,0,3,14,85,88,92,140, 131,0,57, 151,150,80,0,2,111,112, 157,156,133,120,119,95,0,1,4,26,51,141,142, 124,0,37, 127,123,0,41,48,49, 157,156,133,120,119,95,93,87,86,0,3,14,15,85,88,92,140, 157,156,133,120,119,95,0,1,4,26,38,65,141,142, 157,156,133,123,120,119,95,93,87,86,0,3,14,15,85,88,92,140, 99,95,0, 157,156,155,154,153,151,149,148,135,134,133,132,131,130,129,128,127,124,123, 120,119,116,115,114,113,99,95,87,0,97, 151,150,80,0,2,111,112, 155,154,122,121,120,119,116,115,114,113,0,29,30,31,32,33,100, 155,154,116,115,114,113,0,23,24,25,100, 155,154,116,115,114,113,0,20,21,25,100, 157,156,133,120,119,95,0,1,4,26,76,77,141,142, 151,150,80,0,2,111,112, 157,156,133,120,119,95,0,1,4,26,141,142, 129,127,0,48,52, 157,156,133,120,119,95,93,87,86,0,3,14,15,85,88,92,140, 151,150,80,0,2,111,112, 157,156,133,123,120,119,95,93,87,86,0,3,14,15,85,88,92,140, 157,156,133,120,119,95,0,1,4,26,47,141,142, 151,150,80,0,2,111,112, 126,125,122,121,120,119,93,87,86,18,0,3,14,15,85,88,92,140, 157,156,133,120,119,95,0,1,4,26,43,44,141,142, 137,134,130,0,50,55,56,59,60,68, 157,156,133,120,119,95,0,1,4,26,38,39,40,65,141,142, 87,86,0,3,14,85,88,92,140, 157,156,155,154,133,120,119,116,115,114,113,95,0,1,4,26,100,141,142, 155,154,116,115,114,113,0,23,25,100, 157,156,155,154,133,120,119,116,115,114,113,95,0,1,4,26,100,141,142, 155,154,116,115,114,113,0,20,25,100, 157,156,133,127,123,120,119,95,93,87,86,0,3,14,15,85,88,92,140, 157,156,133,123,120,119,95,0,1,4,26,41,76,141,142, 157,156,133,120,119,95,0,1,4,26,141,142, 155,154,116,115,114,113,0,25,100, 151,150,80,0,2,111,112, 157,156,133,120,119,95,0,1,4,26,53,141,142, 157,156,133,120,119,95,0,1,4,26,47,141,142, 157,156,133,127,123,120,119,95,93,87,86,0,3,14,15,85,88,92,140, 157,156,133,127,123,120,119,95,93,87,86,0,3,14,15,85,88,92,140, 157,156,133,123,120,119,95,0,1,4,26,41,43,141,142, 151,150,80,0,2,111,112, 157,156,133,120,119,95,0,1,4,26,141,142, 151,150,80,0,2,111,112, 157,156,155,154,145,144,133,120,119,116,115,114,113,0,25,63,66,100,101,102, 103, 157,156,133,130,120,119,95,0,1,4,26,50,55,56,65,141,142, 157,156,133,120,119,95,0,1,4,26,141,142, 131,0,57, 157,156,133,120,119,95,0,1,4,26,38,65,141,142, 123,0,41, 87,86,0,3,14,85,88,92,140, 87,86,0,3,14,85,88,92,140, 127,0,48,49, 139,138,93,87,86,18,0,3,14,15,85,88,92,140, 154,116,115,114,113,0,74,78,106, 155,154,128,116,115,114,113,0,54,100, 128,127,0,48,54, 157,156,133,127,123,120,119,95,93,87,86,0,3,14,15,85,88,92,140, 127,0,48,49, 126,125,122,121,120,119,93,87,86,18,0,3,14,15,85,88,92,140, 87,86,0,3,14,85,88,92,140, 151,150,80,0,2,111,112, 133,0,61, 151,150,80,0,2,111,112, 151,150,80,0,2,111,112, 156,155,154,120,119,116,115,114,113,0,100,104,105, 156,155,154,133,120,119,116,115,114,113,0,61,100,104,105, 155,154,133,116,115,114,113,0,61,100, 130,0,50,55,56, 128,0,54, 155,154,145,144,133,130,116,115,114,113,0,25,50,58,61,63,100,101,102,103, 107,109, 126,125,122,121,120,119,93,87,86,18,0,3,14,15,85,88,92,140, 151,150,80,0,2,111,112, 154,116,115,114,113,0,106, 87,86,0,3,14,85,88,92,140, 151,150,80,0,2,111,112, 155,154,116,115,114,113,0,25,100, 151,150,80,0,2,111,112, 157,156,133,120,119,0,66, 151,150,80,0,2,111,112, 156,155,154,120,119,116,115,114,113,0,64,100,104,105, 155,154,116,115,114,113,0,25,100, 155,154,145,144,133,130,116,115,114,113,0,25,50,58,61,63,100,101,102,103, 107,109, 155,154,145,144,133,130,116,115,114,113,0,25,50,61,63,100,101,102,103,109, 156,155,154,120,119,116,115,114,113,0,100,104,105, 155,154,116,115,114,113,0,100, 149,0,110, 148,133,87,86,0,3,14,61,85,88,92,108,140, 155,154,128,116,115,114,113,0,54,100, 132,0,62, 156,155,154,132,120,119,116,115,114,113,0,62,100,104,105, 155,154,132,116,115,114,113,0,62,100, 148,133,128,0,54,61,108, 151,150,80,0,2,111,112, 155,154,145,144,133,130,116,115,114,113,0,25,50,61,63,100,101,102,103,109, 155,154,145,144,133,130,116,115,114,113,0,25,50,61,63,100,101,102,103,107, 109, 151,150,80,0,2,111,112, 155,154,145,144,133,130,116,115,114,113,0,25,50,61,63,100,101,102,103,107, 109, 151,150,80,0,2,111,112, 155,154,116,115,114,113,0,25,100, 149,0,110, 149,0,110, 155,154,135,116,115,114,113,0,67,100, 151,150,80,0,2,111,112, 155,154,116,115,114,113,0,25,100, 155,154,116,115,114,113,87,86,0,3,14,85,88,92,100,140, 0 }; static unsigned char ag_astt[1821] = { 1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,8,1,1,9,9,1,5,3,1,1,1,1,7,0,1,1,1,1,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,5,3,7,1,1,1,5,1,1,3,1,1,1,5,1,1,3,1,1,1,5,1,1,3, 1,1,1,5,1,1,3,8,8,8,1,1,7,1,3,1,1,1,1,1,1,8,8,8,8,8,8,8,1,1,7,1,3,1,1,1,1, 1,1,8,8,8,8,8,8,8,1,1,7,1,3,1,1,1,1,1,1,8,8,8,1,1,7,1,3,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,3,3,7,1,1,1,5, 1,1,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,8,1,1,5,7,3,1,1,1,1,1,7, 1,1,1,1,1,1,1,1,1,1,1,1,7,1,2,2,2,2,1,1,1,1,1,2,2,2,2,2,1,7,2,2,1,1,1,1,1, 1,1,7,1,1,1,1,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,5,1,1,1,5,1,1,3,1,1,1,5,1,1,3,2,2,2,1,2,2,1,7,2,2,1,1,1,1,2,2,2,2,2,1,7, 2,2,1,1,1,1,1,3,7,3,3,3,1,1,1,1,1,5,1,1,3,1,1,1,5,1,1,3,1,1,1,5,1,1,3,1,1, 1,5,1,1,3,1,1,1,5,1,1,3,1,1,1,5,1,1,3,1,7,1,2,2,2,2,2,1,7,2,2,1,1,1,1,1,7, 1,8,8,8,1,8,8,8,8,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,7,1,2,2,2,2,3,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,7,1,2,1,1,1,5,1,1,3, 10,10,10,10,1,1,10,10,10,10,10,10,10,1,5,1,1,3,1,1,1,1,1,1,7,1,2,2,2,2,2,2, 1,3,7,2,2,1,3,1,1,1,1,1,5,1,1,3,1,1,1,5,1,1,3,1,1,8,1,1,1,1,1,1,1,1,8,1,1, 1,1,1,1,1,1,3,7,3,1,1,1,1,1,5,1,1,3,8,8,8,8,8,8,8,1,1,7,1,1,1,1,1,1,1,1,1, 8,1,2,1,1,1,1,1,7,1,1,1,1,5,1,1,3,2,2,2,2,2,1,7,2,2,2,1,1,1,1,7,1,1,1,8,1, 1,1,8,8,8,8,8,8,8,1,1,7,1,1,1,1,1,1,1,2,2,2,2,2,1,7,2,2,2,3,1,1,1,8,8,8,8, 8,8,8,8,1,1,7,1,1,1,1,1,1,1,2,2,7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,1,2,2,7,2,1,1,1,5,1,1,3,1,1,1,1,1,1,1,1,1,1,7,1,2,2,2,2,2,1,1,1, 1,1,1,7,1,1,1,2,1,1,1,1,1,1,7,1,1,1,2,2,2,2,2,2,1,7,2,2,1,1,1,1,1,1,1,1,5, 1,1,3,2,2,2,2,2,1,7,2,2,1,1,1,1,1,7,1,1,8,8,8,8,8,8,8,1,1,7,1,1,1,1,1,1,1, 1,1,1,5,1,1,3,5,5,5,5,5,5,5,8,1,1,7,1,3,3,1,1,1,1,2,2,2,2,2,1,7,2,2,2,1,1, 1,1,1,1,5,1,1,3,5,5,5,5,5,5,8,1,1,5,7,1,3,3,1,1,1,1,2,2,2,2,2,1,7,2,2,1,1, 1,1,1,1,1,1,7,1,1,2,1,1,1,2,2,2,2,2,1,8,2,2,2,1,1,1,1,1,1,1,1,8,1,2,1,1,1, 1,2,2,1,1,2,2,2,1,1,1,1,1,7,2,2,1,2,1,1,1,1,1,1,1,1,5,3,1,2,2,2,1,1,2,2,2, 1,1,1,1,1,7,2,2,1,2,1,1,1,1,1,1,1,1,5,3,1,2,8,8,8,8,8,8,8,8,8,1,1,7,1,1,1, 1,1,1,1,2,2,2,1,2,2,1,7,2,2,1,1,3,1,1,2,2,2,2,2,1,7,2,2,1,1,1,1,1,1,1,1,1, 7,1,2,1,1,1,5,1,1,3,2,2,2,2,2,1,7,2,2,2,1,1,1,2,2,2,2,2,1,7,2,2,2,1,1,1,5, 5,5,5,5,5,5,5,8,1,1,7,1,2,2,1,1,1,1,8,8,8,8,8,8,8,8,8,1,1,7,1,1,1,1,1,1,1, 2,2,2,1,2,2,1,7,2,2,1,1,3,1,1,1,1,1,5,1,1,3,2,2,2,2,2,1,7,2,2,1,1,1,1,1,1, 5,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,2,1,1,1,2,2,2,1,2,2,1,7,2,2,2,1, 1,2,1,1,1,2,2,2,2,2,1,7,2,2,1,1,1,1,7,1,2,2,2,2,2,1,5,2,2,2,3,1,1,1,1,7,1, 1,1,8,1,2,1,1,1,1,1,1,8,1,2,1,1,1,1,1,5,1,2,5,5,8,1,1,5,7,1,3,3,1,1,1,1,1, 1,1,1,1,7,1,1,2,1,1,1,1,1,1,1,7,2,2,1,1,7,1,2,5,5,5,5,5,5,5,5,8,1,1,7,1,2, 2,1,1,1,1,1,5,1,2,5,5,5,5,5,5,8,1,1,5,7,1,3,3,1,1,1,1,1,1,8,1,2,1,1,1,1,1, 1,1,5,1,1,3,1,7,1,1,1,1,5,1,1,3,1,1,1,5,1,1,3,1,1,1,1,1,1,1,1,1,7,2,2,2,1, 1,1,1,1,1,1,1,1,1,7,1,2,2,2,1,1,1,1,1,1,1,7,1,2,1,7,1,1,2,1,7,2,1,1,1,1,1, 1,1,1,1,1,7,1,1,1,1,1,2,1,1,1,1,1,5,5,5,5,5,5,8,1,1,5,7,1,3,3,1,1,1,1,1,1, 1,5,1,1,3,1,1,1,1,1,4,2,1,1,8,1,2,1,1,1,1,1,1,1,5,1,1,3,1,1,1,1,1,1,7,1,2, 1,1,1,5,1,1,3,1,1,1,1,1,7,1,1,1,1,5,1,1,3,1,1,1,1,1,1,1,1,1,7,1,2,2,2,1,1, 1,1,1,1,7,1,2,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,7,1,1,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,5,2,2,2,1,1,1,1,1,1,5,2,1,5,1,1, 1,1,1,8,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,7,2,2,1,7,1,1,1,1,1,1,1,1,1,1,1,7,2, 2,2,2,1,1,1,1,1,1,1,7,2,2,1,1,1,7,2,1,1,1,1,1,5,1,1,3,1,1,1,1,1,1,1,1,1,1, 7,1,1,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,2,1,1,1,1,1,1,1,1,5,1,1, 3,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,2,1,1,1,1,1,1,1,1,5,1,1,3,1,1,1,1,1,1,7,1, 2,1,4,1,1,4,1,1,1,1,1,1,1,1,7,1,2,1,1,1,5,1,1,3,1,1,1,1,1,1,7,1,2,1,1,1,1, 1,1,1,1,8,1,2,1,1,1,2,1,11 }; static unsigned char ag_pstt[] = { 2,2,1,3,2,2,3, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,4,5, 122,122,1,124,122, 6,7,8,9,3,0,13,12,11,10, 74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74, 74,74,74,74,74,74,76, 77,5, 2,2,1,123,2,2,128, 2,2,1,123,2,2,127, 2,2,1,123,2,2,126, 2,2,1,123,2,2,125, 18,18,15,14,14,10,17,4,18,18,17,14,15,16, 19,19,19,19,19,19,15,14,14,11,17,3,19,19,17,14,15,16, 20,20,20,20,20,20,15,14,14,12,17,2,20,20,17,14,15,16, 21,21,15,14,14,13,17,1,21,21,17,14,15,16, 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, 22,22,22,22,22,22,85,22,88, 89,15, 2,2,1,123,2,2,152, 80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,15,14,14, 80,17,79,14,15,16, 23,24,18,27,27,27,27,26,25, 32,33,28,29,30,31,19,34,22,23,24,25,38,38,37,36,35, 92,92,92,92,92,39,20,90,91,42,43,43,41,40, 44,45,21,48,48,47,46, 84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84, 84,84,84,84,84,84,86, 2,2,1,123,2,2,151, 2,2,1,123,2,2,150, 92,92,92,49,92,92,39,25,90,91,51,50,41,40, 92,92,92,92,92,39,26,90,91,52,41,40, 23,24,62,27,61,61,61,26,25, 2,2,1,123,2,2,134, 2,2,1,123,2,2,133, 2,2,1,123,2,2,132, 2,2,1,123,2,2,131, 2,2,1,123,2,2,138, 2,2,1,123,2,2,137, 53,34,54, 92,92,92,92,92,39,35,90,91,55,56,41,40, 49,36,57, 58,58,58,49,58,58,58,15,14,14,37,17,58,58,59,17,14,15,16, 32,33,28,29,30,31,28,38,34,22,23,24,25,27,37,36,35, 97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97, 60,97,39,61,95, 2,2,1,123,2,2,154, 93,93,93,93,2,2,93,93,93,93,93,93,93,1,123,2,2,153, 62,62,62,62,62,62,42,63,100, 92,92,92,92,92,39,20,43,90,91,42,19,41,40, 2,2,1,123,2,2,130, 2,2,1,123,2,2,129, 14,14,15,17,64,17,14,15,16, 14,14,15,17,65,17,14,15,16, 44,45,9,48,8,47,46, 2,2,1,123,2,2,136, 66,66,66,66,66,66,15,14,14,50,17,66,66,17,14,15,16, 14,14,15,17,66,17,14,15,16, 67,52,68, 2,2,1,123,2,2,142, 92,92,92,92,92,39,54,90,91,58,69,41,40, 49,55,70, 71,74,73,75,72,73, 76,76,76,76,76,76,15,14,14,57,17,76,76,17,14,15,16, 92,92,92,92,92,39,58,90,91,57,34,77,41,40, 78,78,78,78,78,78,78,15,14,14,59,17,78,78,17,14,15,16, 98,99,60, 97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97, 60,94,97,61,96, 2,2,1,123,2,2,155, 62,62,28,29,30,31,62,62,62,62,63,79,22,23,24,25,101, 62,62,62,62,62,62,64,81,81,80,100, 62,62,62,62,62,62,65,83,83,82,100, 92,92,92,92,92,39,66,90,91,84,85,85,41,40, 2,2,1,123,2,2,143, 92,92,92,92,92,39,68,90,91,86,41,40, 88,71,69,87,89, 90,90,90,90,90,90,15,14,14,70,17,90,90,17,14,15,16, 2,2,1,123,2,2,139, 5,5,5,5,5,5,5,15,14,14,72,17,41,41,17,14,15,16, 92,92,92,92,92,39,73,90,91,43,91,41,40, 2,2,1,123,2,2,135, 5,5,5,5,5,5,15,14,14,5,75,17,38,38,17,14,15,16, 92,92,92,92,92,39,76,90,91,92,93,93,41,40, 94,96,53,77,99,100,52,98,97,95, 92,92,92,92,92,39,102,90,91,57,101,101,102,77,41,40, 14,14,15,17,21,17,14,15,16, 92,92,62,62,92,92,92,62,62,62,62,39,80,90,91,103,101,41,40, 62,62,62,62,62,62,15,14,80,100, 92,92,62,62,92,92,92,62,62,62,62,39,82,90,91,104,101,41,40, 62,62,62,62,62,62,12,11,82,100, 105,105,105,105,105,105,105,105,15,14,14,84,17,105,105,17,14,15,16, 92,92,92,74,92,92,39,85,90,91,84,106,68,41,40, 92,92,92,92,92,39,86,90,91,107,41,40, 62,62,62,62,62,62,87,108,100, 2,2,1,123,2,2,141, 92,92,92,92,92,39,89,90,91,59,109,41,40, 92,92,92,92,92,39,90,90,91,43,110,41,40, 5,5,5,5,5,5,5,5,15,14,14,91,17,42,42,17,14,15,16, 111,111,111,111,111,111,111,111,15,14,14,92,17,111,111,17,14,15,16, 92,92,92,74,92,92,39,93,90,91,92,112,36,41,40, 2,2,1,123,2,2,149, 92,92,92,92,92,39,95,90,91,113,41,40, 2,2,1,123,2,2,146, 114,114,62,62,116,117,114,114,114,62,62,62,62,97,120,119,115,100,118,118, 118, 92,92,92,53,92,92,39,98,90,91,57,99,100,54,121,41,40, 92,92,92,92,92,39,99,90,91,122,41,40, 67,100,123, 92,92,92,92,92,39,32,90,91,57,30,77,41,40, 74,102,124, 14,14,15,17,17,17,14,15,16, 14,14,15,17,16,17,14,15,16, 71,40,72,70, 5,5,15,14,14,5,106,17,69,69,17,14,15,16, 125,125,125,125,125,107,127,126,110, 62,62,128,62,62,62,62,108,47,101, 128,71,109,129,45, 5,5,5,5,5,5,5,5,15,14,14,110,17,39,39,17,14,15,16, 71,40,72,44, 5,5,5,5,5,5,15,14,14,5,112,17,37,37,17,14,15,16, 14,14,15,17,56,17,14,15,16, 2,2,1,123,2,2,148, 130,115,131, 2,2,1,123,2,2,157, 2,2,1,123,2,2,156, 132,62,62,132,132,62,62,62,62,118,108,104,109, 132,62,62,130,132,132,62,62,62,62,119,133,108,105,109, 62,62,130,62,62,62,62,120,134,101, 53,121,99,100,53, 128,122,48, 62,62,116,117,130,53,62,62,62,62,123,138,135,140,136,137,100,118,118,118, 139,139, 5,5,5,5,5,5,15,14,14,5,124,17,33,33,17,14,15,16, 2,2,1,123,2,2,159, 125,125,125,125,125,71,111, 14,14,15,17,65,17,14,15,16, 2,2,1,123,2,2,140, 62,62,62,62,62,62,129,141,100, 2,2,1,123,2,2,145, 114,114,114,114,114,131,142, 2,2,1,123,2,2,158, 132,62,62,132,132,62,62,62,62,133,143,108,106,109, 62,62,62,62,62,62,134,144,100, 62,62,116,117,130,53,62,62,62,62,135,138,135,145,136,137,100,118,118,118, 139,139, 62,62,116,117,130,53,62,62,62,62,136,138,135,136,137,100,118,118,118,119, 132,62,62,132,132,62,62,62,62,118,108,105,109, 62,62,62,62,62,62,117,101, 146,112,147, 149,130,14,14,15,17,49,148,17,14,15,150,16, 62,62,128,62,62,62,62,141,46,101, 151,142,152, 132,62,62,151,132,132,62,62,62,62,143,51,108,107,109, 62,62,151,62,62,62,62,144,50,101, 149,130,128,145,120,148,150, 2,2,1,123,2,2,161, 62,62,116,117,130,53,62,62,62,62,147,138,135,136,137,100,118,118,118,116, 62,62,116,117,130,53,62,62,62,62,148,138,135,136,137,100,118,118,118,153, 153, 2,2,1,123,2,2,160, 62,62,116,117,130,53,62,62,62,62,150,138,135,136,137,100,118,118,118,154, 154, 2,2,1,123,2,2,144, 62,62,62,62,62,62,152,155,100, 146,114,147, 146,113,147, 62,62,156,62,62,62,62,155,157,101, 2,2,1,123,2,2,147, 62,62,62,62,62,62,157,158,100, 62,62,62,62,62,62,14,14,15,17,55,17,14,15,101,16, 0 }; static const unsigned short ag_sbt[] = { 0, 7, 41, 46, 56, 88, 90, 97, 104, 111, 118, 132, 150, 168, 182, 216, 218, 225, 256, 265, 282, 296, 303, 335, 342, 349, 363, 375, 384, 391, 398, 405, 412, 419, 426, 429, 442, 445, 464, 481, 511, 518, 536, 545, 559, 566, 573, 582, 591, 598, 605, 622, 631, 634, 641, 654, 657, 663, 680, 694, 712, 715, 745, 752, 769, 780, 791, 805, 812, 824, 829, 846, 853, 871, 884, 891, 909, 923, 933, 949, 958, 977, 987,1006, 1016,1035,1050,1062,1071,1078,1091,1104,1123,1142,1157,1164,1176,1183, 1204,1221,1233,1236,1250,1253,1262,1271,1275,1289,1298,1308,1313,1332, 1336,1354,1363,1370,1373,1380,1387,1400,1415,1425,1430,1433,1455,1473, 1480,1487,1496,1503,1512,1519,1526,1533,1547,1556,1578,1598,1611,1619, 1622,1635,1645,1648,1663,1673,1680,1687,1707,1728,1735,1756,1763,1772, 1775,1778,1788,1795,1804,1820 }; static const unsigned short ag_sbe[] = { 3, 38, 44, 50, 87, 89, 93, 100, 107, 114, 123, 141, 159, 173, 213, 217, 221, 251, 258, 271, 288, 298, 334, 338, 345, 356, 369, 378, 387, 394, 401, 408, 415, 422, 427, 435, 443, 455, 471, 508, 514, 532, 542, 552, 562, 569, 575, 584, 594, 601, 614, 624, 632, 637, 647, 655, 659, 672, 686, 704, 714, 743, 748, 762, 775, 786, 797, 808, 818, 826, 838, 849, 863, 877, 887, 901, 915, 926, 939, 951, 970, 983, 999,1012, 1027,1042,1056,1068,1074,1084,1097,1115,1134,1149,1160,1170,1179,1196, 1211,1227,1234,1242,1251,1255,1264,1272,1281,1294,1305,1310,1324,1333, 1346,1356,1366,1371,1376,1383,1396,1410,1422,1426,1431,1443,1465,1476, 1485,1489,1499,1509,1515,1524,1529,1542,1553,1566,1588,1607,1617,1620, 1626,1642,1646,1658,1670,1676,1683,1697,1717,1731,1745,1759,1769,1773, 1776,1785,1791,1801,1812,1820 }; static const unsigned char ag_fl[] = { 2,2,2,2,2,0,1,1,2,3,1,2,3,1,2,3,3,3,1,2,3,4,1,1,1,1,1,2,3,1,2,0,1,6,3, 1,2,6,4,5,0,2,4,1,3,6,8,6,3,4,5,5,2,4,3,10,4,1,1,1,1,2,3,1,1,7,3,1,2,6, 3,1,1,1,2,0,1,3,1,2,1,1,1,1,2,0,1,0,2,2,1,1,1,2,3,1,2,1,2,2,1,2,1,1,2, 2,1,2,1,1,1,2,1,3,3,1,3,1,1,2,3,1,2,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 }; static const unsigned char ag_ptt[] = { 0, 5, 5, 5, 5, 15, 15, 17, 17, 7, 21, 21, 16, 24, 24, 16, 20, 23, 28, 28, 9, 27, 29, 29, 29, 29, 35, 35, 11, 39, 39, 40, 40, 34, 34, 44, 44, 34, 34, 46, 49, 49, 46, 47, 43, 36, 36, 36, 55, 56, 59, 59, 38, 38, 38, 38, 38, 65, 51, 53, 70, 70, 13, 69, 69, 71, 72, 77, 77, 72, 76, 74, 2, 82, 82, 83, 83, 2, 85, 85, 14, 88, 88, 90, 90, 91, 91, 92, 92,140, 26, 26,141,141,142, 96, 96, 97, 97, 97, 25, 25,103,103, 63, 63, 64, 64, 104,104, 78, 78, 58, 58, 58,107,107,109,109,109,109,111,111,112,112, 6, 8, 10, 12, 19, 22, 30, 31, 32, 33, 41, 37, 42, 45, 48, 54, 52, 50, 57, 62, 61, 60, 67, 66, 68, 73, 75, 3, 1, 4,100,101,102,105,106,108,110 }; static void ag_ra(void) { switch(ag_rpx[ag_ap]) { case 1: ag_rp_1(V(0,int), V(1,const char *)); break; case 2: ag_rp_2(V(0,int), V(1,const char *)); break; case 3: ag_rp_3(V(0,const char *), V(1,int), V(2,char)); break; case 4: V(0,char) = ag_rp_4(); break; case 5: V(0,char) = ag_rp_5(); break; case 6: V(0,batch *) = ag_rp_8(V(0,const char *), V(3,const char *)); break; case 7: V(0,batch *) = ag_rp_9(V(0,batch *), V(2,const char *)); break; case 8: V(0,const char *) = ag_rp_10(V(0,const char *)); break; case 9: ag_rp_11(V(0,const char *)); break; case 10: ag_rp_12(V(0,char), V(2,const char *), V(4,const char *)); break; case 11: ag_rp_13(V(0,char), V(2,const char *), V(4,const char *), V(6,int)); break; case 12: ag_rp_14(V(0,char), V(2,const char *), V(4,int)); break; case 13: V(0,const char *) = ag_rp_15(V(1,const char *)); break; case 14: ag_rp_16(V(0,const char *), V(2,int)); break; case 15: ag_rp_17(V(1,int), V(3,int)); break; case 16: ag_rp_18(V(1,int), V(3,int)); break; case 17: ag_rp_19(V(0,const char *)); break; case 18: ag_rp_20(V(0,const char *), V(2,const char *)); break; case 19: ag_rp_21(V(0,const char *)); break; case 20: ag_rp_22(V(0,const char *), V(2,int), V(4,int), V(6,int), V(8,int)); break; case 21: ag_rp_23(V(0,const char *), V(2,const char *)); break; case 22: V(0,const char *) = ag_rp_24(V(0,const char *)); break; case 23: V(0,const char *) = ag_rp_25(V(0,const char *)); break; case 24: V(0,const char *) = ag_rp_26(V(0,const char *)); break; case 25: ag_rp_27(V(1,const char *), V(3,const char *), V(4,const char *), V(5,int)); break; case 26: ag_rp_28(V(1,const char *)); break; case 27: ag_rp_29(V(0,const char *)); break; case 28: V(0,int) = ag_rp_30(V(0,int)); break; case 29: V(0,const char *) = ag_rp_31(V(0,const char *)); break; case 30: V(0,const char *) = ag_rp_32(V(0,const char *)); break; case 31: V(0,const char *) = ag_rp_33(V(0,int)); break; case 32: V(0,const char *) = ag_rp_34(V(0,const char *), V(1,int)); break; case 33: V(0,const char *) = ag_rp_35(V(1,const char *)); break; case 34: V(0,const char *) = ag_rp_36(V(0,char)); break; case 35: V(0,const char *) = ag_rp_37(V(0,const char *), V(1,char)); break; case 36: V(0,char) = ag_rp_38(V(0,int)); break; case 37: V(0,char) = ag_rp_39(); break; case 38: V(0,char) = ag_rp_40(); break; case 39: V(0,int) = ag_rp_41(V(0,int)); break; case 40: V(0,int) = ag_rp_42(V(0,int), V(1,int)); break; case 41: V(0,int) = ag_rp_43(V(1,int)); break; case 42: V(0,int) = ag_rp_44(V(0,int), V(1,int)); break; case 43: V(0,int) = ag_rp_45(V(0,int)); break; case 44: V(0,int) = ag_rp_46(V(0,int), V(1,int)); break; case 45: V(0,int) = ag_rp_47(V(0,int)); break; case 46: V(0,int) = ag_rp_48(V(0,int)); break; case 47: V(0,int) = ag_rp_49(V(0,int)); break; case 48: V(0,int) = ag_rp_50(V(0,int), V(1,int)); break; case 49: V(0,int) = ag_rp_51(V(0,int), V(2,int)); break; case 50: V(0,int) = ag_rp_52(V(0,int), V(2,int)); break; case 51: V(0,int) = ag_rp_53(V(0,int), V(2,int)); break; case 52: V(0,int) = ag_rp_54(V(1,int)); break; case 53: V(0,int) = ag_rp_55(V(1,int)); break; } } #define TOKEN_NAMES parse_token_names const char *parse_token_names[158] = { "file format", "identifier", "white space", "simple eol", "quoted string", "file format", "", "devices", "", "cache", "", "devinfo", "", "config", "eol", "", "device list", "", "eof", "", "character device", "", "", "block device", "", "number", "name", "cachedevice", "", "devicetype", "", "", "", "", "device block", "", "device header spec", "", "device decl", "", "", "", "", "ignoramus", "", "", "batch list", "batch item", "", "", "", "groupname", "", "procname", "", "class", "device tail", "", "expr", "device range", "", "", "", "hex number", "auto hex", "devname", "letter", "", "", "config decl", "", "class decl", "omit decl", "", "mode", "", "single omit", "", "octal number", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "qstring", "qstring char", "qchar", "", "digit", "", "", "", "hex digit", "", "octal digit", "term", "", "factor", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "letter", "", "", "", "simple eol", "identifier", "quoted string", "digit", "", "", "", "octal digit", "", "", "", "", "", "", "", "", "", "", }; static char ag_msg[82]; static char ag_mst[] = "Missing %s"; static char ag_uet[] = "Unexpected %s"; static char ag_ac[4] = "' '"; static void ag_diagnose(void) { int ag_snd = (PCB).sn, ag_k; const char *ag_p; const char *ag_fmt = ag_uet; ag_k = ag_sbt[ag_snd]; if (*TOKEN_NAMES[ag_tstt[ag_k]] && ag_astt[ag_k + 1] == ag_action_8) { ag_p = TOKEN_NAMES[ag_tstt[ag_k]]; ag_fmt = ag_mst; } else if ((PCB).token_number && *TOKEN_NAMES[(PCB).token_number]) { ag_p = TOKEN_NAMES[(PCB).token_number]; } else if (isprint((*(PCB).lab)) && (*(PCB).lab) != '\\') { ag_ac[1] = (*(PCB).lab); ag_p = ag_ac; } else ag_p = "input"; sprintf(ag_msg, ag_fmt, ag_p); (PCB).error_message = ag_msg; } static int ag_action_1_r_proc(void); static int ag_action_2_r_proc(void); static int ag_action_3_r_proc(void); static int ag_action_4_r_proc(void); static int ag_action_1_s_proc(void); static int ag_action_3_s_proc(void); static int ag_action_1_proc(void); static int ag_action_2_proc(void); static int ag_action_3_proc(void); static int ag_action_4_proc(void); static int ag_action_5_proc(void); static int ag_action_6_proc(void); static int ag_action_7_proc(void); static int ag_action_8_proc(void); static int ag_action_9_proc(void); static int ag_action_10_proc(void); static int ag_action_11_proc(void); static int ag_action_8_proc(void); static int (*ag_r_procs_scan[])(void) = { ag_action_1_r_proc, ag_action_2_r_proc, ag_action_3_r_proc, ag_action_4_r_proc }; static int (*ag_s_procs_scan[])(void) = { ag_action_1_s_proc, ag_action_2_r_proc, ag_action_3_s_proc, ag_action_4_r_proc }; static int (*ag_gt_procs_scan[])(void) = { ag_action_1_proc, ag_action_2_proc, ag_action_3_proc, ag_action_4_proc, ag_action_5_proc, ag_action_6_proc, ag_action_7_proc, ag_action_8_proc, ag_action_9_proc, ag_action_10_proc, ag_action_11_proc, ag_action_8_proc }; static int ag_action_10_proc(void) { (PCB).btsx = 0, (PCB).drt = -1; ag_track(); return 0; } static int ag_action_11_proc(void) { (PCB).btsx = 0, (PCB).drt = -1; (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).lab; (PCB).ssx--; ag_ra(); (PCB).ssx++; ag_track(); return 0; } static int ag_action_3_r_proc(void) { int ag_sd = ag_fl[ag_ap] - 1; if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; (PCB).btsx = 0, (PCB).drt = -1; (PCB).reduction_token = (parse_token_type) ag_ptt[ag_ap]; ag_ra(); return 1; } static int ag_action_3_s_proc(void) { int ag_sd = ag_fl[ag_ap] - 1; if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; (PCB).btsx = 0, (PCB).drt = -1; (PCB).reduction_token = (parse_token_type) ag_ptt[ag_ap]; ag_ra(); return 1; } static int ag_action_4_r_proc(void) { int ag_sd = ag_fl[ag_ap] - 1; if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; (PCB).reduction_token = (parse_token_type) ag_ptt[ag_ap]; return 1; } static int ag_action_2_proc(void) { (PCB).btsx = 0, (PCB).drt = -1; if ((PCB).ssx >= 38) { (PCB).exit_flag = AG_STACK_ERROR_CODE; PARSER_STACK_OVERFLOW; } (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).lab; (PCB).ss[(PCB).ssx] = (PCB).sn; (PCB).ssx++; (PCB).sn = ag_ap; ag_track(); return 0; } static int ag_action_9_proc(void) { if((PCB).drt == -1) { (PCB).drt=(PCB).token_number; (PCB).dssx=(PCB).ssx; (PCB).dsn=(PCB).sn; } ag_prot(); (PCB).ss[(PCB).ssx] = (PCB).sn; (PCB).ssx++; (PCB).sn = ag_ap; (PCB).rx = 0; return (PCB).exit_flag == AG_RUNNING_CODE; } static int ag_action_2_r_proc(void) { (PCB).ssx++; (PCB).sn = ag_ap; return 0; } static int ag_action_7_proc(void) { --(PCB).ssx; (PCB).exit_flag = AG_SUCCESS_CODE; (PCB).rx = 0; return 0; } static int ag_action_1_proc(void) { (PCB).exit_flag = AG_SUCCESS_CODE; ag_track(); return 0; } static int ag_action_1_r_proc(void) { (PCB).exit_flag = AG_SUCCESS_CODE; return 0; } static int ag_action_1_s_proc(void) { (PCB).exit_flag = AG_SUCCESS_CODE; return 0; } static int ag_action_4_proc(void) { int ag_sd = ag_fl[ag_ap] - 1; (PCB).reduction_token = (parse_token_type) ag_ptt[ag_ap]; (PCB).btsx = 0, (PCB).drt = -1; (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).lab; if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; else (PCB).ss[(PCB).ssx] = (PCB).sn; ag_track(); while ((PCB).exit_flag == AG_RUNNING_CODE) { unsigned ag_t1 = ag_sbe[(PCB).sn] + 1; unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1; do { unsigned ag_tx = (ag_t1 + ag_t2)/2; if (ag_tstt[ag_tx] < (const unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1; else ag_t2 = ag_tx; } while (ag_t1 < ag_t2); ag_ap = ag_pstt[ag_t1]; if ((ag_s_procs_scan[ag_astt[ag_t1]])() == 0) break; } return 0; } static int ag_action_3_proc(void) { int ag_sd = ag_fl[ag_ap] - 1; (PCB).btsx = 0, (PCB).drt = -1; (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).lab; if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; else (PCB).ss[(PCB).ssx] = (PCB).sn; ag_track(); (PCB).reduction_token = (parse_token_type) ag_ptt[ag_ap]; ag_ra(); while ((PCB).exit_flag == AG_RUNNING_CODE) { unsigned ag_t1 = ag_sbe[(PCB).sn] + 1; unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1; do { unsigned ag_tx = (ag_t1 + ag_t2)/2; if (ag_tstt[ag_tx] < (const unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1; else ag_t2 = ag_tx; } while (ag_t1 < ag_t2); ag_ap = ag_pstt[ag_t1]; if ((ag_s_procs_scan[ag_astt[ag_t1]])() == 0) break; } return 0; } static int ag_action_8_proc(void) { ag_undo(); (PCB).rx = 0; (PCB).exit_flag = AG_SYNTAX_ERROR_CODE; ag_diagnose(); SYNTAX_ERROR; {(PCB).rx = 1; ag_track();} return (PCB).exit_flag == AG_RUNNING_CODE; } static int ag_action_5_proc(void) { int ag_sd = ag_fl[ag_ap]; if((PCB).drt == -1) { (PCB).drt=(PCB).token_number; (PCB).dssx=(PCB).ssx; (PCB).dsn=(PCB).sn; } if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; else { ag_prot(); (PCB).ss[(PCB).ssx] = (PCB).sn; } (PCB).rx = 0; (PCB).reduction_token = (parse_token_type) ag_ptt[ag_ap]; ag_ra(); while ((PCB).exit_flag == AG_RUNNING_CODE) { unsigned ag_t1 = ag_sbe[(PCB).sn] + 1; unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1; do { unsigned ag_tx = (ag_t1 + ag_t2)/2; if (ag_tstt[ag_tx] < (const unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1; else ag_t2 = ag_tx; } while (ag_t1 < ag_t2); ag_ap = ag_pstt[ag_t1]; if ((ag_r_procs_scan[ag_astt[ag_t1]])() == 0) break; } return (PCB).exit_flag == AG_RUNNING_CODE; } static int ag_action_6_proc(void) { int ag_sd = ag_fl[ag_ap]; (PCB).reduction_token = (parse_token_type) ag_ptt[ag_ap]; if((PCB).drt == -1) { (PCB).drt=(PCB).token_number; (PCB).dssx=(PCB).ssx; (PCB).dsn=(PCB).sn; } if (ag_sd) { (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; } else { ag_prot(); (PCB).vs[(PCB).ssx] = ag_null_value; (PCB).ss[(PCB).ssx] = (PCB).sn; } (PCB).rx = 0; while ((PCB).exit_flag == AG_RUNNING_CODE) { unsigned ag_t1 = ag_sbe[(PCB).sn] + 1; unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1; do { unsigned ag_tx = (ag_t1 + ag_t2)/2; if (ag_tstt[ag_tx] < (const unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1; else ag_t2 = ag_tx; } while (ag_t1 < ag_t2); ag_ap = ag_pstt[ag_t1]; if ((ag_r_procs_scan[ag_astt[ag_t1]])() == 0) break; } return (PCB).exit_flag == AG_RUNNING_CODE; } void init_parse(void) { unsigned ag_t1 = 0; (PCB).rx = (PCB).fx = 0; (PCB).ss[0] = (PCB).sn = (PCB).ssx = 0; (PCB).exit_flag = AG_RUNNING_CODE; (PCB).key_sp = NULL; (PCB).key_state = 0; (PCB).line = FIRST_LINE; (PCB).column = FIRST_COLUMN; (PCB).btsx = 0, (PCB).drt = -1; while (ag_tstt[ag_t1] == 0) { ag_ap = ag_pstt[ag_t1]; (ag_gt_procs_scan[ag_astt[ag_t1]])(); ag_t1 = ag_sbt[(PCB).sn]; } } void parse(void) { (PCB).lab[(PCB).fx++] = (PCB).input_code; while ((PCB).exit_flag == AG_RUNNING_CODE) { while (1) { unsigned char *ag_p; int ag_ch; if ((PCB).rx >= (PCB).fx) return; ag_ch = CONVERT_CASE((PCB).lab[(PCB).rx++]); if ((PCB).key_sp) { if (ag_ch != *(PCB).key_sp++) { (PCB).rx = (PCB).save_index; (PCB).key_sp = NULL; (PCB).key_state = 0; break; } else if (*(PCB).key_sp) continue; if (ag_key_act[(PCB).key_state] == ag_cf_end_key) { int ag_k1; int ag_k2; if ((PCB).rx >= (PCB).fx) { (PCB).rx--; (PCB).key_sp--; return; } (PCB).key_sp = NULL; ag_k1 = ag_key_parm[(PCB).key_state]; ag_k2 = ag_key_pt[ag_k1]; if (ag_key_itt[ag_k2 + CONVERT_CASE((PCB).lab[(PCB).rx])]) (PCB).rx = (PCB).save_index; else { (PCB).token_number = (parse_token_type) ag_key_pt[ag_k1+1]; (PCB).key_state = 0; } break; } else { (PCB).token_number = (parse_token_type) ag_key_parm[(PCB).key_state]; (PCB).key_state = 0; (PCB).key_sp = NULL; } break; } if ((PCB).key_state == 0) { (PCB).token_number = (parse_token_type) AG_TCV(ag_ch); if (((PCB).key_state = ag_key_index[(PCB).sn]) == 0) break; (PCB).save_index = 1; } ag_p = &ag_key_ch[(PCB).key_state]; while (*ag_p < ag_ch) ag_p++; if (*ag_p == ag_ch) { (PCB).key_state = (int)(ag_p - ag_key_ch); switch (ag_key_act[(PCB).key_state]) { case ag_cf_set_key: { int ag_k1; int ag_k2; if ((PCB).rx >= (PCB).fx) { (PCB).rx--; return; } ag_k1 = ag_key_parm[(PCB).key_state]; ag_k2 = ag_key_pt[ag_k1]; (PCB).key_state = ag_key_jmp[(PCB).key_state]; if (ag_key_itt[ag_k2 + CONVERT_CASE((PCB).lab[(PCB).rx])]) break; (PCB).save_index = (PCB).rx; (PCB).token_number = (parse_token_type) ag_key_pt[ag_k1+1]; break; } case ag_set_key: (PCB).save_index = (PCB).rx; (PCB).token_number = (parse_token_type) ag_key_parm[(PCB).key_state]; case ag_jmp_key: (PCB).key_state = ag_key_jmp[(PCB).key_state]; continue; case ag_cf_end_key: case ag_end_key: (PCB).key_sp = ag_key_ends + ag_key_jmp[(PCB).key_state]; continue; case ag_accept_key: (PCB).token_number = (parse_token_type) ag_key_parm[(PCB).key_state]; (PCB).key_state = 0; break; case ag_cf_accept_key: { int ag_k1; int ag_k2; if ((PCB).rx >= (PCB).fx) { (PCB).rx--; return; } ag_k1 = ag_key_parm[(PCB).key_state]; ag_k2 = ag_key_pt[ag_k1]; if (ag_key_itt[ag_k2 + CONVERT_CASE((PCB).lab[(PCB).rx])]) (PCB).rx = (PCB).save_index; else { (PCB).rx--; (PCB).token_number = (parse_token_type) ag_key_pt[ag_k1+1]; (PCB).key_state = 0; } break; } } break; } else { (PCB).rx = (PCB).save_index; (PCB).key_state = 0; break; } } { unsigned ag_t1 = ag_sbt[(PCB).sn]; unsigned ag_t2 = ag_sbe[(PCB).sn] - 1; do { unsigned ag_tx = (ag_t1 + ag_t2)/2; if (ag_tstt[ag_tx] > (const unsigned char)(PCB).token_number) ag_t1 = ag_tx + 1; else ag_t2 = ag_tx; } while (ag_t1 < ag_t2); if (ag_tstt[ag_t1] != (PCB).token_number) ag_t1 = ag_sbe[(PCB).sn]; ag_ap = ag_pstt[ag_t1]; (ag_gt_procs_scan[ag_astt[ag_t1]])(); } } }