mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-16 15:53:03 +00:00
java: add support for parse.error=detailed
In Java there is no need for N_ and yytranslate_. So instead of hard-coding the use of N_ in the table of the symbol names, rely on b4_symbol_translate. * src/output.c (prepare_symbol_names): Use b4_symbol_translate instead of N_. * data/skeletons/c.m4 (b4_symbol_translate): New. * data/skeletons/lalr1.java (yysymbolName): New. Use it. * examples/java/calc/Calc.y: Use parse.error=detailed. * tests/calc.at: Check parse.error=detailed.
This commit is contained in:
@@ -470,6 +470,13 @@ m4_define([b4_token_enums_defines],
|
|||||||
[b4_token_enums[]b4_yacc_if([b4_token_defines])])
|
[b4_token_enums[]b4_yacc_if([b4_token_defines])])
|
||||||
|
|
||||||
|
|
||||||
|
# b4_symbol_translate(STRING)
|
||||||
|
# ---------------------------
|
||||||
|
m4_define([b4_symbol_translate],
|
||||||
|
[[N_($1)]])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## ----------------- ##
|
## ----------------- ##
|
||||||
## Semantic Values. ##
|
## Semantic Values. ##
|
||||||
## ----------------- ##
|
## ----------------- ##
|
||||||
|
|||||||
@@ -220,6 +220,13 @@ m4_define([b4_position_type], [b4_percent_define_get([[api.position.type]])])
|
|||||||
## ----------------- ##
|
## ----------------- ##
|
||||||
|
|
||||||
|
|
||||||
|
# b4_symbol_translate(STRING)
|
||||||
|
# ---------------------------
|
||||||
|
m4_define([b4_symbol_translate],
|
||||||
|
[[_($1)]])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# b4_symbol_value(VAL, [SYMBOL-NUM], [TYPE-TAG])
|
# b4_symbol_value(VAL, [SYMBOL-NUM], [TYPE-TAG])
|
||||||
# ----------------------------------------------
|
# ----------------------------------------------
|
||||||
# See README.
|
# See README.
|
||||||
|
|||||||
@@ -488,42 +488,6 @@ m4_define([b4_define_state],[[
|
|||||||
return YYNEWSTATE;
|
return YYNEWSTATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
]b4_error_verbose_if([[
|
|
||||||
/* Return YYSTR after stripping away unnecessary quotes and
|
|
||||||
backslashes, so that it's suitable for yyerror. The heuristic is
|
|
||||||
that double-quoting is unnecessary unless the string contains an
|
|
||||||
apostrophe, a comma, or backslash (other than backslash-backslash).
|
|
||||||
YYSTR is taken from yytname. */
|
|
||||||
private final String yytnamerr_ (String yystr)
|
|
||||||
{
|
|
||||||
if (yystr.charAt (0) == '"')
|
|
||||||
{
|
|
||||||
StringBuffer yyr = new StringBuffer ();
|
|
||||||
strip_quotes: for (int i = 1; i < yystr.length (); i++)
|
|
||||||
switch (yystr.charAt (i))
|
|
||||||
{
|
|
||||||
case '\'':
|
|
||||||
case ',':
|
|
||||||
break strip_quotes;
|
|
||||||
|
|
||||||
case '\\':
|
|
||||||
if (yystr.charAt(++i) != '\\')
|
|
||||||
break strip_quotes;
|
|
||||||
/* Fall through. */
|
|
||||||
default:
|
|
||||||
yyr.append (yystr.charAt (i));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '"':
|
|
||||||
return yyr.toString ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (yystr.equals ("$end"))
|
|
||||||
return "end of input";
|
|
||||||
|
|
||||||
return yystr;
|
|
||||||
}
|
|
||||||
]])[
|
|
||||||
]b4_parse_trace_if([[
|
]b4_parse_trace_if([[
|
||||||
/*--------------------------------.
|
/*--------------------------------.
|
||||||
| Print this symbol on YYOUTPUT. |
|
| Print this symbol on YYOUTPUT. |
|
||||||
@@ -534,7 +498,7 @@ m4_define([b4_define_state],[[
|
|||||||
b4_locations_if([, Object yylocationp])[)
|
b4_locations_if([, Object yylocationp])[)
|
||||||
{
|
{
|
||||||
yycdebug (s + (yytype < yyntokens_ ? " token " : " nterm ")
|
yycdebug (s + (yytype < yyntokens_ ? " token " : " nterm ")
|
||||||
+ yytname_[yytype] + " ("]b4_locations_if([
|
+ yysymbolName (yytype) + " ("]b4_locations_if([
|
||||||
+ yylocationp + ": "])[
|
+ yylocationp + ": "])[
|
||||||
+ (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")");
|
+ (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")");
|
||||||
}]])[
|
}]])[
|
||||||
@@ -924,7 +888,7 @@ b4_dollar_popdef[]dnl
|
|||||||
with internationalization. */
|
with internationalization. */
|
||||||
StringBuffer res =
|
StringBuffer res =
|
||||||
new StringBuffer ("syntax error, unexpected ");
|
new StringBuffer ("syntax error, unexpected ");
|
||||||
res.append (yytnamerr_ (yytname_[tok]));
|
res.append (yysymbolName (tok));
|
||||||
int yyn = yypact_[yystate];
|
int yyn = yypact_[yystate];
|
||||||
if (!yyPactValueIsDefault (yyn))
|
if (!yyPactValueIsDefault (yyn))
|
||||||
{
|
{
|
||||||
@@ -949,7 +913,7 @@ b4_dollar_popdef[]dnl
|
|||||||
&& !yyTableValueIsError (yytable_[x + yyn]))
|
&& !yyTableValueIsError (yytable_[x + yyn]))
|
||||||
{
|
{
|
||||||
res.append (count++ == 0 ? ", expecting " : " or ");
|
res.append (count++ == 0 ? ", expecting " : " or ");
|
||||||
res.append (yytnamerr_ (yytname_[x]));
|
res.append (yysymbolName (x));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -984,10 +948,64 @@ b4_dollar_popdef[]dnl
|
|||||||
|
|
||||||
]b4_parser_tables_define[
|
]b4_parser_tables_define[
|
||||||
|
|
||||||
|
]m4_bmatch(b4_percent_define_get([[parse.error]]),
|
||||||
|
[simple\|verbose],
|
||||||
|
[[ /* Return YYSTR after stripping away unnecessary quotes and
|
||||||
|
backslashes, so that it's suitable for yyerror. The heuristic is
|
||||||
|
that double-quoting is unnecessary unless the string contains an
|
||||||
|
apostrophe, a comma, or backslash (other than backslash-backslash).
|
||||||
|
YYSTR is taken from yytname. */
|
||||||
|
private static String yytnamerr_ (String yystr)
|
||||||
|
{
|
||||||
|
if (yystr.charAt (0) == '"')
|
||||||
|
{
|
||||||
|
StringBuffer yyr = new StringBuffer ();
|
||||||
|
strip_quotes: for (int i = 1; i < yystr.length (); i++)
|
||||||
|
switch (yystr.charAt (i))
|
||||||
|
{
|
||||||
|
case '\'':
|
||||||
|
case ',':
|
||||||
|
break strip_quotes;
|
||||||
|
|
||||||
|
case '\\':
|
||||||
|
if (yystr.charAt(++i) != '\\')
|
||||||
|
break strip_quotes;
|
||||||
|
/* Fall through. */
|
||||||
|
default:
|
||||||
|
yyr.append (yystr.charAt (i));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '"':
|
||||||
|
return yyr.toString ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (yystr.equals ("$end"))
|
||||||
|
return "end of input";
|
||||||
|
|
||||||
|
return yystr;
|
||||||
|
}
|
||||||
|
|
||||||
/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
|
/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
|
||||||
First, the terminals, then, starting at \a yyntokens_, nonterminals. */
|
First, the terminals, then, starting at \a yyntokens_, nonterminals. */
|
||||||
]b4_typed_parser_table_define([String], [tname], [b4_tname])[
|
]b4_typed_parser_table_define([String], [tname], [b4_tname])[
|
||||||
|
|
||||||
|
static String yysymbolName (int yysymbol)
|
||||||
|
{
|
||||||
|
return yytnamerr_ (yytname_[yysymbol]);
|
||||||
|
}
|
||||||
|
]],
|
||||||
|
[custom\|detailed],
|
||||||
|
[[/* The user-facing name of the symbol whose (internal) number is
|
||||||
|
YYSYMBOL. No bounds checking. */
|
||||||
|
static String yysymbolName (int yysymbol)
|
||||||
|
{
|
||||||
|
String[] yy_sname =
|
||||||
|
{
|
||||||
|
]b4_symbol_names[
|
||||||
|
};
|
||||||
|
return yy_sname[yysymbol];
|
||||||
|
}]])[
|
||||||
|
|
||||||
]b4_parse_trace_if([[
|
]b4_parse_trace_if([[
|
||||||
]b4_integral_parser_table_define([rline], [b4_rline],
|
]b4_integral_parser_table_define([rline], [b4_rline],
|
||||||
[[YYRLINE[YYN] -- Source line where rule number YYN was defined.]])[
|
[[YYRLINE[YYN] -- Source line where rule number YYN was defined.]])[
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
%define api.parser.class {Calc}
|
%define api.parser.class {Calc}
|
||||||
%define api.parser.public
|
%define api.parser.public
|
||||||
|
|
||||||
%define parse.error verbose
|
%define parse.error detailed
|
||||||
%define parse.trace
|
%define parse.trace
|
||||||
|
|
||||||
%locations
|
%locations
|
||||||
|
|||||||
@@ -200,8 +200,8 @@ prepare_symbol_names (char const *muscle_name)
|
|||||||
set_quoting_flags (qo, QA_SPLIT_TRIGRAPHS);
|
set_quoting_flags (qo, QA_SPLIT_TRIGRAPHS);
|
||||||
for (int i = 0; i < nsyms; i++)
|
for (int i = 0; i < nsyms; i++)
|
||||||
{
|
{
|
||||||
char *cp =
|
char *cp
|
||||||
symbols[i]->tag[0] == '"' && !quote
|
= symbols[i]->tag[0] == '"' && !quote
|
||||||
? xescape_trigraphs (symbols[i]->tag)
|
? xescape_trigraphs (symbols[i]->tag)
|
||||||
: quotearg_alloc (symbols[i]->tag, -1, qo);
|
: quotearg_alloc (symbols[i]->tag, -1, qo);
|
||||||
/* Width of the next token, including the two quotes, the
|
/* Width of the next token, including the two quotes, the
|
||||||
@@ -219,10 +219,10 @@ prepare_symbol_names (char const *muscle_name)
|
|||||||
if (i)
|
if (i)
|
||||||
obstack_1grow (&format_obstack, ' ');
|
obstack_1grow (&format_obstack, ' ');
|
||||||
if (!quote && symbols[i]->translatable)
|
if (!quote && symbols[i]->translatable)
|
||||||
obstack_sgrow (&format_obstack, "N_(");
|
obstack_sgrow (&format_obstack, "]b4_symbol_translate([");
|
||||||
obstack_escape (&format_obstack, cp);
|
obstack_escape (&format_obstack, cp);
|
||||||
if (!quote && symbols[i]->translatable)
|
if (!quote && symbols[i]->translatable)
|
||||||
obstack_1grow (&format_obstack, ')');
|
obstack_sgrow (&format_obstack, "])[");
|
||||||
free (cp);
|
free (cp);
|
||||||
obstack_1grow (&format_obstack, ',');
|
obstack_1grow (&format_obstack, ',');
|
||||||
j += width;
|
j += width;
|
||||||
|
|||||||
@@ -509,7 +509,6 @@ void location_print (FILE *o, Span s);
|
|||||||
const char *
|
const char *
|
||||||
_ (const char *cp)
|
_ (const char *cp)
|
||||||
{
|
{
|
||||||
/* Make sure only "end of input" is translated. */
|
|
||||||
if (strcmp (cp, "end of input") == 0)
|
if (strcmp (cp, "end of input") == 0)
|
||||||
return "end of file";
|
return "end of file";
|
||||||
else if (strcmp (cp, "number") == 0)
|
else if (strcmp (cp, "number") == 0)
|
||||||
@@ -649,10 +648,23 @@ m4_define([_AT_DATA_CALC_Y(java)],
|
|||||||
}
|
}
|
||||||
|
|
||||||
%code {
|
%code {
|
||||||
]AT_CALC_MAIN[
|
]AT_CALC_MAIN[
|
||||||
|
|
||||||
|
]AT_TOKEN_TRANSLATE_IF([[
|
||||||
|
static String _ (String s)
|
||||||
|
{
|
||||||
|
if (s.equals ("end of input"))
|
||||||
|
return "end of file";
|
||||||
|
else if (s.equals ("number"))
|
||||||
|
return "nombre";
|
||||||
|
else
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
]])[
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Bison Declarations */
|
/* Bison Declarations */
|
||||||
|
%token CALC_EOF 0 ]AT_TOKEN_TRANSLATE_IF([_("end of input")], ["end of input"])[
|
||||||
%token <Integer> NUM "number"
|
%token <Integer> NUM "number"
|
||||||
%type <Integer> exp
|
%type <Integer> exp
|
||||||
|
|
||||||
@@ -1173,6 +1185,7 @@ m4_define([AT_CHECK_CALC_LALR1_JAVA],
|
|||||||
[AT_CHECK_CALC([%language "Java" $1], [$2])])
|
[AT_CHECK_CALC([%language "Java" $1], [$2])])
|
||||||
|
|
||||||
AT_CHECK_CALC_LALR1_JAVA
|
AT_CHECK_CALC_LALR1_JAVA
|
||||||
|
AT_CHECK_CALC_LALR1_JAVA([%define parse.error detailed])
|
||||||
AT_CHECK_CALC_LALR1_JAVA([%define parse.error verbose])
|
AT_CHECK_CALC_LALR1_JAVA([%define parse.error verbose])
|
||||||
AT_CHECK_CALC_LALR1_JAVA([%locations %define parse.error verbose])
|
AT_CHECK_CALC_LALR1_JAVA([%locations %define parse.error verbose])
|
||||||
AT_CHECK_CALC_LALR1_JAVA([%define parse.trace %define parse.error verbose])
|
AT_CHECK_CALC_LALR1_JAVA([%define parse.trace %define parse.error verbose])
|
||||||
|
|||||||
Reference in New Issue
Block a user