Alexandre Duret-Lutz <adl@gnu.org>

Move the token type and YYSTYPE in the parser class.
* data/lalr1.cc (stack.hh, location.hh): Include earlier.
(parser::token): New, from the moved free definition of tokens.
(parser::semantic_value): Now a full definition instead of an
indirection to YYSTYPE.
(b4_post_prologue): No longer included in the header file, but
in the implementation file.
* doc/bison.texi (C+ Language Interface): Update.
* src/parse-gram.y: Support unary %define.
* tests/actions.at: Define global_tokens_and_yystype for backward
compatibility until we update the tests.
* tests/calc.at: Idem.
(first_line, first_column, last_line, last_column): Define for lalr1.cc
to simplify the code.
This commit is contained in:
Akim Demaille
2005-09-30 17:57:05 +00:00
parent 55f0c7b1f2
commit fb9712a962
10 changed files with 394 additions and 336 deletions

View File

@@ -1,3 +1,21 @@
2005-09-30 Akim Demaille <akim@epita.fr>,
Alexandre Duret-Lutz <adl@gnu.org>
Move the token type and YYSTYPE in the parser class.
* data/lalr1.cc (stack.hh, location.hh): Include earlier.
(parser::token): New, from the moved free definition of tokens.
(parser::semantic_value): Now a full definition instead of an
indirection to YYSTYPE.
(b4_post_prologue): No longer included in the header file, but
in the implementation file.
* doc/bison.texi (C+ Language Interface): Update.
* src/parse-gram.y: Support unary %define.
* tests/actions.at: Define global_tokens_and_yystype for backward
compatibility until we update the tests.
* tests/calc.at: Idem.
(first_line, first_column, last_line, last_column): Define for lalr1.cc
to simplify the code.
2005-09-29 Paul Eggert <eggert@cs.ucla.edu>
Port to SunOS 4.1.4, which lacks strtoul and strerror.
@@ -6,7 +24,7 @@
* lib/.cvsignore: Add strerror.c, strtol.c, strtoul.c
* m4/.cvsignore: Add strerror.m4, strtol.m4, strtoul.m4.
2005-09-29 Akim <akim@epita.fr>
2005-09-29 Akim Demaille <akim@epita.fr>
* data/c.m4 (b4_error_verbose_if): New.
* data/lalr1.cc: Use it.

11
NEWS
View File

