"m4 - m4 traces",
"skeleton - skeleton postprocessing",
"time - time consumption",
+ "ielr - IELR conversion",
"all - all of the above",
0
};
trace_m4,
trace_skeleton,
trace_time,
+ trace_ielr,
trace_all
};
printf (_("Usage: %s [OPTION]... FILE\n"), program_name);
fputs (_("\
-Generate LALR(1) and GLR parsers.\n\
+Generate a deterministic or GLR parser employing LALR(1), IELR(1), or\n\
+canonical LR(1) parser tables.\n\
\n\
"), stdout);
fputs (_("\
Parser:\n\
- -L, --language=LANGUAGE specify the output programming language\n\
- (this is an experimental feature)\n\
- -S, --skeleton=FILE specify the skeleton to use\n\
- -t, --debug instrument the parser for tracing\n\
- same as `-Dparse.trace'\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\
+ -L, --language=LANGUAGE specify the output programming language\n\
+ (this is an experimental feature)\n\
+ -S, --skeleton=FILE specify the skeleton to use\n\
+ -t, --debug instrument the parser for tracing\n\
+ same as `-Dparse.trace'\n\
+ --locations enable location support\n\
+ -D, --define=NAME[=VALUE] similar to `%define NAME \"VALUE\"'\n\
+ -F, --force-define=NAME[=VALUE] override `%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\
\n\
"), stdout);
skeleton = arg;
}
else if (prio == skeleton_prio)
- {
- char const *msg =
- _("multiple skeleton declarations are invalid");
- complain_at (loc, msg);
- }
+ complain_at (loc, _("multiple skeleton declarations are invalid"));
}
void
Should be computed from long_options. */
static char const short_options[] =
"D:"
+ "F:"
"L:"
"S:"
"T::"
/* Parser. */
{ "debug", no_argument, 0, 't' },
{ "define", required_argument, 0, 'D' },
+ { "force-define", required_argument, 0, 'F' },
{ "locations", no_argument, 0, LOCATIONS_OPTION },
{ "no-lines", no_argument, 0, 'l' },
{ "raw", no_argument, 0, 0 },
break;
case 'D': /* -DNAME[=VALUE]. */
+ case 'F': /* -FNAME[=VALUE]. */
{
char* name = optarg;
char* value = strchr (optarg, '=');
if (value)
*value++ = 0;
muscle_percent_define_insert (name, command_line_location (),
- value ? value : "");
+ value ? value : "",
+ c == 'D' ? MUSCLE_PERCENT_DEFINE_D
+ : MUSCLE_PERCENT_DEFINE_F);
}
break;
case 't':
muscle_percent_define_insert ("parse.trace",
- command_line_location (), "");
+ command_line_location (), "",
+ MUSCLE_PERCENT_DEFINE_D);
break;
case 'v':
current_file = grammar_file = uniqstr_new (argv[optind]);
MUSCLE_INSERT_C_STRING ("file_name", grammar_file);
}
+
+void
+tr (char *s, char from, char to)
+{
+ for (; *s; s++)
+ if (*s == from)
+ *s = to;
+}