mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 20:33:03 +00:00
(<INITIAL>{int}): Use set_errno and get_errno instead of errno.
(<SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>\\x[0-9abcdefABCDEF]+): Likewise. (handle_action_dollar, handle_action_at): Likewise. (obstack_for_string): Renamed from string_obstack.
This commit is contained in:
166
src/scan-gram.l
166
src/scan-gram.l
@@ -24,14 +24,17 @@
|
||||
|
||||
%{
|
||||
#include "system.h"
|
||||
#include "mbswidth.h"
|
||||
|
||||
#include <mbswidth.h>
|
||||
#include <get-errno.h>
|
||||
#include <quote.h>
|
||||
|
||||
#include "complain.h"
|
||||
#include "files.h"
|
||||
#include "quote.h"
|
||||
#include "struniq.h"
|
||||
#include "getargs.h"
|
||||
#include "gram.h"
|
||||
#include "reader.h"
|
||||
#include "uniqstr.h"
|
||||
|
||||
#define YY_USER_INIT \
|
||||
do \
|
||||
@@ -45,14 +48,14 @@
|
||||
/* Location of scanner cursor. */
|
||||
boundary scanner_cursor;
|
||||
|
||||
static void adjust_location (location_t *, char const *, size_t);
|
||||
static void adjust_location (location *, char const *, size_t);
|
||||
#define YY_USER_ACTION adjust_location (loc, yytext, yyleng);
|
||||
|
||||
static size_t no_cr_read (FILE *, char *, size_t);
|
||||
#define YY_INPUT(buf, result, size) ((result) = no_cr_read (yyin, buf, size))
|
||||
|
||||
|
||||
/* STRING_OBSTACK -- Used to store all the characters that we need to
|
||||
/* OBSTACK_FOR_STRING -- Used to store all the characters that we need to
|
||||
keep (to construct ID, STRINGS etc.). Use the following macros to
|
||||
use it.
|
||||
|
||||
@@ -61,23 +64,23 @@ static size_t no_cr_read (FILE *, char *, size_t);
|
||||
STRING_FINISH also stores this string in LAST_STRING, which can be
|
||||
used, and which is used by STRING_FREE to free the last string. */
|
||||
|
||||
static struct obstack string_obstack;
|
||||
static struct obstack obstack_for_string;
|
||||
|
||||
/* A string representing the most recently saved token. */
|
||||
static char *last_string;
|
||||
|
||||
|
||||
#define STRING_GROW \
|
||||
obstack_grow (&string_obstack, yytext, yyleng)
|
||||
obstack_grow (&obstack_for_string, yytext, yyleng)
|
||||
|
||||
#define STRING_FINISH \
|
||||
do { \
|
||||
obstack_1grow (&string_obstack, '\0'); \
|
||||
last_string = obstack_finish (&string_obstack); \
|
||||
obstack_1grow (&obstack_for_string, '\0'); \
|
||||
last_string = obstack_finish (&obstack_for_string); \
|
||||
} while (0)
|
||||
|
||||
#define STRING_FREE \
|
||||
obstack_free (&string_obstack, last_string)
|
||||
obstack_free (&obstack_for_string, last_string)
|
||||
|
||||
void
|
||||
scanner_last_string_free (void)
|
||||
@@ -93,10 +96,8 @@ scanner_last_string_free (void)
|
||||
Outside of well-formed rules, RULE_LENGTH has an undefined value. */
|
||||
static int rule_length;
|
||||
|
||||
static void handle_dollar (braced_code_t code_kind,
|
||||
char *cp, location_t location);
|
||||
static void handle_at (braced_code_t code_kind,
|
||||
char *cp, location_t location);
|
||||
static void handle_dollar (braced_code code_kind, char *cp, location loc);
|
||||
static void handle_at (braced_code code_kind, char *cp, location loc);
|
||||
static void handle_syncline (char *args);
|
||||
static int convert_ucn_to_byte (char const *hex_text);
|
||||
static void unexpected_end_of_file (boundary, char const *);
|
||||
@@ -131,13 +132,13 @@ splice (\\[ \f\t\v]*\n)*
|
||||
int context_state IF_LINT (= 0);
|
||||
|
||||
/* Location of most recent identifier, when applicable. */
|
||||
location_t id_loc IF_LINT (= *loc);
|
||||
location id_loc IF_LINT (= *loc);
|
||||
|
||||
/* Location where containing code started, when applicable. */
|
||||
/* Where containing code started, when applicable. */
|
||||
boundary code_start IF_LINT (= loc->start);
|
||||
|
||||
/* Location where containing comment or string or character literal
|
||||
started, when applicable. */
|
||||
/* Where containing comment or string or character literal started,
|
||||
when applicable. */
|
||||
boundary token_start IF_LINT (= loc->start);
|
||||
%}
|
||||
|
||||
@@ -223,9 +224,9 @@ splice (\\[ \f\t\v]*\n)*
|
||||
|
||||
{int} {
|
||||
unsigned long num;
|
||||
errno = 0;
|
||||
set_errno (0);
|
||||
num = strtoul (yytext, 0, 10);
|
||||
if (INT_MAX < num || errno)
|
||||
if (INT_MAX < num || get_errno ())
|
||||
{
|
||||
complain_at (*loc, _("integer out of range: %s"), quote (yytext));
|
||||
num = INT_MAX;
|
||||
@@ -253,9 +254,9 @@ splice (\\[ \f\t\v]*\n)*
|
||||
|
||||
/* A type. */
|
||||
"<"{tag}">" {
|
||||
obstack_grow (&string_obstack, yytext + 1, yyleng - 2);
|
||||
obstack_grow (&obstack_for_string, yytext + 1, yyleng - 2);
|
||||
STRING_FINISH;
|
||||
val->struniq = struniq_new (last_string);
|
||||
val->uniqstr = uniqstr_new (last_string);
|
||||
STRING_FREE;
|
||||
return TYPE;
|
||||
}
|
||||
@@ -349,7 +350,7 @@ splice (\\[ \f\t\v]*\n)*
|
||||
STRING_GROW;
|
||||
STRING_FINISH;
|
||||
loc->start = token_start;
|
||||
val->string = last_string;
|
||||
val->chars = last_string;
|
||||
rule_length++;
|
||||
BEGIN INITIAL;
|
||||
return STRING;
|
||||
@@ -396,36 +397,36 @@ splice (\\[ \f\t\v]*\n)*
|
||||
if (UCHAR_MAX < c)
|
||||
complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext));
|
||||
else
|
||||
obstack_1grow (&string_obstack, c);
|
||||
obstack_1grow (&obstack_for_string, c);
|
||||
}
|
||||
|
||||
\\x[0-9abcdefABCDEF]+ {
|
||||
unsigned long c;
|
||||
errno = 0;
|
||||
set_errno (0);
|
||||
c = strtoul (yytext + 2, 0, 16);
|
||||
if (UCHAR_MAX < c || errno)
|
||||
if (UCHAR_MAX < c || get_errno ())
|
||||
complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext));
|
||||
else
|
||||
obstack_1grow (&string_obstack, c);
|
||||
obstack_1grow (&obstack_for_string, c);
|
||||
}
|
||||
|
||||
\\a obstack_1grow (&string_obstack, '\a');
|
||||
\\b obstack_1grow (&string_obstack, '\b');
|
||||
\\f obstack_1grow (&string_obstack, '\f');
|
||||
\\n obstack_1grow (&string_obstack, '\n');
|
||||
\\r obstack_1grow (&string_obstack, '\r');
|
||||
\\t obstack_1grow (&string_obstack, '\t');
|
||||
\\v obstack_1grow (&string_obstack, '\v');
|
||||
\\a obstack_1grow (&obstack_for_string, '\a');
|
||||
\\b obstack_1grow (&obstack_for_string, '\b');
|
||||
\\f obstack_1grow (&obstack_for_string, '\f');
|
||||
\\n obstack_1grow (&obstack_for_string, '\n');
|
||||
\\r obstack_1grow (&obstack_for_string, '\r');
|
||||
\\t obstack_1grow (&obstack_for_string, '\t');
|
||||
\\v obstack_1grow (&obstack_for_string, '\v');
|
||||
|
||||
/* \\[\"\'?\\] would be shorter, but it confuses xgettext. */
|
||||
\\("\""|"'"|"?"|"\\") obstack_1grow (&string_obstack, yytext[1]);
|
||||
\\("\""|"'"|"?"|"\\") obstack_1grow (&obstack_for_string, yytext[1]);
|
||||
|
||||
\\(u|U[0-9abcdefABCDEF]{4})[0-9abcdefABCDEF]{4} {
|
||||
int c = convert_ucn_to_byte (yytext);
|
||||
if (c < 0)
|
||||
complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext));
|
||||
else
|
||||
obstack_1grow (&string_obstack, c);
|
||||
obstack_1grow (&obstack_for_string, c);
|
||||
}
|
||||
\\(.|\n) {
|
||||
complain_at (*loc, _("unrecognized escape sequence: %s"), quote (yytext));
|
||||
@@ -508,7 +509,7 @@ splice (\\[ \f\t\v]*\n)*
|
||||
{
|
||||
STRING_FINISH;
|
||||
loc->start = code_start;
|
||||
val->string = last_string;
|
||||
val->chars = last_string;
|
||||
rule_length++;
|
||||
BEGIN INITIAL;
|
||||
return BRACED_CODE;
|
||||
@@ -537,7 +538,7 @@ splice (\\[ \f\t\v]*\n)*
|
||||
"%}" {
|
||||
STRING_FINISH;
|
||||
loc->start = code_start;
|
||||
val->string = last_string;
|
||||
val->chars = last_string;
|
||||
BEGIN INITIAL;
|
||||
return PROLOGUE;
|
||||
}
|
||||
@@ -556,7 +557,7 @@ splice (\\[ \f\t\v]*\n)*
|
||||
<<EOF>> {
|
||||
STRING_FINISH;
|
||||
loc->start = code_start;
|
||||
val->string = last_string;
|
||||
val->chars = last_string;
|
||||
BEGIN INITIAL;
|
||||
return EPILOGUE;
|
||||
}
|
||||
@@ -570,10 +571,10 @@ splice (\\[ \f\t\v]*\n)*
|
||||
|
||||
<SC_COMMENT,SC_LINE_COMMENT,SC_STRING,SC_CHARACTER,SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE>
|
||||
{
|
||||
\$ obstack_sgrow (&string_obstack, "$][");
|
||||
\@ obstack_sgrow (&string_obstack, "@@");
|
||||
\[ obstack_sgrow (&string_obstack, "@{");
|
||||
\] obstack_sgrow (&string_obstack, "@}");
|
||||
\$ obstack_sgrow (&obstack_for_string, "$][");
|
||||
\@ obstack_sgrow (&obstack_for_string, "@@");
|
||||
\[ obstack_sgrow (&obstack_for_string, "@{");
|
||||
\] obstack_sgrow (&obstack_for_string, "@}");
|
||||
.|\n STRING_GROW;
|
||||
}
|
||||
|
||||
@@ -584,7 +585,7 @@ splice (\\[ \f\t\v]*\n)*
|
||||
size SIZE. */
|
||||
|
||||
static void
|
||||
adjust_location (location_t *loc, char const *token, size_t size)
|
||||
adjust_location (location *loc, char const *token, size_t size)
|
||||
{
|
||||
int line = scanner_cursor.line;
|
||||
int column = scanner_cursor.column;
|
||||
@@ -669,11 +670,11 @@ no_cr_read (FILE *fp, char *buf, size_t size)
|
||||
| |
|
||||
| Possible inputs: $[<TYPENAME>]($|integer) |
|
||||
| |
|
||||
| Output to the STRING_OBSTACK a reference to this semantic value. |
|
||||
| Output to OBSTACK_FOR_STRING a reference to this semantic value. |
|
||||
`------------------------------------------------------------------*/
|
||||
|
||||
static inline void
|
||||
handle_action_dollar (char *text, location_t location)
|
||||
handle_action_dollar (char *text, location loc)
|
||||
{
|
||||
const char *type_name = NULL;
|
||||
char *cp = text + 1;
|
||||
@@ -691,38 +692,37 @@ handle_action_dollar (char *text, location_t location)
|
||||
if (*cp == '$')
|
||||
{
|
||||
if (!type_name)
|
||||
type_name = symbol_list_n_type_name_get (current_rule, location, 0);
|
||||
type_name = symbol_list_n_type_name_get (current_rule, loc, 0);
|
||||
if (!type_name && typed)
|
||||
complain_at (location, _("$$ of `%s' has no declared type"),
|
||||
complain_at (loc, _("$$ of `%s' has no declared type"),
|
||||
current_rule->sym->tag);
|
||||
if (!type_name)
|
||||
type_name = "";
|
||||
obstack_fgrow1 (&string_obstack,
|
||||
obstack_fgrow1 (&obstack_for_string,
|
||||
"]b4_lhs_value([%s])[", type_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
long num;
|
||||
errno = 0;
|
||||
set_errno (0);
|
||||
num = strtol (cp, 0, 10);
|
||||
|
||||
if (INT_MIN <= num && num <= rule_length && ! errno)
|
||||
if (INT_MIN <= num && num <= rule_length && ! get_errno ())
|
||||
{
|
||||
int n = num;
|
||||
if (!type_name && n > 0)
|
||||
type_name = symbol_list_n_type_name_get (current_rule, location,
|
||||
n);
|
||||
type_name = symbol_list_n_type_name_get (current_rule, loc, n);
|
||||
if (!type_name && typed)
|
||||
complain_at (location, _("$%d of `%s' has no declared type"),
|
||||
n, current_rule->sym->tag);
|
||||
complain_at (loc, _("$%d of `%s' has no declared type"),
|
||||
n, current_rule->sym->tag);
|
||||
if (!type_name)
|
||||
type_name = "";
|
||||
obstack_fgrow3 (&string_obstack,
|
||||
obstack_fgrow3 (&obstack_for_string,
|
||||
"]b4_rhs_value([%d], [%d], [%s])[",
|
||||
rule_length, n, type_name);
|
||||
}
|
||||
else
|
||||
complain_at (location, _("integer out of range: %s"), quote (text));
|
||||
complain_at (loc, _("integer out of range: %s"), quote (text));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -733,13 +733,13 @@ handle_action_dollar (char *text, location_t location)
|
||||
`---------------------------------------------------------------*/
|
||||
|
||||
static inline void
|
||||
handle_symbol_code_dollar (char *text, location_t location)
|
||||
handle_symbol_code_dollar (char *text, location loc)
|
||||
{
|
||||
char *cp = text + 1;
|
||||
if (*cp == '$')
|
||||
obstack_sgrow (&string_obstack, "]b4_dollar_dollar[");
|
||||
obstack_sgrow (&obstack_for_string, "]b4_dollar_dollar[");
|
||||
else
|
||||
complain_at (location, _("invalid value: %s"), quote (text));
|
||||
complain_at (loc, _("invalid value: %s"), quote (text));
|
||||
}
|
||||
|
||||
|
||||
@@ -749,18 +749,17 @@ handle_symbol_code_dollar (char *text, location_t location)
|
||||
`-----------------------------------------------------------------*/
|
||||
|
||||
static void
|
||||
handle_dollar (braced_code_t braced_code_kind,
|
||||
char *text, location_t location)
|
||||
handle_dollar (braced_code braced_code_kind, char *text, location loc)
|
||||
{
|
||||
switch (braced_code_kind)
|
||||
{
|
||||
case action_braced_code:
|
||||
handle_action_dollar (text, location);
|
||||
handle_action_dollar (text, loc);
|
||||
break;
|
||||
|
||||
case destructor_braced_code:
|
||||
case printer_braced_code:
|
||||
handle_symbol_code_dollar (text, location);
|
||||
handle_symbol_code_dollar (text, loc);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -768,33 +767,33 @@ handle_dollar (braced_code_t braced_code_kind,
|
||||
|
||||
/*------------------------------------------------------.
|
||||
| TEXT is a location token (i.e., a `@...'). Output to |
|
||||
| STRING_OBSTACK a reference to this location. |
|
||||
| OBSTACK_FOR_STRING a reference to this location. |
|
||||
`------------------------------------------------------*/
|
||||
|
||||
static inline void
|
||||
handle_action_at (char *text, location_t location)
|
||||
handle_action_at (char *text, location loc)
|
||||
{
|
||||
char *cp = text + 1;
|
||||
locations_flag = 1;
|
||||
|
||||
if (*cp == '$')
|
||||
{
|
||||
obstack_sgrow (&string_obstack, "]b4_lhs_location[");
|
||||
obstack_sgrow (&obstack_for_string, "]b4_lhs_location[");
|
||||
}
|
||||
else
|
||||
{
|
||||
long num;
|
||||
errno = 0;
|
||||
set_errno (0);
|
||||
num = strtol (cp, 0, 10);
|
||||
|
||||
if (INT_MIN <= num && num <= rule_length && ! errno)
|
||||
if (INT_MIN <= num && num <= rule_length && ! get_errno ())
|
||||
{
|
||||
int n = num;
|
||||
obstack_fgrow2 (&string_obstack, "]b4_rhs_location([%d], [%d])[",
|
||||
obstack_fgrow2 (&obstack_for_string, "]b4_rhs_location([%d], [%d])[",
|
||||
rule_length, n);
|
||||
}
|
||||
else
|
||||
complain_at (location, _("integer out of range: %s"), quote (text));
|
||||
complain_at (loc, _("integer out of range: %s"), quote (text));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -805,13 +804,13 @@ handle_action_at (char *text, location_t location)
|
||||
`---------------------------------------------------------------*/
|
||||
|
||||
static inline void
|
||||
handle_symbol_code_at (char *text, location_t location)
|
||||
handle_symbol_code_at (char *text, location loc)
|
||||
{
|
||||
char *cp = text + 1;
|
||||
if (*cp == '$')
|
||||
obstack_sgrow (&string_obstack, "]b4_at_dollar[");
|
||||
obstack_sgrow (&obstack_for_string, "]b4_at_dollar[");
|
||||
else
|
||||
complain_at (location, _("invalid value: %s"), quote (text));
|
||||
complain_at (loc, _("invalid value: %s"), quote (text));
|
||||
}
|
||||
|
||||
|
||||
@@ -821,18 +820,17 @@ handle_symbol_code_at (char *text, location_t location)
|
||||
`-------------------------------------------------------------------*/
|
||||
|
||||
static void
|
||||
handle_at (braced_code_t braced_code_kind,
|
||||
char *text, location_t location)
|
||||
handle_at (braced_code braced_code_kind, char *text, location loc)
|
||||
{
|
||||
switch (braced_code_kind)
|
||||
{
|
||||
case action_braced_code:
|
||||
handle_action_at (text, location);
|
||||
handle_action_at (text, loc);
|
||||
break;
|
||||
|
||||
case destructor_braced_code:
|
||||
case printer_braced_code:
|
||||
handle_symbol_code_at (text, location);
|
||||
handle_symbol_code_at (text, loc);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -922,10 +920,10 @@ unexpected_end_of_file (boundary start, char const *token_end)
|
||||
{
|
||||
size_t i = strlen (token_end);
|
||||
|
||||
location_t location;
|
||||
location.start = start;
|
||||
location.end = scanner_cursor;
|
||||
complain_at (location, _("missing `%s' at end of file"), token_end);
|
||||
location loc;
|
||||
loc.start = start;
|
||||
loc.end = scanner_cursor;
|
||||
complain_at (loc, _("missing `%s' at end of file"), token_end);
|
||||
|
||||
/* Adjust scanner cursor so that any later message does not count
|
||||
the characters about to be inserted. */
|
||||
@@ -943,7 +941,7 @@ unexpected_end_of_file (boundary start, char const *token_end)
|
||||
void
|
||||
scanner_initialize (void)
|
||||
{
|
||||
obstack_init (&string_obstack);
|
||||
obstack_init (&obstack_for_string);
|
||||
}
|
||||
|
||||
|
||||
@@ -954,7 +952,7 @@ scanner_initialize (void)
|
||||
void
|
||||
scanner_free (void)
|
||||
{
|
||||
obstack_free (&string_obstack, 0);
|
||||
obstack_free (&obstack_for_string, 0);
|
||||
/* Reclaim Flex's buffers. */
|
||||
yy_delete_buffer (YY_CURRENT_BUFFER);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user