You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
-%option debug nodefault noinput nounput noyywrap never-interactive
+%option debug nodefault noinput noyywrap never-interactive
%option prefix="gram_" outfile="lex.yy.c"
%{
#include <src/complain.h>
#include <src/files.h>
+#include <src/getargs.h>
#include <src/gram.h>
#include <quotearg.h>
#include <src/reader.h>
yyless (0); \
} while (0)
+#define DEPRECATED(Msg) \
+ do { \
+ size_t i; \
+ complain (loc, Wdeprecated, \
+ _("deprecated directive: %s, use %s"), \
+ quote (yytext), quote_n (1, Msg)); \
+ scanner_cursor.column -= mbsnwidth (Msg, strlen (Msg), 0); \
+ for (i = strlen (Msg); i != 0; --i) \
+ unput (Msg[i - 1]); \
+ } while (0)
+
/* A string representing the most recently saved token. */
static char *last_string;
white space between the backslash and the newline. */
splice (\\[ \f\t\v]*\n)*
+/* An equal sign, with optional leading whitespaces. This is used in some
+ deprecated constructs. */
+eqopt ([[:space:]]*=)?
+
%%
%{
/* Nesting level. Either for nested braces, or nested angle brackets
{
/* Comments and white space. */
"," {
- complain_at (*loc, Wother, _("stray ',' treated as white space"));
+ complain (loc, Wother, _("stray ',' treated as white space"));
}
[ \f\n\t\v] |
"//".* ;
"%binary" return PERCENT_NONASSOC;
"%code" return PERCENT_CODE;
"%debug" RETURN_PERCENT_FLAG("parse.trace");
- "%default"[-_]"prec" return PERCENT_DEFAULT_PREC;
+ "%default-prec" return PERCENT_DEFAULT_PREC;
"%define" return PERCENT_DEFINE;
"%defines" return PERCENT_DEFINES;
"%destructor" return PERCENT_DESTRUCTOR;
"%dprec" return PERCENT_DPREC;
- "%error"[-_]"verbose" return PERCENT_ERROR_VERBOSE;
+ "%error-verbose" return PERCENT_ERROR_VERBOSE;
"%expect" return PERCENT_EXPECT;
- "%expect"[-_]"rr" return PERCENT_EXPECT_RR;
+ "%expect-rr" return PERCENT_EXPECT_RR;
"%file-prefix" return PERCENT_FILE_PREFIX;
- "%fixed"[-_]"output"[-_]"files" return PERCENT_YACC;
+ "%fixed-output-files" return PERCENT_YACC;
"%initial-action" return PERCENT_INITIAL_ACTION;
"%glr-parser" return PERCENT_GLR_PARSER;
"%language" return PERCENT_LANGUAGE;
"%lex-param" RETURN_PERCENT_PARAM(lex);
"%locations" RETURN_PERCENT_FLAG("locations");
"%merge" return PERCENT_MERGE;
- "%name"[-_]"prefix" return PERCENT_NAME_PREFIX;
- "%no"[-_]"default"[-_]"prec" return PERCENT_NO_DEFAULT_PREC;
- "%no"[-_]"lines" return PERCENT_NO_LINES;
+ "%name-prefix" return PERCENT_NAME_PREFIX;
+ "%no-default-prec" return PERCENT_NO_DEFAULT_PREC;
+ "%no-lines" return PERCENT_NO_LINES;
"%nonassoc" return PERCENT_NONASSOC;
"%nondeterministic-parser" return PERCENT_NONDETERMINISTIC_PARSER;
"%nterm" return PERCENT_NTERM;
"%prec" return PERCENT_PREC;
"%precedence" return PERCENT_PRECEDENCE;
"%printer" return PERCENT_PRINTER;
- "%pure"[-_]"parser" RETURN_PERCENT_FLAG("api.pure");
+ "%pure-parser" RETURN_PERCENT_FLAG("api.pure");
"%require" return PERCENT_REQUIRE;
"%right" return PERCENT_RIGHT;
"%skeleton" return PERCENT_SKELETON;
"%start" return PERCENT_START;
"%term" return PERCENT_TOKEN;
"%token" return PERCENT_TOKEN;
- "%token"[-_]"table" return PERCENT_TOKEN_TABLE;
+ "%token-table" return PERCENT_TOKEN_TABLE;
"%type" return PERCENT_TYPE;
"%union" return PERCENT_UNION;
"%verbose" return PERCENT_VERBOSE;
"%yacc" return PERCENT_YACC;
+ /* deprecated */
+ "%default"[-_]"prec" DEPRECATED("%default-prec");
+ "%error"[-_]"verbose" DEPRECATED("%define parse.error verbose");
+ "%expect"[-_]"rr" DEPRECATED("%expect-rr");
+ "%file-prefix"{eqopt} DEPRECATED("%file-prefix");
+ "%fixed"[-_]"output"[-_]"files" DEPRECATED("%fixed-output-files");
+ "%name"[-_]"prefix"{eqopt} DEPRECATED("%name-prefix");
+ "%no"[-_]"default"[-_]"prec" DEPRECATED("%no-default-prec");
+ "%no"[-_]"lines" DEPRECATED("%no-lines");
+ "%output"{eqopt} DEPRECATED("%output");
+ "%pure"[-_]"parser" DEPRECATED("%pure-parser");
+ "%token"[-_]"table" DEPRECATED("%token-table");
+
{directive} {
- complain_at (*loc, complaint, _("invalid directive: %s"), quote (yytext));
+ complain (loc, complaint, _("invalid directive: %s"), quote (yytext));
}
"=" return EQUAL;
/* Identifiers may not start with a digit. Yet, don't silently
accept "1FOO" as "1 FOO". */
{int}{id} {
- complain_at (*loc, complaint, _("invalid identifier: %s"), quote (yytext));
+ complain (loc, complaint, _("invalid identifier: %s"), quote (yytext));
}
/* Characters. */
}
. {
- complain_at (*loc, complaint, _("invalid character: %s"), quote (yytext));
+ complain (loc, complaint, _("invalid character: %s"),
+ quote_mem (yytext, yyleng));
}
<<EOF>> {
<SC_ESCAPED_CHARACTER,SC_ESCAPED_STRING,SC_TAG>
{
- \0 complain_at (*loc, complaint, _("invalid null character"));
+ \0 complain (loc, complaint, _("invalid null character"));
}
{id} {
if (bracketed_id_str)
{
- complain_at (*loc, complaint,
- _("unexpected identifier in bracketed name: %s"),
- quote (yytext));
+ complain (loc, complaint,
+ _("unexpected identifier in bracketed name: %s"),
+ quote (yytext));
}
else
{
}
}
else
- complain_at (*loc, complaint, _("an identifier expected"));
+ complain (loc, complaint, _("an identifier expected"));
}
. {
- complain_at (*loc, complaint, _("invalid character in bracketed name: %s"),
- quote (yytext));
+ complain (loc, complaint, _("invalid character in bracketed name: %s"),
+ quote_mem (yytext, yyleng));
}
<<EOF>> {
BEGIN bracketed_id_context_state;
/* FIXME: Eventually, make these errors. */
if (last_string[0] == '\0')
{
- complain_at (*loc, Wother, _("empty character literal"));
+ complain (loc, Wother, _("empty character literal"));
/* '\0' seems dangerous even if we are about to complain. */
val->character = '\'';
}
else if (last_string[1] != '\0')
- complain_at (*loc, Wother,
+ complain (loc, Wother,
_("extra characters in character literal"));
}
if (yytext[0] == '\n')
/* FIXME: Eventually, make these errors. */
if (last_string[0] == '\0')
{
- complain_at (*loc, Wother, _("empty character literal"));
+ complain (loc, Wother, _("empty character literal"));
/* '\0' seems dangerous even if we are about to complain. */
val->character = '\'';
}
else if (last_string[1] != '\0')
- complain_at (*loc, Wother,
+ complain (loc, Wother,
_("extra characters in character literal"));
}
unexpected_eof (token_start, "'");
\\[0-7]{1,3} {
unsigned long int c = strtoul (yytext + 1, NULL, 8);
if (!c || UCHAR_MAX < c)
- complain_at (*loc, complaint, _("invalid number after \\-escape: %s"),
+ complain (loc, complaint, _("invalid number after \\-escape: %s"),
yytext+1);
else
obstack_1grow (&obstack_for_string, c);
verify (UCHAR_MAX < ULONG_MAX);
unsigned long int c = strtoul (yytext + 2, NULL, 16);
if (!c || UCHAR_MAX < c)
- complain_at (*loc, complaint, _("invalid number after \\-escape: %s"),
+ complain (loc, complaint, _("invalid number after \\-escape: %s"),
yytext+1);
else
obstack_1grow (&obstack_for_string, c);
\\(u|U[0-9abcdefABCDEF]{4})[0-9abcdefABCDEF]{4} {
int c = convert_ucn_to_byte (yytext);
if (c <= 0)
- complain_at (*loc, complaint, _("invalid number after \\-escape: %s"),
+ complain (loc, complaint, _("invalid number after \\-escape: %s"),
yytext+1);
else
obstack_1grow (&obstack_for_string, c);
p = quote (p);
else
p = quotearg_style_mem (escape_quoting_style, p, 1);
- complain_at (*loc, complaint, _("invalid character after \\-escape: %s"),
+ complain (loc, complaint, _("invalid character after \\-escape: %s"),
p);
}
}
if (INT_MAX < num)
{
- complain_at (loc, complaint, _("integer out of range: %s"),
+ complain (&loc, complaint, _("integer out of range: %s"),
quote (number));
num = INT_MAX;
}
*strchr (file, '"') = '\0';
if (INT_MAX <= lineno)
{
- complain_at (loc, Wother, _("line number overflow"));
+ complain (&loc, Wother, _("line number overflow"));
lineno = INT_MAX;
}
current_file = uniqstr_new (file);
// Instead of '\'', display "'".
if (STREQ (token_end, "'\\''"))
token_end = "\"'\"";
- complain_at (loc, complaint, _(msgid), token_end);
+ complain (&loc, complaint, _(msgid), token_end);
}