|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T l
Length: 4096 (0x1000)
Types: TextFile
Names: »lookup.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Adv/Compiler/lookup.c«
#include "advgen.h"
#include "tokens.h"
typedef struct node
{
struct node *n_left;
struct node *n_right;
symbol n_sym;
} node;
#define NNULL (node *) NULL
/* Initial node chosen about the middle of the reserved words */
node sym_base = { NNULL, NNULL, { "Item", S_SYNTAX, ITEM, 0, 0 }};
node *sym_tree = &sym_base;
static node *
newnode(s)
char *s;
{
#ifdef lint
node *result = NNULL;
#else lint
node *result = (node *) malloc(sizeof (node));
#endif lint
if (result == NNULL)
{
fatal("out of memory for symbol table");
}
result->n_left = result->n_right = NNULL;
result->n_sym.s_sym = strsave(s);
result->n_sym.s_type = S_UNKNOWN;
result->n_sym.s_value = result->n_sym.s_noun = result->n_sym.s_verb = 0;
return result;
}
/* Chris Torek suggested the speed improvements over the original
* version of this: check the first character and only do a strcmp()
* if it's equal (I'd planned to put that one in anyway), and replacement
* of the original tail-recursion by a goto (doing the work that a good
* optimiser should do for us, but usually doesn't). The following
* recoding of looksym() is Chris's.
* The actual gain is surprisingly small: at most 10% as measured by
* recompiling the Pirate's adventure 20 times; the number of calls
* to strcmp and the subroutine call overhead are reduced considerably
* but processing is heavily dominated by yylook() and yyparse().
*/
static node *
looksym(s, n)
char *s;
register node *n;
{
register int cmp;
top:
cmp = *s - *n->n_sym.s_sym; /* fast check on first character */
if (cmp == 0) /* need full blown comparision */
{
cmp = strcmp(s, n->n_sym.s_sym);
}
if (cmp < 0)
{
if (n->n_left == NNULL)
{
return n->n_left = newnode(s);
}
n = n->n_left; /* recurse on left subtree */
goto top;
}
else if (cmp > 0)
{
if (n->n_right == NNULL)
{
return n->n_right = newnode(s);
}
n = n->n_right; /* recurse on right subtree */
goto top;
}
else
{
return n;
}
}
symbol *
lookup(s)
char *s;
{
return &(looksym(s, sym_tree)->n_sym);
}
typedef struct keyword
{
char *k_word;
int k_token;
} keyword;
/* This is ordered to give reasonable balance, but it probably doesn't
* matter very much, since most lookups will find non-reserved words
* anyway. Just for fun, the layout shows the tree structure.
*/
static keyword ktab[] =
{
{ "Item", ITEM },
{ "Get", GET },
{ "Die", DIE },
{ "Daemon", DAEMON },
{ "Action", ACTION },
{ "Carrying", CARRYING },
{ "Dark", DARK },
{ "Darken", DARKEN },
{ "Dropverb", DROPVERB },
{ "Directions", DIRS },
{ "Drop", DROP },
{ "False", FFALSE },
{ "Emptyhanded",EMPTYHANDED },
{ "Fetch", FETCH },
{ "Inlimbo", INLIMBO },
{ "Goverb", GOVERB },
{ "Getverb", GETVERB },
{ "Greeting", GREETING },
{ "Hellroom", HELL },
{ "Inventory", INVENT },
{ "Inroom", INROOM },
{ "Inventorysize",INVENTORYSIZE },
{ "Isdark", ISDARK },
{ "Room", ROOM },
{ "Moveto", MOVETO },
{ "Lighten", LIGHTEN },
{ "Lamplife", LAMPLIFE },
{ "Lamp", LAMP },
{ "Lampwarn", LAMPWARNING },
{ "Location", LOC },
{ "Message", MESSAGE },
{ "Print", PRINT },
{ "Nearto", NEARTO },
{ "Noun", NOUN },
{ "Quit", QUIT },
{ "Refill", REFILL },
{ "Var", VAR },
{ "Score", SCORE },
{ "Sameroom", SAMEROOM },
{ "Say", SAY },
{ "Treasury", TREASUREROOM },
{ "Startroom", STARTROOM },
{ "True", TTRUE },
{ "Win", WIN },
{ "Wordsize", WORDSIZE },
{ "Verb", VERB },
{ "Zap", ZAP },
{ CNULL, 0 }
};
void
init_syms()
{
keyword *k;
symbol *s;
for (k = ktab; k->k_word != CNULL; k++)
{
s = lookup(k->k_word);
s->s_type = S_SYNTAX;
s->s_value = k->k_token;
}
}
void
addsym(s, incr)
char *s;
int incr;
{
symbol *sym = lookup(s);
if (sym->s_type == S_SYNTAX)
{
gramerror(FALSE, "%s is a reserved word", s);
return;
}
addword(sym, incr);
}