@@ -3,6 +3,17 @@ Bison News
Changes in version 2.1a:
* lalr1.cc: The token and value types are now class members.
The tokens where defined as free form enums and cpp macros. YYSTYPE
was defined as a free form union. Both are now class members:
tokens are enumerations of the `yy::parser::token' struct, and the
semantic values have the `yy::parser::semantic_type' type.
If you do not want or can update to this scheme, the directive
`%define "global_tokens_and_yystype" "1"' triggers the global
definition of tokens and YYSTYPE.
Changes in version 2.1, 2005-09-16:
* Bison-generated parsers now support the translation of diagnostics like

View File

@@ -27,35 +27,27 @@ m4_divert(0)dnl
m4_if(b4_defines_flag, 0, [],
[@output @output_header_name@
b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison],
[2002, 2003, 2004, 2005])[
/* FIXME: This is wrong, we want computed header guards.
I don't know why the macros are missing now. :( */
[2002, 2003, 2004, 2005])
dnl FIXME: This is wrong, we want computed header guards.
dnl FIXME: I don\'t know why the macros are missing now. :(
[
#ifndef PARSER_HEADER_H
# define PARSER_HEADER_H
#include <string>
#include <iostream>
#include "stack.hh"
#include "location.hh"
/* Using locations. */
#define YYLSP_NEEDED ]b4_locations_flag[
namespace yy
{
class position;
class location;
}
]b4_token_enums(b4_tokens)[
/* Copy the first part of user declarations. */
/* First part of user declarations. */
]b4_pre_prologue[
]/* Line __line__ of lalr1.cc. */
b4_syncline([@oline@], [@ofile@])[
#include "stack.hh"
#include "location.hh"
/* Enabling traces. */
#ifndef YYDEBUG
# define YYDEBUG ]b4_debug[
@@ -74,23 +66,6 @@ b4_syncline([@oline@], [@ofile@])[
# define YYTOKEN_TABLE ]b4_token_table[
#endif
#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
]m4_ifdef([b4_stype],
[b4_syncline([b4_stype_line], [b4_file_name])
union YYSTYPE b4_stype;
/* Line __line__ of lalr1.cc. */
b4_syncline([@oline@], [@ofile@])],
[typedef int YYSTYPE;])[
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
# define YYSTYPE_IS_TRIVIAL 1
#endif
/* Copy the second part of user declarations. */
]b4_post_prologue[
]/* Line __line__ of lalr1.cc. */
b4_syncline([@oline@], [@ofile@])[
/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
If N is 0, then set CURRENT to the empty location which ends
the previous symbol: RHS[0] (always defined). */
@@ -116,12 +91,26 @@ namespace yy
/// A Bison parser.
class ]b4_parser_class_name[
{
public:
/// Symbol semantic values.
#if ! defined (YYSTYPE)
]m4_ifdef([b4_stype],
[b4_syncline([b4_stype_line], [b4_file_name])
union semantic_type b4_stype;
/* Line __line__ of lalr1.cc. */
b4_syncline([@oline@], [@ofile@])],
[ typedef int semantic_type;])[
#else
typedef YYSTYPE semantic_type;
#endif
/// Symbol locations.
typedef ]b4_location_type[ location_type;
/// Tokens.
struct token
{
]b4_token_enums(b4_tokens)[
};
public:
/// Build a parser object.
]b4_parser_class_name[ (]b4_parse_param_decl[) :
yydebug_ (false),
@@ -285,6 +274,14 @@ b4_error_verbose_if([, int tok])[);
};
}
]m4_ifset([b4_global_tokens_and_yystype],
[b4_token_defines(b4_tokens)
#ifndef YYSTYPE
/* Redirection for backward compatibility. */
# define YYSTYPE yy::b4_parser_class_name::semantic_type
#endif
])[
#endif /* ! defined PARSER_HEADER_H */]
])dnl
@output @output_parser_name@
@@ -298,6 +295,12 @@ m4_if(b4_defines_flag, 0, [],
[
#include @output_header_name@])[
/* User implementation prologue. */
]b4_post_prologue[
]/* Line __line__ of lalr1.cc. */
b4_syncline([@oline@], [@ofile@])[
#ifndef YY_
# if YYENABLE_NLS
# if ENABLE_NLS
@@ -788,8 +791,8 @@ yyreturn:
// Generate an error message.
std::string
yy::]b4_parser_class_name[::
yysyntax_error_ (int yystate]b4_error_verbose_if([, int tok])[)
yy::]b4_parser_class_name[::yysyntax_error_ (int yystate]dnl
b4_error_verbose_if([, int tok])[)
{
std::string res;
#if YYERROR_VERBOSE

View File

@@ -6933,12 +6933,13 @@ for a complete and accurate documentation.
The @code{%union} directive works as for C, see @ref{Union Decl, ,The
Collection of Value Types}. In particular it produces a genuine
@code{union}@footnote{In the future techniques to allow complex types
within pseudo-unions (variants) might be implemented to alleviate
these issues.}, which have a few specific features in C++.
within pseudo-unions (similar to Boost variants) might be implemented to
alleviate these issues.}, which have a few specific features in C++.
@itemize @minus
@item
The name @code{YYSTYPE} also denotes @samp{union YYSTYPE}. You may
forward declare it just with @samp{union YYSTYPE;}.
The type @code{YYSTYPE} is defined but its use is discouraged: rather
you should refer to the parser's encapsulated type
@code{yy::parser::semantic_type}.
@item
Non POD (Plain Old Data) types cannot be used. C++ forbids any
instance of classes with constructors in unions: only @emph{pointers}
@@ -7139,7 +7140,8 @@ transforming the simple parsing context structure into a fully blown
The declaration of this driver class, @file{calc++-driver.hh}, is as
follows. The first part includes the CPP guard and imports the
required standard library components.
required standard library components, and the declaration of the parser
class.
@comment file: calc++-driver.hh
@example
@@ -7147,26 +7149,9 @@ required standard library components.
# define CALCXX_DRIVER_HH
# include <string>
# include <map>
# include "calc++-parser.hh"
@end example
@noindent
Then come forward declarations. Because the parser uses the parsing
driver and reciprocally, simple inclusions of header files will not
do. Because the driver's declaration is the one that will be imported
by the rest of the project, it is saner to forward declare the
parser's information here.
@comment file: calc++-driver.hh
@example
// Forward declarations.
union YYSTYPE;
namespace yy
@{
class location;
class calcxx_parser;
@}
class calcxx_driver;
@end example
@noindent
Then comes the declaration of the scanning function. Flex expects
@@ -7178,7 +7163,9 @@ factor both as follows.
@example
// Announce to Flex the prototype we want for lexing function, ...
# define YY_DECL \
int yylex (YYSTYPE* yylval, yy::location* yylloc, calcxx_driver& driver)
int yylex (yy::calcxx_parser::semantic_type* yylval, \
yy::calcxx_parser::location_type* yylloc, \
calcxx_driver& driver)
// ... and declare it for the parser's sake.
YY_DECL;
@end example
@@ -7289,18 +7276,29 @@ calcxx_driver::error (const std::string& m)
@subsection Calc++ Parser
The parser definition file @file{calc++-parser.yy} starts by asking
for the C++ skeleton, the creation of the parser header file, and
specifies the name of the parser class. It then includes the required
headers.
for the C++ LALR(1) skeleton, the creation of the parser header file, and
specifies the name of the parser class.
@comment file: calc++-parser.yy
@example
%skeleton "lalr1.cc" /* -*- C++ -*- */
%define "parser_class_name" "calcxx_parser"
%defines
%define "parser_class_name" "calcxx_parser"
@end example
@noindent
Then come the declarations/inclusions needed to define the
@code{%union}. Because the parser uses the parsing driver and
reciprocally, both cannot include the header of the other. Because the
driver's header needs detailed knowledge about the parser class (in
particular its inner types), it is the parser's header which will simply
use a forward declaration of the driver.
@comment file: calc++-parser.yy
@example
%@{
# include <string>
# include "calc++-driver.hh"
class calcxx_driver;
%@}
@end example
@@ -7356,6 +7354,19 @@ them.
@};
@end example
@noindent
The code between @samp{%@{} and @samp{%@}} after the introduction of the
@samp{%union} is output in the @file{*.cc} file; it needs detailed
knowledge about the driver.
@comment file: calc++-parser.yy
@example
%@{
# include "calc++-driver.hh"
%@}
@end example
@noindent
The token numbered as 0 corresponds to end of file; the following line
allows for nicer error messages referring to ``end of file'' instead
@@ -7365,11 +7376,11 @@ avoid name clashes.
@comment file: calc++-parser.yy
@example
%token TOKEN_EOF 0 "end of file"
%token TOKEN_ASSIGN ":="
%token <sval> TOKEN_IDENTIFIER "identifier"
%token <ival> TOKEN_NUMBER "number"
%type <ival> exp "expression"
%token END 0 "end of file"
%token ASSIGN ":="
%token <sval> IDENTIFIER "identifier"
%token <ival> NUMBER "number"
%type <ival> exp "expression"
@end example
@noindent
@@ -7396,7 +7407,7 @@ unit: assignments exp @{ driver.result = $2; @};
assignments: assignments assignment @{@}
| /* Nothing. */ @{@};
assignment: TOKEN_IDENTIFIER ":=" exp @{ driver.variables[*$1] = $3; @};
assignment: "identifier" ":=" exp @{ driver.variables[*$1] = $3; @};
%left '+' '-';
%left '*' '/';
@@ -7404,8 +7415,8 @@ exp: exp '+' exp @{ $$ = $1 + $3; @}
| exp '-' exp @{ $$ = $1 - $3; @}
| exp '*' exp @{ $$ = $1 * $3; @}
| exp '/' exp @{ $$ = $1 / $3; @}
| TOKEN_IDENTIFIER @{ $$ = driver.variables[*$1]; @}
| TOKEN_NUMBER @{ $$ = $1; @};
| "identifier" @{ $$ = driver.variables[*$1]; @}
| "number" @{ $$ = $1; @};
%%
@end example
@@ -7485,22 +7496,28 @@ preceding tokens. Comments would be treated equally.
@end example
@noindent
The rules are simple, just note the use of the driver to report
errors.
The rules are simple, just note the use of the driver to report errors.
It is convenient to use a typedef to shorten
@code{yy::calcxx_parser::token::identifier} into
@code{token::identifier} for isntance.
@comment file: calc++-scanner.ll
@example
%@{
typedef yy::calcxx_parser::token token;
%@}
[-+*/] return yytext[0];
":=" return TOKEN_ASSIGN;
":=" return token::ASSIGN;
@{int@} @{
errno = 0;
long n = strtol (yytext, NULL, 10);
if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE))
driver.error (*yylloc, "integer is out of range");
yylval->ival = n;
return TOKEN_NUMBER;
return token::NUMBER;
@}
@{id@} yylval->sval = new std::string (yytext); return TOKEN_IDENTIFIER;
@{id@} yylval->sval = new std::string (yytext); return token::IDENTIFIER;
. driver.error (*yylloc, "invalid character");
%%
@end example

View File

@@ -64,8 +64,6 @@ BEGIN {
# #line report the line number of the *next* line.
# => + 2.
# Note that recent Bison support it, but not Flex.
if (file ~ /\.[chy]*$/)
input = "#line " (FNR + 1) " \"" FILENAME "\"\n";
next;
}

View File

@@ -170,7 +170,7 @@
/* Copy the first part of user declarations. */
#line 1 "parse-gram.y"
#line 1 "../../src/parse-gram.y"
/* Bison Grammar Parser -*- C -*-
Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
@@ -248,7 +248,7 @@ static int current_prec = 0;
#endif
#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
#line 79 "parse-gram.y"
#line 79 "../../src/parse-gram.y"
typedef union YYSTYPE {
symbol *symbol;
symbol_list *list;
@@ -258,7 +258,7 @@ typedef union YYSTYPE {
uniqstr uniqstr;
} YYSTYPE;
/* Line 196 of yacc.c. */
#line 262 "parse-gram.c"
#line 262 "../../src/parse-gram.c"
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
# define YYSTYPE_IS_TRIVIAL 1
@@ -282,7 +282,7 @@ typedef struct YYLTYPE
/* Line 219 of yacc.c. */
#line 286 "parse-gram.c"
#line 286 "../../src/parse-gram.c"
#ifndef YYSIZE_T
# if defined (__SIZE_TYPE__)
@@ -453,7 +453,7 @@ union yyalloc
/* YYNNTS -- Number of nonterminals. */
#define YYNNTS 25
/* YYNRULES -- Number of rules. */
#define YYNRULES 79
#define YYNRULES 80
/* YYNRULES -- Number of states. */
#define YYNSTATES 108
@@ -505,14 +505,15 @@ static const unsigned char yytranslate[] =
YYRHS. */
static const unsigned char yyprhs[] =
{
0, 0, 3, 8, 9, 12, 14, 16, 18, 22,
24, 26, 29, 32, 36, 38, 40, 42, 44, 48,
50, 52, 56, 58, 60, 63, 65, 67, 69, 71,
73, 75, 78, 80, 83, 86, 88, 90, 91, 95,
96, 100, 104, 108, 110, 112, 114, 115, 117, 119,
122, 124, 126, 129, 132, 136, 138, 141, 143, 146,
148, 151, 154, 155, 159, 161, 165, 168, 169, 172,
175, 179, 183, 187, 189, 191, 193, 195, 197, 198
0, 0, 3, 8, 9, 12, 14, 16, 18, 21,
25, 27, 29, 32, 35, 39, 41, 43, 45, 47,
51, 53, 55, 59, 61, 63, 66, 68, 70, 72,
74, 76, 78, 81, 83, 86, 89, 91, 93, 94,
98, 99, 103, 107, 111, 113, 115, 117, 118, 120,
122, 125, 127, 129, 132, 135, 139, 141, 144, 146,
149, 151, 154, 157, 158, 162, 164, 168, 171, 172,
175, 178, 182, 186, 190, 192, 194, 196, 198, 200,
201
};
/* YYRHS -- A `-1'-separated list of the rules' RHS. */
@@ -520,38 +521,39 @@ static const yysigned_char yyrhs[] =
{
52, 0, -1, 53, 47, 65, 75, -1, -1, 53,
54, -1, 55, -1, 48, -1, 17, -1, 19, 74,
74, -1, 20, -1, 21, -1, 22, 4, -1, 23,
4, -1, 24, 42, 74, -1, 25, -1, 26, -1,
27, -1, 28, -1, 29, 42, 74, -1, 31, -1,
32, -1, 33, 42, 74, -1, 34, -1, 35, -1,
36, 74, -1, 38, -1, 39, -1, 40, -1, 43,
-1, 59, -1, 56, -1, 37, 71, -1, 10, -1,
8, 62, -1, 9, 62, -1, 18, -1, 30, -1,
-1, 6, 57, 64, -1, -1, 5, 58, 64, -1,
7, 41, 62, -1, 60, 61, 62, -1, 11, -1,
12, -1, 13, -1, -1, 41, -1, 71, -1, 62,
71, -1, 41, -1, 45, -1, 45, 4, -1, 45,
73, -1, 45, 4, 73, -1, 63, -1, 64, 63,
-1, 66, -1, 65, 66, -1, 67, -1, 55, 43,
-1, 1, 43, -1, -1, 46, 68, 69, -1, 70,
-1, 69, 44, 70, -1, 69, 43, -1, -1, 70,
71, -1, 70, 72, -1, 70, 14, 71, -1, 70,
15, 4, -1, 70, 16, 41, -1, 45, -1, 73,
-1, 50, -1, 3, -1, 3, -1, -1, 47, 49,
-1
-1, 19, 74, 74, -1, 20, -1, 21, -1, 22,
4, -1, 23, 4, -1, 24, 42, 74, -1, 25,
-1, 26, -1, 27, -1, 28, -1, 29, 42, 74,
-1, 31, -1, 32, -1, 33, 42, 74, -1, 34,
-1, 35, -1, 36, 74, -1, 38, -1, 39, -1,
40, -1, 43, -1, 59, -1, 56, -1, 37, 71,
-1, 10, -1, 8, 62, -1, 9, 62, -1, 18,
-1, 30, -1, -1, 6, 57, 64, -1, -1, 5,
58, 64, -1, 7, 41, 62, -1, 60, 61, 62,
-1, 11, -1, 12, -1, 13, -1, -1, 41, -1,
71, -1, 62, 71, -1, 41, -1, 45, -1, 45,
4, -1, 45, 73, -1, 45, 4, 73, -1, 63,
-1, 64, 63, -1, 66, -1, 65, 66, -1, 67,
-1, 55, 43, -1, 1, 43, -1, -1, 46, 68,
69, -1, 70, -1, 69, 44, 70, -1, 69, 43,
-1, -1, 70, 71, -1, 70, 72, -1, 70, 14,
71, -1, 70, 15, 4, -1, 70, 16, 41, -1,
45, -1, 73, -1, 50, -1, 3, -1, 3, -1,
-1, 47, 49, -1
};
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
static const unsigned short int yyrline[] =
{
0, 188, 188, 196, 198, 202, 203, 204, 205, 206,
207, 208, 209, 210, 211, 216, 220, 221, 222, 223,
224, 225, 226, 227, 228, 229, 230, 231, 232, 236,
237, 238, 242, 248, 255, 262, 266, 273, 273, 278,
278, 283, 293, 308, 309, 310, 314, 315, 321, 322,
327, 331, 336, 342, 348, 359, 360, 369, 370, 376,
377, 382, 389, 389, 393, 394, 395, 400, 401, 403,
405, 407, 409, 414, 415, 419, 425, 434, 439, 441
207, 208, 209, 210, 211, 212, 217, 221, 222, 223,
224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
237, 238, 239, 243, 249, 256, 263, 267, 274, 274,
279, 279, 284, 294, 309, 310, 311, 315, 316, 322,
323, 328, 332, 337, 343, 349, 360, 361, 370, 371,
377, 378, 383, 390, 390, 394, 395, 396, 401, 402,
404, 406, 408, 410, 415, 416, 420, 426, 435, 440,
442
};
#endif
@@ -600,25 +602,27 @@ static const unsigned char yyr1[] =
{
0, 51, 52, 53, 53, 54, 54, 54, 54, 54,
54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
54, 54, 54, 54, 54, 54, 54, 54, 54, 55,
55, 55, 55, 55, 55, 55, 55, 57, 56, 58,
56, 56, 59, 60, 60, 60, 61, 61, 62, 62,
63, 63, 63, 63, 63, 64, 64, 65, 65, 66,
66, 66, 68, 67, 69, 69, 69, 70, 70, 70,
70, 70, 70, 71, 71, 72, 73, 74, 75, 75
54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
55, 55, 55, 55, 55, 55, 55, 55, 57, 56,
58, 56, 56, 59, 60, 60, 60, 61, 61, 62,
62, 63, 63, 63, 63, 63, 64, 64, 65, 65,
66, 66, 66, 68, 67, 69, 69, 69, 70, 70,
70, 70, 70, 70, 71, 71, 72, 73, 74, 75,
75
};
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
static const unsigned char yyr2[] =
{
0, 2, 4, 0, 2, 1, 1, 1, 3, 1,
1, 2, 2, 3, 1, 1, 1, 1, 3, 1,
1, 3, 1, 1, 2, 1, 1, 1, 1, 1,
1, 2, 1, 2, 2, 1, 1, 0, 3, 0,
3, 3, 3, 1, 1, 1, 0, 1, 1, 2,
1, 1, 2, 2, 3, 1, 2, 1, 2, 1,
2, 2, 0, 3, 1, 3, 2, 0, 2, 2,
3, 3, 3, 1, 1, 1, 1, 1, 0, 2
0, 2, 4, 0, 2, 1, 1, 1, 2, 3,
1, 1, 2, 2, 3, 1, 1, 1, 1, 3,
1, 1, 3, 1, 1, 2, 1, 1, 1, 1,
1, 1, 2, 1, 2, 2, 1, 1, 0, 3,
0, 3, 3, 3, 1, 1, 1, 0, 1, 1,
2, 1, 1, 2, 2, 3, 1, 2, 1, 2,
1, 2, 2, 0, 3, 1, 3, 2, 0, 2,
2, 3, 3, 3, 1, 1, 1, 1, 1, 0,
2
};
/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -626,17 +630,17 @@ static const unsigned char yyr2[] =
means the default is an error. */
static const unsigned char yydefact[] =
{
3, 0, 0, 1, 39, 37, 0, 0, 0, 32,
43, 44, 45, 7, 35, 0, 9, 10, 0, 0,
0, 14, 15, 16, 17, 0, 36, 19, 20, 0,
22, 23, 0, 0, 25, 26, 27, 28, 0, 6,
4, 5, 30, 29, 46, 0, 0, 0, 76, 73,
33, 48, 74, 34, 77, 0, 11, 12, 0, 0,
0, 24, 31, 0, 62, 0, 0, 57, 59, 47,
0, 50, 51, 55, 40, 38, 41, 49, 8, 13,
18, 21, 61, 67, 60, 0, 58, 2, 42, 52,
53, 56, 63, 64, 79, 54, 66, 67, 0, 0,
0, 75, 68, 69, 65, 70, 71, 72
3, 0, 0, 1, 40, 38, 0, 0, 0, 33,
44, 45, 46, 7, 36, 0, 10, 11, 0, 0,
0, 15, 16, 17, 18, 0, 37, 20, 21, 0,
23, 24, 0, 0, 26, 27, 28, 29, 0, 6,
4, 5, 31, 30, 47, 0, 0, 0, 77, 74,
34, 49, 75, 35, 78, 8, 12, 13, 0, 0,
0, 25, 32, 0, 63, 0, 0, 58, 60, 48,
0, 51, 52, 56, 41, 39, 42, 50, 9, 14,
19, 22, 62, 68, 61, 0, 59, 2, 43, 53,
54, 57, 64, 65, 80, 55, 67, 68, 0, 0,
0, 76, 69, 70, 66, 71, 72, 73
};
/* YYDEFGOTO[NTERM-NUM]. */
@@ -677,12 +681,12 @@ static const yysigned_char yypgoto[] =
positive, shift that token. If negative, reduce the rule which
number is the opposite. If zero, do what YYDEFACT says.
If YYTABLE_NINF, syntax error. */
#define YYTABLE_NINF -79
#define YYTABLE_NINF -80
static const yysigned_char yytable[] =
{
62, 53, 48, 48, 71, 3, 90, 47, 72, 48,
89, 96, 97, 98, 99, 100, 54, 77, 91, 91,
77, -78, 63, 95, 56, 58, 4, 5, 6, 7,
77, -79, 63, 95, 56, 58, 4, 5, 6, 7,
8, 9, 10, 11, 12, 57, 59, 60, 69, 14,
76, 82, 48, 77, 49, 49, 84, 106, 107, 101,
94, 26, 41, 86, 75, 77, 104, 0, 33, 0,
@@ -1181,94 +1185,94 @@ yysymprint (yyoutput, yytype, yyvaluep, yylocationp)
switch (yytype)
{
case 3: /* "\"string\"" */
#line 165 "parse-gram.y"
#line 165 "../../src/parse-gram.y"
{ fprintf (stderr, "\"%s\"", (yyvaluep->chars)); };
#line 1187 "parse-gram.c"
#line 1191 "../../src/parse-gram.c"
break;
case 4: /* "\"integer\"" */
#line 178 "parse-gram.y"
#line 178 "../../src/parse-gram.y"
{ fprintf (stderr, "%d", (yyvaluep->integer)); };
#line 1192 "parse-gram.c"
#line 1196 "../../src/parse-gram.c"
break;
case 8: /* "\"%destructor {...}\"" */
#line 167 "parse-gram.y"
#line 167 "../../src/parse-gram.y"
{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
#line 1197 "parse-gram.c"
#line 1201 "../../src/parse-gram.c"
break;
case 9: /* "\"%printer {...}\"" */
#line 171 "parse-gram.y"
#line 171 "../../src/parse-gram.y"
{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
#line 1202 "parse-gram.c"
#line 1206 "../../src/parse-gram.c"
break;
case 10: /* "\"%union {...}\"" */
#line 172 "parse-gram.y"
#line 172 "../../src/parse-gram.y"
{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
#line 1207 "parse-gram.c"
#line 1211 "../../src/parse-gram.c"
break;
case 26: /* "\"%initial-action {...}\"" */
#line 168 "parse-gram.y"
#line 168 "../../src/parse-gram.y"
{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
#line 1212 "parse-gram.c"
#line 1216 "../../src/parse-gram.c"
break;
case 27: /* "\"%lex-param {...}\"" */
#line 169 "parse-gram.y"
#line 169 "../../src/parse-gram.y"
{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
#line 1217 "parse-gram.c"
#line 1221 "../../src/parse-gram.c"
break;
case 34: /* "\"%parse-param {...}\"" */
#line 170 "parse-gram.y"
#line 170 "../../src/parse-gram.y"
{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
#line 1222 "parse-gram.c"
#line 1226 "../../src/parse-gram.c"
break;
case 41: /* "\"type\"" */
#line 176 "parse-gram.y"
#line 176 "../../src/parse-gram.y"
{ fprintf (stderr, "<%s>", (yyvaluep->uniqstr)); };
#line 1227 "parse-gram.c"
#line 1231 "../../src/parse-gram.c"
break;
case 45: /* "\"identifier\"" */
#line 180 "parse-gram.y"
#line 180 "../../src/parse-gram.y"
{ fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
#line 1232 "parse-gram.c"
#line 1236 "../../src/parse-gram.c"
break;
case 46: /* "\"identifier:\"" */
#line 182 "parse-gram.y"
#line 182 "../../src/parse-gram.y"
{ fprintf (stderr, "%s:", (yyvaluep->symbol)->tag); };
#line 1237 "parse-gram.c"
#line 1241 "../../src/parse-gram.c"
break;
case 48: /* "\"%{...%}\"" */
#line 174 "parse-gram.y"
#line 174 "../../src/parse-gram.y"
{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
#line 1242 "parse-gram.c"
#line 1246 "../../src/parse-gram.c"
break;
case 49: /* "\"epilogue\"" */
#line 174 "parse-gram.y"
#line 174 "../../src/parse-gram.y"
{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
#line 1247 "parse-gram.c"
#line 1251 "../../src/parse-gram.c"
break;
case 50: /* "\"{...}\"" */
#line 173 "parse-gram.y"
#line 173 "../../src/parse-gram.y"
{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
#line 1252 "parse-gram.c"
#line 1256 "../../src/parse-gram.c"
break;
case 71: /* "symbol" */
#line 180 "parse-gram.y"
#line 180 "../../src/parse-gram.y"
{ fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
#line 1257 "parse-gram.c"
#line 1261 "../../src/parse-gram.c"
break;
case 72: /* "action" */
#line 173 "parse-gram.y"
#line 173 "../../src/parse-gram.y"
{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
#line 1262 "parse-gram.c"
#line 1266 "../../src/parse-gram.c"
break;
case 73: /* "string_as_id" */
#line 180 "parse-gram.y"
#line 180 "../../src/parse-gram.y"
{ fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
#line 1267 "parse-gram.c"
#line 1271 "../../src/parse-gram.c"
break;
case 74: /* "string_content" */
#line 165 "parse-gram.y"
#line 165 "../../src/parse-gram.y"
{ fprintf (stderr, "\"%s\"", (yyvaluep->chars)); };
#line 1272 "parse-gram.c"
#line 1276 "../../src/parse-gram.c"
break;
default:
break;
@@ -1439,7 +1443,7 @@ YYLTYPE yylloc;
/* User initialization code. */
#line 69 "parse-gram.y"
#line 69 "../../src/parse-gram.y"
{
/* Bison's grammar can initial empty locations, hence a default
location is needed. */
@@ -1448,7 +1452,7 @@ YYLTYPE yylloc;
yylloc.start.column = yylloc.end.column = 0;
}
/* Line 1053 of yacc.c. */
#line 1452 "parse-gram.c"
#line 1456 "../../src/parse-gram.c"
yylsp[0] = yylloc;
goto yysetstate;
@@ -1637,129 +1641,134 @@ yyreduce:
switch (yyn)
{
case 6:
#line 203 "parse-gram.y"
#line 203 "../../src/parse-gram.y"
{ prologue_augment ((yyvsp[0].chars), (yylsp[0])); }
break;
case 7:
#line 204 "parse-gram.y"
#line 204 "../../src/parse-gram.y"
{ debug_flag = true; }
break;
case 8:
#line 205 "parse-gram.y"
{ muscle_insert ((yyvsp[-1].chars), (yyvsp[0].chars)); }
#line 205 "../../src/parse-gram.y"
{ muscle_insert ((yyvsp[0].chars), "1"); }
break;
case 9:
#line 206 "parse-gram.y"
{ defines_flag = true; }
#line 206 "../../src/parse-gram.y"
{ muscle_insert ((yyvsp[-1].chars), (yyvsp[0].chars)); }
break;
case 10:
#line 207 "parse-gram.y"
{ error_verbose = true; }
#line 207 "../../src/parse-gram.y"
{ defines_flag = true; }
break;
case 11:
#line 208 "parse-gram.y"
{ expected_sr_conflicts = (yyvsp[0].integer); }
#line 208 "../../src/parse-gram.y"
{ error_verbose = true; }
break;
case 12:
#line 209 "parse-gram.y"
{ expected_rr_conflicts = (yyvsp[0].integer); }
#line 209 "../../src/parse-gram.y"
{ expected_sr_conflicts = (yyvsp[0].integer); }
break;
case 13:
#line 210 "parse-gram.y"
{ spec_file_prefix = (yyvsp[0].chars); }
#line 210 "../../src/parse-gram.y"
{ expected_rr_conflicts = (yyvsp[0].integer); }
break;
case 14:
#line 212 "parse-gram.y"
#line 211 "../../src/parse-gram.y"
{ spec_file_prefix = (yyvsp[0].chars); }
break;
case 15:
#line 213 "../../src/parse-gram.y"
{
nondeterministic_parser = true;
glr_parser = true;
}
break;
case 15:
#line 217 "parse-gram.y"
case 16:
#line 218 "../../src/parse-gram.y"
{
muscle_code_grow ("initial_action", (yyvsp[0].chars), (yylsp[0]));
}
break;
case 16:
#line 220 "parse-gram.y"
case 17:
#line 221 "../../src/parse-gram.y"
{ add_param ("lex_param", (yyvsp[0].chars), (yylsp[0])); }
break;
case 17:
#line 221 "parse-gram.y"
case 18:
#line 222 "../../src/parse-gram.y"
{ locations_flag = true; }
break;
case 18:
#line 222 "parse-gram.y"
case 19:
#line 223 "../../src/parse-gram.y"
{ spec_name_prefix = (yyvsp[0].chars); }
break;
case 19:
#line 223 "parse-gram.y"
case 20:
#line 224 "../../src/parse-gram.y"
{ no_lines_flag = true; }
break;
case 20:
#line 224 "parse-gram.y"
case 21:
#line 225 "../../src/parse-gram.y"
{ nondeterministic_parser = true; }
break;
case 21:
#line 225 "parse-gram.y"
case 22:
#line 226 "../../src/parse-gram.y"
{ spec_outfile = (yyvsp[0].chars); }
break;
case 22:
#line 226 "parse-gram.y"
case 23:
#line 227 "../../src/parse-gram.y"
{ add_param ("parse_param", (yyvsp[0].chars), (yylsp[0])); }
break;
case 23:
#line 227 "parse-gram.y"
case 24:
#line 228 "../../src/parse-gram.y"
{ pure_parser = true; }
break;
case 24:
#line 228 "parse-gram.y"
case 25:
#line 229 "../../src/parse-gram.y"
{ skeleton = (yyvsp[0].chars); }
break;
case 25:
#line 229 "parse-gram.y"
case 26:
#line 230 "../../src/parse-gram.y"
{ token_table_flag = true; }
break;
case 26:
#line 230 "parse-gram.y"
case 27:
#line 231 "../../src/parse-gram.y"
{ report_flag = report_states; }
break;
case 27:
#line 231 "parse-gram.y"
case 28:
#line 232 "../../src/parse-gram.y"
{ yacc_flag = true; }
break;
case 31:
#line 239 "parse-gram.y"
case 32:
#line 240 "../../src/parse-gram.y"
{
grammar_start_symbol_set ((yyvsp[0].symbol), (yylsp[0]));
}
break;
case 32:
#line 243 "parse-gram.y"
case 33:
#line 244 "../../src/parse-gram.y"
{
typed = true;
MUSCLE_INSERT_INT ("stype_line", (yylsp[0]).start.line);
@@ -1767,8 +1776,8 @@ yyreduce:
}
break;
case 33:
#line 249 "parse-gram.y"
case 34:
#line 250 "../../src/parse-gram.y"
{
symbol_list *list;
for (list = (yyvsp[0].list); list; list = list->next)
@@ -1777,8 +1786,8 @@ yyreduce:
}
break;
case 34:
#line 256 "parse-gram.y"
case 35:
#line 257 "../../src/parse-gram.y"
{
symbol_list *list;
for (list = (yyvsp[0].list); list; list = list->next)
@@ -1787,48 +1796,48 @@ yyreduce:
}
break;
case 35:
#line 263 "parse-gram.y"
case 36:
#line 264 "../../src/parse-gram.y"
{
default_prec = true;
}
break;
case 36:
#line 267 "parse-gram.y"
case 37:
#line 268 "../../src/parse-gram.y"
{
default_prec = false;
}
break;
case 37:
#line 273 "parse-gram.y"
case 38:
#line 274 "../../src/parse-gram.y"
{ current_class = nterm_sym; }
break;
case 38:
#line 274 "parse-gram.y"
case 39:
#line 275 "../../src/parse-gram.y"
{
current_class = unknown_sym;
current_type = NULL;
}
break;
case 39:
#line 278 "parse-gram.y"
{ current_class = token_sym; }
break;
case 40:
#line 279 "parse-gram.y"
#line 279 "../../src/parse-gram.y"
{ current_class = token_sym; }
break;
case 41:
#line 280 "../../src/parse-gram.y"
{
current_class = unknown_sym;
current_type = NULL;
}
break;
case 41:
#line 284 "parse-gram.y"
case 42:
#line 285 "../../src/parse-gram.y"
{
symbol_list *list;
for (list = (yyvsp[0].list); list; list = list->next)
@@ -1837,8 +1846,8 @@ yyreduce:
}
break;
case 42:
#line 294 "parse-gram.y"
case 43:
#line 295 "../../src/parse-gram.y"
{
symbol_list *list;
++current_prec;
@@ -1852,58 +1861,58 @@ yyreduce:
}
break;
case 43:
#line 308 "parse-gram.y"
case 44:
#line 309 "../../src/parse-gram.y"
{ (yyval.assoc) = left_assoc; }
break;
case 44:
#line 309 "parse-gram.y"
case 45:
#line 310 "../../src/parse-gram.y"
{ (yyval.assoc) = right_assoc; }
break;
case 45:
#line 310 "parse-gram.y"
case 46:
#line 311 "../../src/parse-gram.y"
{ (yyval.assoc) = non_assoc; }
break;
case 46:
#line 314 "parse-gram.y"
case 47:
#line 315 "../../src/parse-gram.y"
{ current_type = NULL; }
break;
case 47:
#line 315 "parse-gram.y"
case 48:
#line 316 "../../src/parse-gram.y"
{ current_type = (yyvsp[0].uniqstr); }
break;
case 48:
#line 321 "parse-gram.y"
case 49:
#line 322 "../../src/parse-gram.y"
{ (yyval.list) = symbol_list_new ((yyvsp[0].symbol), (yylsp[0])); }
break;
case 49:
#line 322 "parse-gram.y"
case 50:
#line 323 "../../src/parse-gram.y"
{ (yyval.list) = symbol_list_prepend ((yyvsp[-1].list), (yyvsp[0].symbol), (yylsp[0])); }
break;
case 50:
#line 328 "parse-gram.y"
case 51:
#line 329 "../../src/parse-gram.y"
{
current_type = (yyvsp[0].uniqstr);
}
break;
case 51:
#line 332 "parse-gram.y"
case 52:
#line 333 "../../src/parse-gram.y"
{
symbol_class_set ((yyvsp[0].symbol), current_class, (yylsp[0]));
symbol_type_set ((yyvsp[0].symbol), current_type, (yylsp[0]));
}
break;
case 52:
#line 337 "parse-gram.y"
case 53:
#line 338 "../../src/parse-gram.y"
{
symbol_class_set ((yyvsp[-1].symbol), current_class, (yylsp[-1]));
symbol_type_set ((yyvsp[-1].symbol), current_type, (yylsp[-1]));
@@ -1911,8 +1920,8 @@ yyreduce:
}
break;
case 53:
#line 343 "parse-gram.y"
case 54:
#line 344 "../../src/parse-gram.y"
{
symbol_class_set ((yyvsp[-1].symbol), current_class, (yylsp[-1]));
symbol_type_set ((yyvsp[-1].symbol), current_type, (yylsp[-1]));
@@ -1920,8 +1929,8 @@ yyreduce:
}
break;
case 54:
#line 349 "parse-gram.y"
case 55:
#line 350 "../../src/parse-gram.y"
{
symbol_class_set ((yyvsp[-2].symbol), current_class, (yylsp[-2]));
symbol_type_set ((yyvsp[-2].symbol), current_type, (yylsp[-2]));
@@ -1930,96 +1939,96 @@ yyreduce:
}
break;
case 60:
#line 378 "parse-gram.y"
case 61:
#line 379 "../../src/parse-gram.y"
{
if (yacc_flag)
complain_at ((yyloc), _("POSIX forbids declarations in the grammar"));
}
break;
case 61:
#line 383 "parse-gram.y"
case 62:
#line 384 "../../src/parse-gram.y"
{
yyerrok;
}
break;
case 62:
#line 389 "parse-gram.y"
case 63:
#line 390 "../../src/parse-gram.y"
{ current_lhs = (yyvsp[0].symbol); current_lhs_location = (yylsp[0]); }
break;
case 64:
#line 393 "parse-gram.y"
{ grammar_rule_end ((yylsp[0])); }
break;
case 65:
#line 394 "parse-gram.y"
#line 394 "../../src/parse-gram.y"
{ grammar_rule_end ((yylsp[0])); }
break;
case 67:
#line 400 "parse-gram.y"
{ grammar_rule_begin (current_lhs, current_lhs_location); }
case 66:
#line 395 "../../src/parse-gram.y"
{ grammar_rule_end ((yylsp[0])); }
break;
case 68:
#line 402 "parse-gram.y"
{ grammar_current_rule_symbol_append ((yyvsp[0].symbol), (yylsp[0])); }
#line 401 "../../src/parse-gram.y"
{ grammar_rule_begin (current_lhs, current_lhs_location); }
break;
case 69:
#line 404 "parse-gram.y"
{ grammar_current_rule_action_append ((yyvsp[0].chars), (yylsp[0])); }
#line 403 "../../src/parse-gram.y"
{ grammar_current_rule_symbol_append ((yyvsp[0].symbol), (yylsp[0])); }
break;
case 70:
#line 406 "parse-gram.y"
{ grammar_current_rule_prec_set ((yyvsp[0].symbol), (yylsp[0])); }
#line 405 "../../src/parse-gram.y"
{ grammar_current_rule_action_append ((yyvsp[0].chars), (yylsp[0])); }
break;
case 71:
#line 408 "parse-gram.y"
{ grammar_current_rule_dprec_set ((yyvsp[0].integer), (yylsp[0])); }
#line 407 "../../src/parse-gram.y"
{ grammar_current_rule_prec_set ((yyvsp[0].symbol), (yylsp[0])); }
break;
case 72:
#line 410 "parse-gram.y"
{ grammar_current_rule_merge_set ((yyvsp[0].uniqstr), (yylsp[0])); }
#line 409 "../../src/parse-gram.y"
{ grammar_current_rule_dprec_set ((yyvsp[0].integer), (yylsp[0])); }
break;
case 73:
#line 414 "parse-gram.y"
{ (yyval.symbol) = (yyvsp[0].symbol); }
#line 411 "../../src/parse-gram.y"
{ grammar_current_rule_merge_set ((yyvsp[0].uniqstr), (yylsp[0])); }
break;
case 74:
#line 415 "parse-gram.y"
#line 415 "../../src/parse-gram.y"
{ (yyval.symbol) = (yyvsp[0].symbol); }
break;
case 75:
#line 420 "parse-gram.y"
{ (yyval.chars) = (yyvsp[0].chars); }
#line 416 "../../src/parse-gram.y"
{ (yyval.symbol) = (yyvsp[0].symbol); }
break;
case 76:
#line 426 "parse-gram.y"
#line 421 "../../src/parse-gram.y"
{ (yyval.chars) = (yyvsp[0].chars); }
break;
case 77:
#line 427 "../../src/parse-gram.y"
{
(yyval.symbol) = symbol_get (quotearg_style (c_quoting_style, (yyvsp[0].chars)), (yylsp[0]));
symbol_class_set ((yyval.symbol), token_sym, (yylsp[0]));
}
break;
case 77:
#line 435 "parse-gram.y"
case 78:
#line 436 "../../src/parse-gram.y"
{ (yyval.chars) = (yyvsp[0].chars); }
break;
case 79:
#line 442 "parse-gram.y"
case 80:
#line 443 "../../src/parse-gram.y"
{
muscle_code_grow ("epilogue", (yyvsp[0].chars), (yylsp[0]));
scanner_last_string_free ();
@@ -2031,7 +2040,7 @@ yyreduce:
}
/* Line 1249 of yacc.c. */
#line 2035 "parse-gram.c"
#line 2044 "../../src/parse-gram.c"
yyvsp -= yylen;
yyssp -= yylen;
@@ -2241,7 +2250,7 @@ yyreturn:
}
#line 448 "parse-gram.y"
#line 449 "../../src/parse-gram.y"

View File

@@ -135,7 +135,7 @@
#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
#line 79 "parse-gram.y"
#line 79 "../../src/parse-gram.y"
typedef union YYSTYPE {
symbol *symbol;
symbol_list *list;
@@ -145,7 +145,7 @@ typedef union YYSTYPE {
uniqstr uniqstr;
} YYSTYPE;
/* Line 1505 of yacc.c. */
#line 149 "parse-gram.h"
#line 149 "../../src/parse-gram.h"
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
# define YYSTYPE_IS_TRIVIAL 1

View File

@@ -202,6 +202,7 @@ declaration:
grammar_declaration
| PROLOGUE { prologue_augment ($1, @1); }
| "%debug" { debug_flag = true; }
| "%define" string_content { muscle_insert ($2, "1"); }
| "%define" string_content string_content { muscle_insert ($2, $3); }
| "%defines" { defines_flag = true; }
| "%error-verbose" { error_verbose = true; }

View File

@@ -187,6 +187,7 @@ m4_ifval([$6], [%union
{
int ival;
}])
AT_LALR1_CC_IF([%define "global_tokens_and_yystype"])
[
%{
]AT_LALR1_CC_IF([typedef yy::location YYLTYPE;

View File

@@ -39,7 +39,9 @@ m4_define([_AT_DATA_CALC_Y],
[m4_fatal([$0: Invalid arguments: $@])])dnl
AT_DATA_GRAMMAR([calc.y],
[[/* Infix notation calculator--calc */
]$4[
]$4
AT_LALR1_CC_IF(
[%define "global_tokens_and_yystype"])[
%{
#include <stdio.h>
@@ -68,7 +70,13 @@ static int global_count = 0;
%{
static int power (int base, int exponent);
]AT_LALR1_CC_IF([typedef yy::location YYLTYPE;],
]AT_LALR1_CC_IF(
[typedef yy::location YYLTYPE;
#define first_line begin.line
#define first_column begin.column
#define last_line end.line
#define last_column end.column
],
[/* yyerror receives the location if:
- %location & %pure & %glr
- %location & %pure & %yacc & %parse-param. */
@@ -176,16 +184,11 @@ get_char (]AT_LEX_FORMALS[)
last_yylloc = AT_LOC;
if (res == '\n')
{
AT_LALR1_CC_IF(
[ AT_LOC.end.line++;
AT_LOC.end.column = 0;],
[ AT_LOC.last_line++;
AT_LOC.last_column = 0;])
AT_LOC.last_line++;
AT_LOC.last_column = 0;
}
else
AT_LALR1_CC_IF(
[ AT_LOC.end.column++;],
[ AT_LOC.last_column++;])
AT_LOC.last_column++;
])[
return res;
}
@@ -244,27 +247,24 @@ yylex (]AT_LEX_FORMALS[)
if (init)
{
init = 0;
]AT_LALR1_CC_IF([],
[AT_LOCATION_IF([
]AT_LOCATION_IF([
AT_LOC.last_column = 0;
AT_LOC.last_line = 1;
])])[
])[
}
]AT_LOCATION_IF([AT_LALR1_CC_IF(
[ AT_LOC.begin = AT_LOC.end;],
[ AT_LOC.first_column = AT_LOC.last_column;
]AT_LOCATION_IF([
AT_LOC.first_column = AT_LOC.last_column;
AT_LOC.first_line = AT_LOC.last_line;
])])[
])[
/* Skip white space. */
while ((c = get_char (]AT_LEX_ARGS[)) == ' ' || c == '\t')
{
]AT_LOCATION_IF([AT_LALR1_CC_IF(
[ AT_LOC.begin = AT_LOC.end;],
]AT_LOCATION_IF(
[ AT_LOC.first_column = AT_LOC.last_column;
AT_LOC.first_line = AT_LOC.last_line;
])])[
])[
}
/* process numbers */
@@ -428,8 +428,8 @@ AT_CHECK([cat stderr], 0, [expout])
])
# AT_CHECK_CALC([BISON-OPTIONS [, EXPECTED-TO-FAIL]])
# ------------------------------
# AT_CHECK_CALC([BISON-OPTIONS, [EXPECTED-TO-FAIL]])
# --------------------------------------------------
# Start a testing chunk which compiles `calc' grammar with
# BISON-OPTIONS, and performs several tests over the parser.
# However, if EXPECTED-TO-FAIL is nonempty, this test is expected to fail.