%{/* Bison Grammar Parser -*- C -*-
- Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA
*/
#include "system.h"
#include "gram.h"
#include "muscle_tab.h"
#include "output.h"
+#include "quotearg.h"
#include "reader.h"
#include "symlist.h"
+#include "strverscmp.h"
#define YYLLOC_DEFAULT(Current, Rhs, N) (Current) = lloc_default (Rhs, N)
static YYLTYPE lloc_default (YYLTYPE const *, int);
#define YY_LOCATION_PRINT(File, Loc) \
location_print (File, Loc)
+static void version_check (location const *loc, char const *version);
+
/* Request detailed syntax error messages, and pass them to GRAM_ERROR.
FIXME: depends on the undocumented availability of YYLLOC. */
#undef yyerror
gram_error (&yylloc, Msg)
static void gram_error (location const *, char const *);
-#define YYPRINT(File, Type, Value) \
- print_token_value (File, Type, &Value)
-static void print_token_value (FILE *, int, YYSTYPE const *);
-
static void add_param (char const *, char *, location);
-symbol_class current_class = unknown_sym;
-uniqstr current_type = 0;
+static symbol_class current_class = unknown_sym;
+static uniqstr current_type = 0;
symbol *current_lhs;
location current_lhs_location;
assoc current_assoc;
-int current_prec = 0;
+static int current_prec = 0;
%}
%debug
+%verbose
%defines
%locations
%pure-parser
PERCENT_OUTPUT "%output"
PERCENT_PARSE_PARAM "%parse-param {...}"
PERCENT_PURE_PARSER "%pure-parser"
+ PERCENT_REQUIRE "%require"
PERCENT_SKELETON "%skeleton"
PERCENT_START "%start"
PERCENT_TOKEN_TABLE "%token-table"
"%union {...}"
BRACED_CODE action
PROLOGUE EPILOGUE
+%printer { fprintf (stderr, "\"%s\"", $$); }
+ STRING string_content
+%printer { fprintf (stderr, "{\n%s\n}", $$); }
+ "%destructor {...}"
+ "%initial-action {...}"
+ "%lex-param {...}"
+ "%parse-param {...}"
+ "%printer {...}"
+ "%union {...}"
+ BRACED_CODE action
+ PROLOGUE EPILOGUE
%type <uniqstr> TYPE
+%printer { fprintf (stderr, "<%s>", $$); } TYPE
%type <integer> INT
-%type <symbol> ID ID_COLON symbol string_as_id
+%printer { fprintf (stderr, "%d", $$); } INT
+%type <symbol> ID symbol string_as_id
+%printer { fputs ($$->tag, stderr); } ID symbol string_as_id
+%type <symbol> ID_COLON
+%printer { fprintf (stderr, "%s:", $$->tag); } ID_COLON
%type <assoc> precedence_declarator
%type <list> symbols.1
%%
grammar_declaration
| PROLOGUE { prologue_augment ($1, @1); }
| "%debug" { debug_flag = true; }
+| "%define" string_content { muscle_insert ($2, "1"); }
| "%define" string_content string_content { muscle_insert ($2, $3); }
| "%defines" { defines_flag = true; }
| "%error-verbose" { error_verbose = true; }
| "%expect" INT { expected_sr_conflicts = $2; }
-| "%expect-rr" INT { expected_rr_conflicts = $2; }
+| "%expect-rr" INT { expected_rr_conflicts = $2; }
| "%file-prefix" "=" string_content { spec_file_prefix = $3; }
| "%glr-parser"
{
| "%locations" { locations_flag = true; }
| "%name-prefix" "=" string_content { spec_name_prefix = $3; }
| "%no-lines" { no_lines_flag = true; }
-| "%nondeterministic-parser" { nondeterministic_parser = true; }
+| "%nondeterministic-parser" { nondeterministic_parser = true; }
| "%output" "=" string_content { spec_outfile = $3; }
| "%parse-param {...}" { add_param ("parse_param", $1, @1); }
| "%pure-parser" { pure_parser = true; }
+| "%require" string_content { version_check (&@2, $2); }
| "%skeleton" string_content { skeleton = $2; }
| "%token-table" { token_table_flag = true; }
| "%verbose" { report_flag = report_states; }
action:
BRACED_CODE
- { $$ = $1; }
+ { $$ = $1; }
;
-/* A string used as an ID: we have to keep the quotes. */
+/* A string used as an ID: quote it. */
string_as_id:
STRING
{
- $$ = symbol_get ($1, @1);
+ $$ = symbol_get (quotearg_style (c_quoting_style, $1), @1);
symbol_class_set ($$, token_sym, @1);
}
;
-/* A string used for its contents. Strip the quotes. */
+/* A string used for its contents. Don't quote it. */
string_content:
STRING
- {
- $$ = $1 + 1;
- $$[strlen ($$) - 1] = '\0';
- };
+ { $$ = $1; }
+;
epilogue.opt:
scanner_last_string_free ();
}
-/*----------------------------------------------------.
-| When debugging the parser, display tokens' values. |
-`----------------------------------------------------*/
-
static void
-print_token_value (FILE *file, int type, YYSTYPE const *value)
+version_check (location const *loc, char const *version)
{
- fputc (' ', file);
- switch (type)
- {
- case ID:
- fprintf (file, " = %s", value->symbol->tag);
- break;
-
- case INT:
- fprintf (file, " = %d", value->integer);
- break;
-
- case STRING:
- fprintf (file, " = \"%s\"", value->chars);
- break;
-
- case TYPE:
- fprintf (file, " = <%s>", value->uniqstr);
- break;
-
- case BRACED_CODE:
- case PERCENT_DESTRUCTOR:
- case PERCENT_LEX_PARAM:
- case PERCENT_PARSE_PARAM:
- case PERCENT_PRINTER:
- case PERCENT_UNION:
- case PROLOGUE:
- case EPILOGUE:
- fprintf (file, " = {{ %s }}", value->chars);
- break;
-
- default:
- fprintf (file, "unknown token type");
- break;
- }
+ if (strverscmp (version, PACKAGE_VERSION) > 0)
+ complain_at (*loc, "require bison %s, but have %s",
+ version, PACKAGE_VERSION);
}
static void
char const *
token_name (int type)
{
- return yytname[type];
+ return yytname[YYTRANSLATE (type)];
}