mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
Support %define "KEY" {VALUE}.
* src/scan-code.h, src/scan-code.l (translate_action) (translate_rule_action, translate_symbol_action, translate_code): Return char *, not const char *. * src/parse-gram.y (declaration): Rename as... (prologue_declaration): this. (string_content): Remove this nonterminal, use STRING. (braceless, content, content.opt): New nonterminal. Use them. (%define): Now accept content.opt, i.e., accept also BRACED_CODE as value. * src/scan-gram.l (getargs.h): Don't include it.
This commit is contained in:
15
ChangeLog
15
ChangeLog
@@ -1,3 +1,18 @@
|
|||||||
|
2006-07-13 Akim Demaille <akim@epita.fr>
|
||||||
|
|
||||||
|
Support %define "KEY" {VALUE}.
|
||||||
|
* src/scan-code.h, src/scan-code.l (translate_action)
|
||||||
|
(translate_rule_action, translate_symbol_action, translate_code):
|
||||||
|
Return char *, not const char *.
|
||||||
|
* src/parse-gram.y (declaration): Rename as...
|
||||||
|
(prologue_declaration): this.
|
||||||
|
(string_content): Remove this nonterminal, use STRING.
|
||||||
|
(braceless, content, content.opt): New nonterminal.
|
||||||
|
Use them.
|
||||||
|
(%define): Now accept content.opt, i.e., accept also BRACED_CODE
|
||||||
|
as value.
|
||||||
|
* src/scan-gram.l (getargs.h): Don't include it.
|
||||||
|
|
||||||
2006-07-12 Paul Eggert <eggert@cs.ucla.edu>
|
2006-07-12 Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
|
||||||
* data/lalr1.cc (YYCDEBUG): Use 'if (yydebug_) (*yycdebug_)'
|
* data/lalr1.cc (YYCDEBUG): Use 'if (yydebug_) (*yycdebug_)'
|
||||||
|
|||||||
770
src/parse-gram.c
770
src/parse-gram.c
File diff suppressed because it is too large
Load Diff
@@ -160,7 +160,7 @@
|
|||||||
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
||||||
typedef union YYSTYPE
|
typedef union YYSTYPE
|
||||||
/* Line 1539 of yacc.c. */
|
/* Line 1539 of yacc.c. */
|
||||||
#line 90 "parse-gram.y"
|
#line 97 "../../src/parse-gram.y"
|
||||||
{
|
{
|
||||||
symbol *symbol;
|
symbol *symbol;
|
||||||
symbol_list *list;
|
symbol_list *list;
|
||||||
@@ -171,7 +171,7 @@ typedef union YYSTYPE
|
|||||||
unsigned char character;
|
unsigned char character;
|
||||||
}
|
}
|
||||||
/* Line 1539 of yacc.c. */
|
/* Line 1539 of yacc.c. */
|
||||||
#line 175 "parse-gram.h"
|
#line 175 "../../src/parse-gram.h"
|
||||||
YYSTYPE;
|
YYSTYPE;
|
||||||
# define YYSTYPE_IS_TRIVIAL 1
|
# define YYSTYPE_IS_TRIVIAL 1
|
||||||
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
||||||
|
|||||||
141
src/parse-gram.y
141
src/parse-gram.y
@@ -54,7 +54,14 @@ static void gram_error (location const *, char const *);
|
|||||||
|
|
||||||
static char const *char_name (char);
|
static char const *char_name (char);
|
||||||
|
|
||||||
static void add_param (char const *, char *, location);
|
/** Add a lex-param or a parse-param.
|
||||||
|
*
|
||||||
|
* \param type \a lex_param or \a parse_param
|
||||||
|
* \param decl the formal argument
|
||||||
|
* \param loc the location in the source.
|
||||||
|
*/
|
||||||
|
static void add_param (char const *type, char *decl, location loc);
|
||||||
|
|
||||||
|
|
||||||
static symbol_class current_class = unknown_sym;
|
static symbol_class current_class = unknown_sym;
|
||||||
static uniqstr current_type = NULL;
|
static uniqstr current_type = NULL;
|
||||||
@@ -170,10 +177,13 @@ static int current_prec = 0;
|
|||||||
%type <character> CHAR
|
%type <character> CHAR
|
||||||
%printer { fputs (char_name ($$), stderr); } CHAR
|
%printer { fputs (char_name ($$), stderr); } CHAR
|
||||||
|
|
||||||
%type <chars> STRING string_content "{...}" PROLOGUE EPILOGUE
|
/* braceless is not to be used for rule or symbol actions, as it
|
||||||
|
calls translate_code. */
|
||||||
|
%type <chars> STRING "{...}" "%{...%}" EPILOGUE braceless content content.opt
|
||||||
%printer { fputs (quotearg_style (c_quoting_style, $$), stderr); }
|
%printer { fputs (quotearg_style (c_quoting_style, $$), stderr); }
|
||||||
STRING string_content
|
STRING
|
||||||
%printer { fprintf (stderr, "{\n%s\n}", $$); } "{...}" PROLOGUE EPILOGUE
|
%printer { fprintf (stderr, "{\n%s\n}", $$); }
|
||||||
|
braceless content content.opt "{...}" "%{...%}" EPILOGUE
|
||||||
|
|
||||||
%type <uniqstr> TYPE ID ID_COLON
|
%type <uniqstr> TYPE ID ID_COLON
|
||||||
%printer { fprintf (stderr, "<%s>", $$); } TYPE
|
%printer { fprintf (stderr, "<%s>", $$); } TYPE
|
||||||
@@ -192,7 +202,7 @@ static int current_prec = 0;
|
|||||||
%%
|
%%
|
||||||
|
|
||||||
input:
|
input:
|
||||||
declarations "%%" grammar epilogue.opt
|
prologue_declarations "%%" grammar epilogue.opt
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
@@ -200,47 +210,24 @@ input:
|
|||||||
| Declarations: before the first %%. |
|
| Declarations: before the first %%. |
|
||||||
`------------------------------------*/
|
`------------------------------------*/
|
||||||
|
|
||||||
declarations:
|
prologue_declarations:
|
||||||
/* Nothing */
|
/* Nothing */
|
||||||
| declarations declaration
|
| prologue_declarations prologue_declaration
|
||||||
;
|
;
|
||||||
|
|
||||||
declaration:
|
prologue_declaration:
|
||||||
grammar_declaration
|
grammar_declaration
|
||||||
| PROLOGUE
|
| "%{...%}" { prologue_augment (translate_code ($1, @1), @1, union_seen); }
|
||||||
{
|
| "%after-header" braceless { prologue_augment ($2, @2, true); }
|
||||||
prologue_augment (translate_code ($1, @1), @1, union_seen);
|
| "%before-header" braceless { prologue_augment ($2, @2, false); }
|
||||||
}
|
| "%debug" { debug_flag = true; }
|
||||||
| "%after-header" "{...}"
|
| "%define" STRING content.opt { muscle_insert ($2, $3); }
|
||||||
{
|
| "%defines" { defines_flag = true; }
|
||||||
/* Remove the '{', and replace the '}' with '\n'. */
|
| "%end-header" braceless { muscle_code_grow ("end_header", $2, @2); }
|
||||||
$2[strlen ($2) - 1] = '\n';
|
| "%error-verbose" { error_verbose = true; }
|
||||||
prologue_augment (translate_code ($2+1, @2), @2, true);
|
| "%expect" INT { expected_sr_conflicts = $2; }
|
||||||
}
|
| "%expect-rr" INT { expected_rr_conflicts = $2; }
|
||||||
| "%before-header" "{...}"
|
| "%file-prefix" "=" STRING { spec_file_prefix = $3; }
|
||||||
{
|
|
||||||
/* Remove the '{', and replace the '}' with '\n'. */
|
|
||||||
$2[strlen ($2) - 1] = '\n';
|
|
||||||
prologue_augment (translate_code ($2+1, @2), @2, false);
|
|
||||||
}
|
|
||||||
| "%debug" { debug_flag = true; }
|
|
||||||
| "%define" string_content
|
|
||||||
{
|
|
||||||
static char one[] = "1";
|
|
||||||
muscle_insert ($2, one);
|
|
||||||
}
|
|
||||||
| "%define" string_content string_content { muscle_insert ($2, $3); }
|
|
||||||
| "%defines" { defines_flag = true; }
|
|
||||||
| "%end-header" "{...}"
|
|
||||||
{
|
|
||||||
/* Remove the '{', and replace the '}' with '\n'. */
|
|
||||||
$2[strlen ($2) - 1] = '\n';
|
|
||||||
muscle_code_grow ("end_header", translate_code ($2+1, @2), @2);
|
|
||||||
}
|
|
||||||
| "%error-verbose" { error_verbose = true; }
|
|
||||||
| "%expect" INT { expected_sr_conflicts = $2; }
|
|
||||||
| "%expect-rr" INT { expected_rr_conflicts = $2; }
|
|
||||||
| "%file-prefix" "=" string_content { spec_file_prefix = $3; }
|
|
||||||
| "%glr-parser"
|
| "%glr-parser"
|
||||||
{
|
{
|
||||||
nondeterministic_parser = true;
|
nondeterministic_parser = true;
|
||||||
@@ -250,25 +237,20 @@ declaration:
|
|||||||
{
|
{
|
||||||
muscle_code_grow ("initial_action", translate_symbol_action ($2, @2), @2);
|
muscle_code_grow ("initial_action", translate_symbol_action ($2, @2), @2);
|
||||||
}
|
}
|
||||||
| "%lex-param" "{...}" { add_param ("lex_param", $2, @2); }
|
| "%lex-param" "{...}" { add_param ("lex_param", $2, @2); }
|
||||||
| "%locations" { locations_flag = true; }
|
| "%locations" { locations_flag = true; }
|
||||||
| "%name-prefix" "=" string_content { spec_name_prefix = $3; }
|
| "%name-prefix" "=" STRING { spec_name_prefix = $3; }
|
||||||
| "%no-lines" { no_lines_flag = true; }
|
| "%no-lines" { no_lines_flag = true; }
|
||||||
| "%nondeterministic-parser" { nondeterministic_parser = true; }
|
| "%nondeterministic-parser" { nondeterministic_parser = true; }
|
||||||
| "%output" "=" string_content { spec_outfile = $3; }
|
| "%output" "=" STRING { spec_outfile = $3; }
|
||||||
| "%parse-param" "{...}" { add_param ("parse_param", $2, @2); }
|
| "%parse-param" "{...}" { add_param ("parse_param", $2, @2); }
|
||||||
| "%pure-parser" { pure_parser = true; }
|
| "%pure-parser" { pure_parser = true; }
|
||||||
| "%require" string_content { version_check (&@2, $2); }
|
| "%require" STRING { version_check (&@2, $2); }
|
||||||
| "%skeleton" string_content { skeleton = $2; }
|
| "%skeleton" STRING { skeleton = $2; }
|
||||||
| "%start-header" "{...}"
|
| "%start-header" braceless { muscle_code_grow ("start_header", $2, @2); }
|
||||||
{
|
| "%token-table" { token_table_flag = true; }
|
||||||
/* Remove the '{', and replace the '}' with '\n'. */
|
| "%verbose" { report_flag = report_states; }
|
||||||
$2[strlen ($2) - 1] = '\n';
|
| "%yacc" { yacc_flag = true; }
|
||||||
muscle_code_grow ("start_header", translate_code ($2+1, @2), @2);
|
|
||||||
}
|
|
||||||
| "%token-table" { token_table_flag = true; }
|
|
||||||
| "%verbose" { report_flag = report_states; }
|
|
||||||
| "%yacc" { yacc_flag = true; }
|
|
||||||
| /*FIXME: Err? What is this horror doing here? */ ";"
|
| /*FIXME: Err? What is this horror doing here? */ ";"
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -478,6 +460,35 @@ rhs:
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------*
|
||||||
|
| content. |
|
||||||
|
*-----------*/
|
||||||
|
|
||||||
|
content:
|
||||||
|
STRING
|
||||||
|
| braceless
|
||||||
|
;
|
||||||
|
|
||||||
|
/* Some content or "1" by default. */
|
||||||
|
content.opt:
|
||||||
|
/* Nothing. */
|
||||||
|
{
|
||||||
|
static char one[] = "1";
|
||||||
|
$$ = one;
|
||||||
|
}
|
||||||
|
| content
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
braceless:
|
||||||
|
"{...}"
|
||||||
|
{
|
||||||
|
$1[strlen ($1) - 1] = '\n';
|
||||||
|
$$ = translate_code ($1 + 1, @1);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
/*---------------*
|
/*---------------*
|
||||||
| Identifiers. |
|
| Identifiers. |
|
||||||
*---------------*/
|
*---------------*/
|
||||||
@@ -515,13 +526,6 @@ string_as_id:
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
/* A string used for its contents. Don't quote it. */
|
|
||||||
string_content:
|
|
||||||
STRING
|
|
||||||
{ $$ = $1; }
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
epilogue.opt:
|
epilogue.opt:
|
||||||
/* Nothing. */
|
/* Nothing. */
|
||||||
| "%%" EPILOGUE
|
| "%%" EPILOGUE
|
||||||
@@ -615,6 +619,7 @@ add_param (char const *type, char *decl, location loc)
|
|||||||
gram_scanner_last_string_free ();
|
gram_scanner_last_string_free ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
version_check (location const *loc, char const *version)
|
version_check (location const *loc, char const *version)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -35,13 +35,13 @@ void code_scanner_free (void);
|
|||||||
|
|
||||||
/* The action of the rule R contains $$, $1 etc. referring to the values
|
/* The action of the rule R contains $$, $1 etc. referring to the values
|
||||||
of the rule R. */
|
of the rule R. */
|
||||||
const char *translate_rule_action (symbol_list *r);
|
char *translate_rule_action (symbol_list *r);
|
||||||
|
|
||||||
/* The action A refers to $$ and @$ only, referring to a symbol. */
|
/* The action A refers to $$ and @$ only, referring to a symbol. */
|
||||||
const char *translate_symbol_action (const char *a, location l);
|
char *translate_symbol_action (const char *a, location l);
|
||||||
|
|
||||||
/* The action contains no special escapes, just protect M4 special
|
/* The action contains no special escapes, just protect M4 special
|
||||||
symbols. */
|
symbols. */
|
||||||
const char *translate_code (const char *a, location l);
|
char *translate_code (const char *a, location l);
|
||||||
|
|
||||||
#endif /* !SCAN_CODE_H_ */
|
#endif /* !SCAN_CODE_H_ */
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
|
|
||||||
/* The current calling start condition: SC_RULE_ACTION or
|
/* The current calling start condition: SC_RULE_ACTION or
|
||||||
SC_SYMBOL_ACTION. */
|
SC_SYMBOL_ACTION. */
|
||||||
# define YY_DECL const char *code_lex (int sc_context, symbol_list *rule)
|
# define YY_DECL char *code_lex (int sc_context, symbol_list *rule)
|
||||||
YY_DECL;
|
YY_DECL;
|
||||||
|
|
||||||
#define YY_USER_ACTION location_compute (loc, &loc->end, yytext, yyleng);
|
#define YY_USER_ACTION location_compute (loc, &loc->end, yytext, yyleng);
|
||||||
@@ -376,10 +376,10 @@ handle_action_at (symbol_list *rule, char *text, location at_loc)
|
|||||||
translation is for \a rule, in the context \a sc_context
|
translation is for \a rule, in the context \a sc_context
|
||||||
(SC_RULE_ACTION, SC_SYMBOL_ACTION, INITIAL). */
|
(SC_RULE_ACTION, SC_SYMBOL_ACTION, INITIAL). */
|
||||||
|
|
||||||
static const char *
|
static char *
|
||||||
translate_action (int sc_context, symbol_list *rule, const char *a, location l)
|
translate_action (int sc_context, symbol_list *rule, const char *a, location l)
|
||||||
{
|
{
|
||||||
const char *res;
|
char *res;
|
||||||
static bool initialized = false;
|
static bool initialized = false;
|
||||||
if (!initialized)
|
if (!initialized)
|
||||||
{
|
{
|
||||||
@@ -398,20 +398,20 @@ translate_action (int sc_context, symbol_list *rule, const char *a, location l)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
char *
|
||||||
translate_rule_action (symbol_list *rule)
|
translate_rule_action (symbol_list *rule)
|
||||||
{
|
{
|
||||||
return translate_action (SC_RULE_ACTION, rule, rule->action,
|
return translate_action (SC_RULE_ACTION, rule, rule->action,
|
||||||
rule->action_location);
|
rule->action_location);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
char *
|
||||||
translate_symbol_action (const char *a, location l)
|
translate_symbol_action (const char *a, location l)
|
||||||
{
|
{
|
||||||
return translate_action (SC_SYMBOL_ACTION, NULL, a, l);
|
return translate_action (SC_SYMBOL_ACTION, NULL, a, l);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
char *
|
||||||
translate_code (const char *a, location l)
|
translate_code (const char *a, location l)
|
||||||
{
|
{
|
||||||
return translate_action (INITIAL, NULL, a, l);
|
return translate_action (INITIAL, NULL, a, l);
|
||||||
|
|||||||
@@ -37,7 +37,6 @@
|
|||||||
|
|
||||||
#include "complain.h"
|
#include "complain.h"
|
||||||
#include "files.h"
|
#include "files.h"
|
||||||
#include "getargs.h" /* yacc_flag */
|
|
||||||
#include "gram.h"
|
#include "gram.h"
|
||||||
#include "quotearg.h"
|
#include "quotearg.h"
|
||||||
#include "reader.h"
|
#include "reader.h"
|
||||||
|
|||||||
Reference in New Issue
Block a user