X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/428046f8d4365e2cd60f8a5f645c2f3e23e3f7af..53c71a12c8bed583886c857a53e6f13f95d9916b:/src/lex.c diff --git a/src/lex.c b/src/lex.c index deb6eb7a..516f7997 100644 --- a/src/lex.c +++ b/src/lex.c @@ -32,12 +32,12 @@ static struct obstack token_obstack; const char *token_buffer = NULL; -bucket *symval = NULL; +symbol_t *symval = NULL; int numval; /* A token to be reread, see unlex and lex. */ static token_t unlexed = tok_undef; -static bucket *unlexed_symval = NULL; +static symbol_t *unlexed_symval = NULL; static const char *unlexed_token_buffer = NULL; void @@ -364,9 +364,13 @@ lex (void) obstack_1grow (&token_obstack, '\0'); token_buffer = obstack_finish (&token_obstack); symval = getsym (token_buffer); - symval->class = token_sym; - if (symval->user_token_number == SUNDEF) - symval->user_token_number = code; + if (symval->number == NUMBER_UNDEFINED) + { + symval->number = ntokens++; + symval->class = token_sym; + if (symval->user_token_number == SUNDEF) + symval->user_token_number = code; + } return tok_identifier; } @@ -388,7 +392,11 @@ lex (void) token_buffer = obstack_finish (&token_obstack); symval = getsym (token_buffer); - symval->class = token_sym; + if (symval->number == NUMBER_UNDEFINED) + { + symval->number = ntokens++; + symval->class = token_sym; + } return tok_identifier; } @@ -482,43 +490,50 @@ parse_percent_token (void) size_t arg_offset = 0; int c = getc (finput); + obstack_1grow (&token_obstack, '%'); + obstack_1grow (&token_obstack, c); - switch (c) + if (!isalpha (c)) { - case '%': - return tok_two_percents; + obstack_1grow (&token_obstack, '\0'); + token_buffer = obstack_finish (&token_obstack); - case '{': - return tok_percent_left_curly; + switch (c) + { + case '%': + return tok_two_percents; - /* FIXME: Who the heck are those 5 guys!?! `%<' = `%left'!!! - Let's ask for there removal. */ - case '<': - return tok_left; + case '{': + return tok_percent_left_curly; - case '>': - return tok_right; + /* The following guys are here for backward compatibility with + very ancient Yacc versions. The paper of Johnson mentions + them (as ancient :). */ + case '<': + return tok_left; - case '2': - return tok_nonassoc; + case '>': + return tok_right; - case '0': - return tok_token; + case '2': + return tok_nonassoc; - case '=': - return tok_prec; - } + case '0': + return tok_token; - if (!isalpha (c)) - return tok_illegal; + case '=': + return tok_prec; - obstack_1grow (&token_obstack, '%'); - while (isalpha (c) || c == '_' || c == '-') + default: + return tok_illegal; + } + } + + while (c = getc (finput), isalpha (c) || c == '_' || c == '-') { if (c == '_') c = '-'; obstack_1grow (&token_obstack, c); - c = getc (finput); } /* %DIRECTIVE="ARG". Separate into