mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-16 15:53:03 +00:00
* src/reader.c (copy_dollar): New function.
(copy_guard, copy_action): Use it.
This commit is contained in:
@@ -1,3 +1,9 @@
|
|||||||
|
2000-10-16 Akim Demaille <akim@epita.fr>
|
||||||
|
|
||||||
|
* src/reader.c (copy_dollar): New function.
|
||||||
|
(copy_guard, copy_action): Use it.
|
||||||
|
|
||||||
|
|
||||||
2000-10-16 Akim Demaille <akim@epita.fr>
|
2000-10-16 Akim Demaille <akim@epita.fr>
|
||||||
|
|
||||||
* lib/quote.h, lib/quote.c, lib/quotearg.h, lib/quotearg.c:
|
* lib/quote.h, lib/quote.c, lib/quotearg.h, lib/quotearg.c:
|
||||||
|
|||||||
13
src/lex.c
13
src/lex.c
@@ -76,6 +76,7 @@ skip_white_space (void)
|
|||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
case '/':
|
case '/':
|
||||||
|
/* FIXME: Should probably be merged with copy_comment. */
|
||||||
c = getc (finput);
|
c = getc (finput);
|
||||||
if (c != '*' && c != '/')
|
if (c != '*' && c != '/')
|
||||||
{
|
{
|
||||||
@@ -130,7 +131,11 @@ skip_white_space (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* do a getc, but give error message if EOF encountered */
|
|
||||||
|
/*-----------------------------------------------------.
|
||||||
|
| Do a getc, but give error message if EOF encountered |
|
||||||
|
`-----------------------------------------------------*/
|
||||||
|
|
||||||
static int
|
static int
|
||||||
xgetc (FILE *f)
|
xgetc (FILE *f)
|
||||||
{
|
{
|
||||||
@@ -334,7 +339,8 @@ lex (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
c = skip_white_space ();
|
c = skip_white_space ();
|
||||||
*token_buffer = c; /* for error messages (token buffer always valid) */
|
/* for error messages (token buffer always valid) */
|
||||||
|
*token_buffer = c;
|
||||||
token_buffer[1] = 0;
|
token_buffer[1] = 0;
|
||||||
|
|
||||||
switch (c)
|
switch (c)
|
||||||
@@ -432,7 +438,8 @@ lex (void)
|
|||||||
int code; /* ignored here */
|
int code; /* ignored here */
|
||||||
p = token_buffer;
|
p = token_buffer;
|
||||||
*p++ = '\"';
|
*p++ = '\"';
|
||||||
while (literalchar (&p, &code, '\"')) /* read up to and including " */
|
/* Read up to and including ". */
|
||||||
|
while (literalchar (&p, &code, '\"'))
|
||||||
{
|
{
|
||||||
if (p >= token_buffer + maxtoken - 4)
|
if (p >= token_buffer + maxtoken - 4)
|
||||||
p = grow_token_buffer (p);
|
p = grow_token_buffer (p);
|
||||||
|
|||||||
267
src/reader.c
267
src/reader.c
@@ -117,6 +117,40 @@ read_signed_integer (FILE *stream)
|
|||||||
return sign * n;
|
return sign * n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------.
|
||||||
|
| Get the data type (alternative in the union) of the value for |
|
||||||
|
| symbol N in rule RULE. |
|
||||||
|
`--------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_type_name (int n, symbol_list * rule)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
symbol_list *rp;
|
||||||
|
|
||||||
|
if (n < 0)
|
||||||
|
{
|
||||||
|
complain (_("invalid $ value"));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
rp = rule;
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
while (i < n)
|
||||||
|
{
|
||||||
|
rp = rp->next;
|
||||||
|
if (rp == NULL || rp->sym == NULL)
|
||||||
|
{
|
||||||
|
complain (_("invalid $ value"));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rp->sym->type_name;
|
||||||
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------------------------.
|
/*-------------------------------------------------------------------.
|
||||||
| Dump the string from FINPUT to FOUTPUT. MATCH is the delimiter of |
|
| Dump the string from FINPUT to FOUTPUT. MATCH is the delimiter of |
|
||||||
| the string (either ' or "). |
|
| the string (either ' or "). |
|
||||||
@@ -271,6 +305,78 @@ copy_at (FILE *fin, FILE *fout, int stack_offset)
|
|||||||
complain (_("%s is invalid"), quote (buf));
|
complain (_("%s is invalid"), quote (buf));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------.
|
||||||
|
| FIN is pointing to a wannabee semantic value (i.e., a `$'). |
|
||||||
|
| |
|
||||||
|
| Possible inputs: $[<TYPENAME>]($|integer) |
|
||||||
|
| |
|
||||||
|
| Output to FOUT a reference to this semantic value. STACK_OFFSET is |
|
||||||
|
| the number of values in the current rule so far, which says where |
|
||||||
|
| to find `$0' with respect to the top of the stack. |
|
||||||
|
`-------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
copy_dollar (FILE *fin, FILE *fout,
|
||||||
|
symbol_list *rule, int stack_offset)
|
||||||
|
{
|
||||||
|
int c = getc (fin);
|
||||||
|
char *type_name = NULL;
|
||||||
|
|
||||||
|
/* Get the typename if explicit. */
|
||||||
|
if (c == '<')
|
||||||
|
{
|
||||||
|
char *cp = token_buffer;
|
||||||
|
|
||||||
|
while ((c = getc (fin)) != '>' && c > 0)
|
||||||
|
{
|
||||||
|
if (cp == token_buffer + maxtoken)
|
||||||
|
cp = grow_token_buffer (cp);
|
||||||
|
|
||||||
|
*cp++ = c;
|
||||||
|
}
|
||||||
|
*cp = 0;
|
||||||
|
type_name = token_buffer;
|
||||||
|
value_components_used = 1;
|
||||||
|
|
||||||
|
c = getc (fin);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == '$')
|
||||||
|
{
|
||||||
|
fprintf (fout, "yyval");
|
||||||
|
if (!type_name)
|
||||||
|
type_name = get_type_name (0, rule);
|
||||||
|
if (type_name)
|
||||||
|
fprintf (fout, ".%s", type_name);
|
||||||
|
if (!type_name && typed)
|
||||||
|
complain (_("$$ of `%s' has no declared type"),
|
||||||
|
rule->sym->tag);
|
||||||
|
}
|
||||||
|
else if (isdigit (c) || c == '-')
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
ungetc (c, fin);
|
||||||
|
n = read_signed_integer (fin);
|
||||||
|
|
||||||
|
if (!type_name && n > 0)
|
||||||
|
type_name = get_type_name (n, rule);
|
||||||
|
|
||||||
|
fprintf (fout, "yyvsp[%d]", n - stack_offset);
|
||||||
|
if (type_name)
|
||||||
|
fprintf (fout, ".%s", type_name);
|
||||||
|
if (!type_name && typed)
|
||||||
|
complain (_("$%d of `%s' has no declared type"),
|
||||||
|
n, rule->sym->tag);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char buf[] = "$c";
|
||||||
|
buf[1] = c;
|
||||||
|
complain (_("%s is invalid"), quote (buf));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------------------------.
|
/*-------------------------------------------------------------------.
|
||||||
| Copy the contents of a `%{ ... %}' into the definitions file. The |
|
| Copy the contents of a `%{ ... %}' into the definitions file. The |
|
||||||
@@ -448,43 +554,6 @@ parse_start_decl (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------.
|
|
||||||
| Get the data type (alternative in the union) of the value for |
|
|
||||||
| symbol n in rule rule. |
|
|
||||||
`--------------------------------------------------------------*/
|
|
||||||
|
|
||||||
static char *
|
|
||||||
get_type_name (int n, symbol_list * rule)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
symbol_list *rp;
|
|
||||||
|
|
||||||
if (n < 0)
|
|
||||||
{
|
|
||||||
complain (_("invalid $ value"));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
rp = rule;
|
|
||||||
i = 0;
|
|
||||||
|
|
||||||
while (i < n)
|
|
||||||
{
|
|
||||||
rp = rp->next;
|
|
||||||
if (rp == NULL || rp->sym == NULL)
|
|
||||||
{
|
|
||||||
complain (_("invalid $ value"));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rp->sym->type_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------.
|
/*-----------------------------------------------------------.
|
||||||
| read in a %type declaration and record its information for |
|
| read in a %type declaration and record its information for |
|
||||||
| get_type_name to access |
|
| get_type_name to access |
|
||||||
@@ -724,7 +793,7 @@ parse_expect_decl (void)
|
|||||||
ungetc (c, finput);
|
ungetc (c, finput);
|
||||||
|
|
||||||
if (count <= 0 || count > 10)
|
if (count <= 0 || count > 10)
|
||||||
complain ("%s", _("argument of %expect is not an integer"));
|
complain (_("argument of %%expect is not an integer"));
|
||||||
expected_conflicts = atoi (buffer);
|
expected_conflicts = atoi (buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -805,7 +874,8 @@ parse_thong_decl (void)
|
|||||||
symval->alias = symbol;
|
symval->alias = symbol;
|
||||||
symbol->alias = symval;
|
symbol->alias = symval;
|
||||||
|
|
||||||
nsyms--; /* symbol and symval combined are only one symbol */
|
/* symbol and symval combined are only one symbol. */
|
||||||
|
nsyms--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -917,12 +987,10 @@ read_declarations (void)
|
|||||||
`-------------------------------------------------------------------*/
|
`-------------------------------------------------------------------*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
copy_action (symbol_list * rule, int stack_offset)
|
copy_action (symbol_list *rule, int stack_offset)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
int n;
|
|
||||||
int count;
|
int count;
|
||||||
char *type_name;
|
|
||||||
|
|
||||||
/* offset is always 0 if parser has already popped the stack pointer */
|
/* offset is always 0 if parser has already popped the stack pointer */
|
||||||
if (semantic_parser)
|
if (semantic_parser)
|
||||||
@@ -966,61 +1034,7 @@ copy_action (symbol_list * rule, int stack_offset)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case '$':
|
case '$':
|
||||||
c = getc (finput);
|
copy_dollar (finput, faction, rule, stack_offset);
|
||||||
type_name = NULL;
|
|
||||||
|
|
||||||
if (c == '<')
|
|
||||||
{
|
|
||||||
char *cp = token_buffer;
|
|
||||||
|
|
||||||
while ((c = getc (finput)) != '>' && c > 0)
|
|
||||||
{
|
|
||||||
if (cp == token_buffer + maxtoken)
|
|
||||||
cp = grow_token_buffer (cp);
|
|
||||||
|
|
||||||
*cp++ = c;
|
|
||||||
}
|
|
||||||
*cp = 0;
|
|
||||||
type_name = token_buffer;
|
|
||||||
value_components_used = 1;
|
|
||||||
|
|
||||||
c = getc (finput);
|
|
||||||
}
|
|
||||||
if (c == '$')
|
|
||||||
{
|
|
||||||
fprintf (faction, "yyval");
|
|
||||||
if (!type_name)
|
|
||||||
type_name = get_type_name (0, rule);
|
|
||||||
if (type_name)
|
|
||||||
fprintf (faction, ".%s", type_name);
|
|
||||||
if (!type_name && typed)
|
|
||||||
complain (_("$$ of `%s' has no declared type"),
|
|
||||||
rule->sym->tag);
|
|
||||||
}
|
|
||||||
else if (isdigit (c) || c == '-')
|
|
||||||
{
|
|
||||||
ungetc (c, finput);
|
|
||||||
n = read_signed_integer (finput);
|
|
||||||
c = getc (finput);
|
|
||||||
|
|
||||||
if (!type_name && n > 0)
|
|
||||||
type_name = get_type_name (n, rule);
|
|
||||||
|
|
||||||
fprintf (faction, "yyvsp[%d]", n - stack_offset);
|
|
||||||
if (type_name)
|
|
||||||
fprintf (faction, ".%s", type_name);
|
|
||||||
if (!type_name && typed)
|
|
||||||
complain (_("$%d of `%s' has no declared type"),
|
|
||||||
n, rule->sym->tag);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char buf[] = "$c";
|
|
||||||
buf[1] = c;
|
|
||||||
complain (_("%s is invalid"), quote (buf));
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '@':
|
case '@':
|
||||||
@@ -1059,12 +1073,10 @@ copy_action (symbol_list * rule, int stack_offset)
|
|||||||
`-------------------------------------------------------------------*/
|
`-------------------------------------------------------------------*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
copy_guard (symbol_list * rule, int stack_offset)
|
copy_guard (symbol_list *rule, int stack_offset)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
int n;
|
|
||||||
int count;
|
int count;
|
||||||
char *type_name;
|
|
||||||
int brace_flag = 0;
|
int brace_flag = 0;
|
||||||
|
|
||||||
/* offset is always 0 if parser has already popped the stack pointer */
|
/* offset is always 0 if parser has already popped the stack pointer */
|
||||||
@@ -1119,60 +1131,7 @@ copy_guard (symbol_list * rule, int stack_offset)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case '$':
|
case '$':
|
||||||
c = getc (finput);
|
copy_dollar (finput, fguard, rule, stack_offset);
|
||||||
type_name = NULL;
|
|
||||||
|
|
||||||
if (c == '<')
|
|
||||||
{
|
|
||||||
char *cp = token_buffer;
|
|
||||||
|
|
||||||
while ((c = getc (finput)) != '>' && c > 0)
|
|
||||||
{
|
|
||||||
if (cp == token_buffer + maxtoken)
|
|
||||||
cp = grow_token_buffer (cp);
|
|
||||||
|
|
||||||
*cp++ = c;
|
|
||||||
}
|
|
||||||
*cp = 0;
|
|
||||||
type_name = token_buffer;
|
|
||||||
|
|
||||||
c = getc (finput);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c == '$')
|
|
||||||
{
|
|
||||||
fprintf (fguard, "yyval");
|
|
||||||
if (!type_name)
|
|
||||||
type_name = rule->sym->type_name;
|
|
||||||
if (type_name)
|
|
||||||
fprintf (fguard, ".%s", type_name);
|
|
||||||
if (!type_name && typed)
|
|
||||||
complain (_("$$ of `%s' has no declared type"),
|
|
||||||
rule->sym->tag);
|
|
||||||
}
|
|
||||||
else if (isdigit (c) || c == '-')
|
|
||||||
{
|
|
||||||
ungetc (c, finput);
|
|
||||||
n = read_signed_integer (finput);
|
|
||||||
c = getc (finput);
|
|
||||||
|
|
||||||
if (!type_name && n > 0)
|
|
||||||
type_name = get_type_name (n, rule);
|
|
||||||
|
|
||||||
fprintf (fguard, "yyvsp[%d]", n - stack_offset);
|
|
||||||
if (type_name)
|
|
||||||
fprintf (fguard, ".%s", type_name);
|
|
||||||
if (!type_name && typed)
|
|
||||||
complain (_("$%d of `%s' has no declared type"),
|
|
||||||
n, rule->sym->tag);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char buf[] = "$c";
|
|
||||||
buf[1] = c;
|
|
||||||
complain (_("%s is invalid"), quote (buf));
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '@':
|
case '@':
|
||||||
|
|||||||
Reference in New Issue
Block a user