-/* Bison Grammar Parser -*- C -*-
+%{/* Bison Grammar Parser -*- C -*-
- Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA
*/
-
-%debug
-%defines
-%locations
-%pure-parser
-%error-verbose
-%defines
-%name-prefix="gram_"
-
-%{
#include "system.h"
#include "complain.h"
#include "gram.h"
#include "muscle_tab.h"
#include "output.h"
+#include "quotearg.h"
#include "reader.h"
#include "symlist.h"
#define YYLLOC_DEFAULT(Current, Rhs, N) (Current) = lloc_default (Rhs, N)
static YYLTYPE lloc_default (YYLTYPE const *, int);
+#define YY_LOCATION_PRINT(File, Loc) \
+ location_print (File, Loc)
+
/* Request detailed syntax error messages, and pass them to GRAM_ERROR.
FIXME: depends on the undocumented availability of YYLLOC. */
#undef yyerror
int current_prec = 0;
%}
+%debug
+%defines
+%locations
+%pure-parser
+%error-verbose
+%defines
+%name-prefix="gram_"
+
%initial-action
{
/* Bison's grammar can initial empty locations, hence a default
action:
BRACED_CODE
- { $$ = $1; }
+ { $$ = $1; }
;
-/* A string used as an ID: we have to keep the quotes. */
+/* A string used as an ID: quote it. */
string_as_id:
STRING
{
- $$ = symbol_get ($1, @1);
+ $$ = symbol_get (quotearg_style (c_quoting_style, $1), @1);
symbol_class_set ($$, token_sym, @1);
}
;
-/* A string used for its contents. Strip the quotes. */
+/* A string used for its contents. Don't quote it. */
string_content:
STRING
- {
- $$ = $1 + 1;
- $$[strlen ($$) - 1] = '\0';
- };
+ { $$ = $1; }
+;
epilogue.opt:
{
int i;
YYLTYPE loc;
- loc.start = loc.end = rhs[n].end;
+
+ /* SGI MIPSpro 7.4.1m miscompiles "loc.start = loc.end = rhs[n].end;".
+ The bug is fixed in 7.4.2m, but play it safe for now. */
+ loc.start = rhs[n].end;
+ loc.end = rhs[n].end;
/* Ignore empty nonterminals the start of the the right-hand side.
Do not bother to ignore them at the end of the right-hand side,
static void
add_param (char const *type, char *decl, location loc)
{
- static char const alphanum[] =
- "0123456789"
+ static char const alphanum[26 + 26 + 1 + 10] =
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "_";
- char const *alpha = alphanum + 10;
+ "_"
+ "0123456789";
char const *name_start = NULL;
char *p;
- for (p = decl; *p; p++)
- if ((p == decl || ! strchr (alphanum, p[-1])) && strchr (alpha, p[0]))
+ /* Stop on last actual character. */
+ for (p = decl; p[1]; p++)
+ if ((p == decl
+ || ! memchr (alphanum, p[-1], sizeof alphanum))
+ && memchr (alphanum, p[0], sizeof alphanum - 10))
name_start = p;
- /* Strip the surrounding '{' and '}'. */
- decl++;
- p[-1] = '\0';
+ /* Strip the surrounding '{' and '}', and any blanks just inside
+ the braces. */
+ while (*--p == ' ' || *p == '\t')
+ continue;
+ p[1] = '\0';
+ while (*++decl == ' ' || *decl == '\t')
+ continue;
if (! name_start)
complain_at (loc, _("missing identifier in parameter declaration"));
size_t name_len;
for (name_len = 1;
- name_start[name_len] && strchr (alphanum, name_start[name_len]);
+ memchr (alphanum, name_start[name_len], sizeof alphanum);
name_len++)
continue;