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:
Akim Demaille
2006-07-13 08:12:00 +00:00
parent db7e5eb5ef
commit 2ce4ed68c9
7 changed files with 488 additions and 461 deletions

View File

@@ -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_)'

File diff suppressed because it is too large Load Diff

View File

@@ -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 */

View File

@@ -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)
{ {

View File

@@ -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_ */

View File

@@ -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);

View File

@@ -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"