/* keytab.c */ # include "Lpars.h" # include # define NKEYWORDS ((sizeof keytab) / (sizeof *keytab)) # define MAXKEYLEN 8 typedef struct { int k_token; char *k_str; } KTAB; KTAB keytab[] = { { AFTER, "AFTER" }, { ALLOCATE, "ALLOCATE" }, { ALT, "ALT" }, { AND, "AND" }, { ANY, "ANY" }, { BYTE, "BYTE" }, { CHAN, "CHAN" }, { DEF, "DEF" }, { FALSE, "FALSE" }, { FOR, "FOR" }, { IF, "IF" }, { LOAD, "LOAD" }, { NOT, "NOT" }, { NOW, "NOW" }, { OR, "OR" }, { PAR, "PAR" }, { PLACED, "PLACED" }, { PORT, "PORT" }, { PRI, "PRI" }, { PROC, "PROC" }, { SEQ, "SEQ" }, { SKIP, "SKIP" }, { TABLE, "TABLE" }, { TRUE, "TRUE" }, { VALUE, "VALUE" }, { VAR, "VAR" }, { WAIT, "WAIT" }, { WHILE, "WHILE" }, }; /* * The table of keywords is searched for the occurence of `str', * if found the corresponding token number is returned, * otherwise IDENTIFIER is the returned token number. */ keyword(str) char *str; { register int high= NKEYWORDS-1; register int low= 0; register int i, cmp; char *lowerupper(); register char *key; if ((key=lowerupper(str))==0) return IDENTIFIER; do { i= (high+low) / 2; if ((cmp= strcmp(key, keytab[i].k_str)) == 0) break; else if (cmp > 0) low= i+1; else high= i-1; } while (low <= high); return low<=high ? keytab[i].k_token : IDENTIFIER; } char *lowerupper(str) register char *str; { static char keyword[MAXKEYLEN+1]; register char *key=keyword; if (islower(*str)) { do *key++ = toupper(*str++); while (keyk_token == key) return kp->k_str; return 0; }