+2008-11-07 Akim Demaille <demaille@gostai.com>
+
+ -D, --define.
+ * src/getargs.c (usage): Document -D.
+ Fix help string for --locations.
+ (command_line_location): New.
+ (short_options, long_options, getargs): Support -D, --define.
+ (getargs): Move -d support at the right place.
+ * doc/bison.texinfo (Bison Options): Update.
+ * tests/input.at (%define, --define): New.
+
2008-11-07 Akim Demaille <demaille@gostai.com>
Initialize the muscle table before parsing the command line.
already defined, so that the debugging facilities are compiled.
@xref{Tracing, ,Tracing Your Parser}.
+@item -D @var{name}[=@var{value}]
+@itemx --define=@var{name}[=@var{value}]
+Same as running @samp{%define @var{name} "@var{value}"} (@pxref{Decl
+Summary, ,%define}).
+
@item -L @var{language}
@itemx --language=@var{language}
Specify the programming language for the generated parser, as if
(this is an experimental feature)\n\
-S, --skeleton=FILE specify the skeleton to use\n\
-t, --debug instrument the parser for debugging\n\
- --locations enable locations computation\n\
+ --locations enable location support\n\
+ -D, --define=NAME[=VALUE] same as `%define NAME \"VALUE\"'\n\
-p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\
-l, --no-lines don't generate `#line' directives\n\
-k, --token-table include a table of token names\n\
/* Shorts options.
Should be computed from long_options. */
static char const short_options[] =
+ "D:"
"L:"
"S:"
"T::"
/* Parser. */
{ "debug", no_argument, 0, 't' },
+ { "define", required_argument, 0, 'D' },
{ "locations", no_argument, 0, LOCATIONS_OPTION },
{ "no-lines", no_argument, 0, 'l' },
{ "raw", no_argument, 0, 0 },
# define AS_FILE_NAME(File) (File)
#endif
+/* Build a location for the current command line argument. */
+static
+location
+command_line_location()
+{
+ location res;
+ /* "<command line>" is used in GCC's messages about -D. */
+ boundary_set (&res.start, uniqstr_new ("<command line>"), optind, -1);
+ res.end = res.start;
+ return res;
+}
+
+
void
getargs (int argc, char *argv[])
{
!= -1)
switch (c)
{
+ /* ASCII Sorting for short options (i.e., upper case then
+ lower case), and then long-only options. */
+
case 0:
/* Certain long options cause getopt_long to return 0. */
break;
- case 'd':
- /* Here, the -d and --defines options are differentiated. */
- defines_flag = true;
- if (optarg)
- spec_defines_file = xstrdup (AS_FILE_NAME (optarg));
+ case 'D': /* -DNAME[=VALUE]. */
+ {
+ char* name = optarg;
+ char* value = strchr (optarg, '=');
+ if (value)
+ *value++ = 0;
+ else
+ value = "";
+ muscle_percent_define_insert (name, command_line_location (), value);
+ }
break;
case 'I':
spec_file_prefix = AS_FILE_NAME (optarg);
break;
+ case 'd':
+ /* Here, the -d and --defines options are differentiated. */
+ defines_flag = true;
+ if (optarg)
+ spec_defines_file = xstrdup (AS_FILE_NAME (optarg));
+ break;
+
case 'g':
graph_flag = true;
if (optarg)
# Checking the Bison scanner. -*- Autotest -*-
-# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation,
+# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation,
# Inc.
# This program is free software: you can redistribute it and/or modify
AT_CLEANUP
+
+## ------------------- ##
+## %define, --define. ##
+## ------------------- ##
+
+AT_SETUP([%define, --define])
+
+AT_DATA([input.y],
+[[%define var "value1"
+%%
+start: ;
+]])
+
+AT_BISON_CHECK([[input.y -DFOO -DFOO -Dvar=value]], [0], [],
+[[<command line>:4: warning: %define variable `FOO' redefined
+<command line>:3: warning: previous definition
+input.y:1.9-11: warning: %define variable `var' redefined
+<command line>:5: warning: previous definition
+<command line>:3: warning: %define variable `FOO' is not used
+<command line>:4: warning: %define variable `FOO' is not used
+<command line>:5: warning: %define variable `var' is not used
+input.y:1.9-11: warning: %define variable `var' is not used
+]])
+
+AT_CLEANUP
+
## --------------------------- ##
## %define Boolean variables. ##
## --------------------------- ##