X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/fc01665ea5901b1d426ab3637a26dff9a8ff87e4..fb9c0b3360928887038a296c338025ced68e2d8c:/src/parse-gram.y?ds=sidebyside diff --git a/src/parse-gram.y b/src/parse-gram.y index db15562d..027a773d 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -32,6 +32,7 @@ #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); @@ -39,6 +40,8 @@ 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 @@ -133,6 +136,7 @@ static int current_prec = 0; 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" @@ -177,7 +181,7 @@ static int current_prec = 0; %type INT %printer { fprintf (stderr, "%d", $$); } INT %type ID symbol string_as_id -%printer { fprintf (stderr, "%s", $$->tag); } ID symbol string_as_id +%printer { fputs ($$->tag, stderr); } ID symbol string_as_id %type ID_COLON %printer { fprintf (stderr, "%s:", $$->tag); } ID_COLON %type precedence_declarator @@ -202,6 +206,7 @@ declaration: 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; } @@ -225,6 +230,7 @@ declaration: | "%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; } @@ -529,6 +535,14 @@ add_param (char const *type, char *decl, location loc) scanner_last_string_free (); } +static void +version_check (location const *loc, char const *version) +{ + if (strverscmp (version, PACKAGE_VERSION) > 0) + complain_at (*loc, "require bison %s, but have %s", + version, PACKAGE_VERSION); +} + static void gram_error (location const *loc, char const *msg) {