X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/d54387b4bca8c2c2b764c0c247f284ecce984be8..e89a22bfab22e4d2ee73be49dcb66b51f8d0e892:/src/lex.c?ds=inline diff --git a/src/lex.c b/src/lex.c index f18933e8..1d2424e2 100644 --- a/src/lex.c +++ b/src/lex.c @@ -29,15 +29,15 @@ /* Buffer for storing the current token. */ struct obstack token_obstack; -char *token_buffer = NULL; +const char *token_buffer = NULL; -bucket *symval; +bucket *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 char *unlexed_token_buffer = NULL; +static const char *unlexed_token_buffer = NULL; void lex_init (void) @@ -585,77 +585,89 @@ token_t parse_percent_token (void) { struct percent_table_struct *tx = NULL; - /* Where `=' was found in token_buffer. */ - size_t equal_offset = 0; - char *arg = NULL; + const char *arg = NULL; + /* Where the ARG was found in token_buffer. */ + size_t arg_offset = 0; int c = getc (finput); + obstack_1grow (&token_obstack, '%'); + obstack_1grow (&token_obstack, c); switch (c) { case '%': + token_buffer = obstack_finish (&token_obstack); return tok_two_percents; case '{': + token_buffer = obstack_finish (&token_obstack); return tok_percent_left_curly; - /* FIXME: Who the heck are those 5 guys!?! `%<' = `%left'!!! - Let's ask for there removal. */ + /* The following guys are here for backward compatibility with + very ancient Yacc versions. The paper of Johnson mentions + them (as ancient :). */ case '<': + token_buffer = obstack_finish (&token_obstack); return tok_left; case '>': + token_buffer = obstack_finish (&token_obstack); return tok_right; case '2': + token_buffer = obstack_finish (&token_obstack); return tok_nonassoc; case '0': + token_buffer = obstack_finish (&token_obstack); return tok_token; case '=': + token_buffer = obstack_finish (&token_obstack); return tok_prec; } if (!isalpha (c)) - return tok_illegal; + { + token_buffer = obstack_finish (&token_obstack); + return tok_illegal; + } - obstack_1grow (&token_obstack, '%'); - while (isalpha (c) || c == '_' || c == '-') + while (c = getc (finput), isalpha (c) || c == '_' || c == '-') { if (c == '_') c = '-'; obstack_1grow (&token_obstack, c); - c = getc (finput); } + /* %DIRECTIVE="ARG". Separate into + TOKEN_BUFFER = `%DIRECTIVE\0ARG\0'. + This is a bit hackish, but once we move to a Bison parser, + things will be cleaned up. */ if (c == '=') { - equal_offset = obstack_object_size (&token_obstack); - obstack_1grow (&token_obstack, c); + /* End of the directive. We skip the `='. */ + obstack_1grow (&token_obstack, '\0'); + /* Fetch the ARG if present. */ c = getc (finput); - if (c = '"') + if (c == '"') { - int code; /* ignored here */ - - obstack_1grow (&token_obstack, '"'); - /* Read up to and including ". */ - while (literalchar (&token_obstack, &code, '"')) - /* nothing */; + int code; + arg_offset = obstack_object_size (&token_obstack); + /* Read up to and including `"'. Do not append the closing + `"' in the output: it's not part of the ARG. */ + while (literalchar (NULL, &code, '"')) + obstack_1grow (&token_obstack, code); } + /* else: should be an error. */ } else ungetc (c, finput); obstack_1grow (&token_obstack, '\0'); token_buffer = obstack_finish (&token_obstack); - if (equal_offset) - { - /* %token_buffer="arg" */ - arg = token_buffer + equal_offset + 2; - arg[strlen (arg) - 1] = '\0'; - token_buffer[equal_offset] = '\0'; - } + if (arg_offset) + arg = token_buffer + arg_offset; /* table lookup % directive */ for (tx = percent_table; tx->name; tx++) @@ -676,7 +688,7 @@ parse_percent_token (void) precedence. Side effect: if this %-option is used several times, only the first is honored. Bah. */ if (!*((char **) (tx->set_flag))) - *((char **) (tx->set_flag)) = arg; + *((char **) (tx->set_flag)) = xstrdup (arg); } else fatal (_("`%s' requires an argument"), token_buffer);