From c9d546b2a8ec076b1bad7c65f74d04533a448da5 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 31 Jul 2012 14:18:39 +0200 Subject: [PATCH] c++: trailing end-of-lines in %parse-param * src/parse-gram.y (add_param): No only skip ' ' and '\t', skip all leading and trailing spaces. * tests/regression.at (Lex and parse params): Check it. * NEWS: Document it. --- NEWS | 4 +++ src/parse-gram.y | 10 +++--- tests/regression.at | 84 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index f940d8ed..316abb04 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ GNU Bison NEWS * Noteworthy changes in release ?.? (????-??-??) [?] +** Spaces in %lex- and %parse-param (lalr1.cc, glr.cc) + + Trailing end-of-lines in %parse-param or %lex-param would result in + invalid C++. This is fixed. * Noteworthy changes in release 2.6.1 (2012-07-30) [stable] diff --git a/src/parse-gram.y b/src/parse-gram.y index e6a27c50..02af75e2 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -734,11 +734,13 @@ add_param (char const *type, char *decl, location loc) /* Strip the surrounding '{' and '}', and any blanks just inside the braces. */ - while (*--p == ' ' || *p == '\t') - continue; + --p; + while (isspace ((unsigned char) *p)) + --p; p[1] = '\0'; - while (*++decl == ' ' || *decl == '\t') - continue; + ++decl; + while (isspace ((unsigned char) *decl)) + ++decl; if (! name_start) complain_at (loc, _("missing identifier in parameter declaration")); diff --git a/tests/regression.at b/tests/regression.at index 71c3bbf0..2f029939 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -1583,3 +1583,87 @@ Stack now 0 m4_popdef([AT_LAC_CHECK]) AT_CLEANUP + + +## ---------------------- ## +## Lex and parse params. ## +## ---------------------- ## + +# AT_TEST(SKELETON) +# ----------------- +# Check that the identifier of the params is properly fetched +# even when there are trailing blanks. + +m4_pushdef([AT_TEST], +[AT_SETUP([[Lex and parse params: $1]]) + +AT_BISON_OPTION_PUSHDEFS([%locations %skeleton $1]) + +## FIXME: Improve parsing of parse-param and use the generated +## yyerror. +AT_DATA_GRAMMAR([input.y], +[[%defines +%locations +%skeleton $1 +%union { int ival; } +%parse-param { int x } +// Spaces, tabs, and new lines. +%parse-param { @&t@ + int y @&t@ + @&t@ + @&t@ +} + +%{ +#include +#include + +]AT_SKEL_CC_IF([], [[ +static +void +yyerror (int x, int y, const char *msg) +{ + fprintf (stderr, "x: %d, y: %d, %s\n", x, y, msg); +}]])[ + + ]AT_YYLEX_DECLARE[ +%} + +%% +exp: 'a' { fprintf (stdout, "x: %d, y: %d\n", x, y); }; +%% +]AT_YYLEX_DEFINE(["a"])[ + +]AT_SKEL_CC_IF( +[AT_YYERROR_DEFINE + +int +yyparse (int x, int y) +{ + yy::parser parser(x, y); + return parser.parse (); +} +])[ + +int +main (void) +{ + return !!yyparse(1, 2); +} +]]) + +AT_FULL_COMPILE([input]) +AT_CHECK([./input], 0, [[x: 1, y: 2 +]]) +AT_BISON_OPTION_POPDEFS + +AT_CLEANUP +]) + +## FIXME: test Java, and iterate over skeletons. +AT_TEST("yacc.c") +AT_TEST("glr.c") +AT_TEST("lalr1.cc") +AT_TEST("glr.cc") + +m4_popdef([AT_TEST]) -- 2.45.2