From 24bb8c8c257631f988941fcd78ecce09bc5d5f23 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 13 Apr 2010 22:05:42 +0200 Subject: [PATCH] test location_type. * tests/local.at (_AT_BISON_OPTION_PUSHDEFS): Define AT_LOCATION_TYPE_IF. (_AT_BISON_OPTION_POPDEFS): Undefine AT_LOCATION_TYPE_IF. * tests/calc.at (_AT_DATA_CALC_Y): When %define location_type is used, provide a user location type and use it. (Simple LALR1 C++ Calculator): Add a test case for location_type. --- ChangeLog | 10 ++++++++++ tests/calc.at | 54 +++++++++++++++++++++++++++++++++++++++++--------- tests/local.at | 7 +++++-- 3 files changed, 60 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index bc9cbc97..58f27a5c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2010-04-13 Akim Demaille + + test location_type. + * tests/local.at (_AT_BISON_OPTION_PUSHDEFS): + Define AT_LOCATION_TYPE_IF. + (_AT_BISON_OPTION_POPDEFS): Undefine AT_LOCATION_TYPE_IF. + * tests/calc.at (_AT_DATA_CALC_Y): When %define location_type is + used, provide a user location type and use it. + (Simple LALR1 C++ Calculator): Add a test case for location_type. + 2010-04-13 Akim Demaille tests: check fclose's return value. diff --git a/tests/calc.at b/tests/calc.at index f102f952..16e40f5b 100644 --- a/tests/calc.at +++ b/tests/calc.at @@ -160,8 +160,22 @@ AT_SKEL_CC_IF( [%define global_tokens_and_yystype])[ %code requires { -/* Exercise pre-prologue dependency to %union. */ -typedef int semantic_value; +]AT_LOCATION_TYPE_IF([ +# include + struct Point + { + int l; + int c; + }; + + struct Span + { + Point begin; + Point end; + }; +])[ + /* Exercise pre-prologue dependency to %union. */ + typedef int semantic_value; } /* Exercise %union. */ @@ -178,10 +192,17 @@ extern FILE *input;]AT_SKEL_CC_IF([[ #ifndef YYLTYPE # define YYLTYPE ]AT_NAME_PREFIX[::parser::location_type #endif -#define first_line begin.line -#define first_column begin.column -#define last_line end.line -#define last_column end.column]])[ +]AT_LOCATION_TYPE_IF([[ + #define first_line begin.l + #define first_column begin.c + #define last_line end.l + #define last_column end.c +]], [[ + #define first_line begin.line + #define first_column begin.column + #define last_line end.line + #define last_column end.column +]])])[ } %code @@ -211,7 +232,7 @@ static void yyerror (AT_YYERROR_ARG_LOC_IF([YYLTYPE *llocp, ]) int yylex (]AT_LEX_FORMALS[); } -]AT_SKEL_CC_IF([AT_LOCATION_IF([ +]AT_SKEL_CC_IF([AT_LOCATION_IF([AT_LOCATION_TYPE_IF([], [ /* The lalr1.cc skeleton, for backward compatibility, defines a constructor for position that initializes the filename. The glr.cc skeleton does not (and in fact cannot: location/position @@ -220,7 +241,7 @@ int yylex (]AT_LEX_FORMALS[); %initial-action { @$.initialize (0); } -])])[ +])])])[ /* Bison Declarations */ %token CALC_EOF 0 "end of input" @@ -267,7 +288,20 @@ exp: %% ]AT_SKEL_CC_IF( -[/* A C++ error reporting function. */ +[AT_LOCATION_TYPE_IF([[ + std::ostream& + operator<< (std::ostream& o, const Span& s) + { + o << s.begin.l << '.' << s.begin.c; + if (s.begin.l != s.end.l) + o << '-' << s.end.l << '.' << s.end.c - 1; + else if (s.begin.c != s.end.c - 1) + o << '-' << s.end.c - 1; + return o; + } +]]) + +/* A C++ error reporting function. */ void AT_NAME_PREFIX::parser::error (AT_LOCATION_IF([const location_type& l, ])const std::string& m) { @@ -575,6 +609,7 @@ AT_CHECK_CALC_LALR() AT_CHECK_CALC_LALR([%defines]) AT_CHECK_CALC_LALR([%locations]) + AT_CHECK_CALC_LALR([%name-prefix="calc"]) dnl test deprecated `=' AT_CHECK_CALC_LALR([%verbose]) AT_CHECK_CALC_LALR([%yacc]) @@ -651,6 +686,7 @@ m4_define([AT_CHECK_CALC_LALR1_CC], AT_CHECK_CALC_LALR1_CC([]) AT_CHECK_CALC_LALR1_CC([%locations]) +AT_CHECK_CALC_LALR1_CC([%locations %define location_type Span]) AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %name-prefix "calc" %verbose %yacc]) AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %debug %name-prefix "calc" %verbose %yacc]) diff --git a/tests/local.at b/tests/local.at index cbd7e596..f8a88c96 100644 --- a/tests/local.at +++ b/tests/local.at @@ -70,10 +70,12 @@ m4_pushdef([AT_YACC_IF], [m4_bmatch([$3], [%language\|%glr-parser\|%skeleton], [$2], [$1])]) m4_pushdef([AT_LEXPARAM_IF], [m4_bmatch([$3], [%lex-param], [$1], [$2])]) -m4_pushdef([AT_PARAM_IF], -[m4_bmatch([$3], [%parse-param], [$1], [$2])]) m4_pushdef([AT_LOCATION_IF], [m4_bmatch([$3], [%locations], [$1], [$2])]) +m4_pushdef([AT_LOCATION_TYPE_IF], +[m4_bmatch([$3], [%define location_type], [$1], [$2])]) +m4_pushdef([AT_PARAM_IF], +[m4_bmatch([$3], [%parse-param], [$1], [$2])]) m4_pushdef([AT_PURE_IF], [m4_bmatch([$3], [%define *api\.pure\|%pure-parser], [m4_bmatch([$3], [%define *api\.pure *"?false"?], [$2], [$1])], @@ -149,6 +151,7 @@ m4_popdef([AT_YYERROR_ARG_LOC_IF]) m4_popdef([AT_NAME_PREFIX]) m4_popdef([AT_GLR_OR_PARAM_IF]) m4_popdef([AT_PURE_AND_LOC_IF]) +m4_popdef([AT_LOCATION_TYPE_IF]) m4_popdef([AT_LOCATION_IF]) m4_popdef([AT_PARAM_IF]) m4_popdef([AT_LEXPARAM_IF]) -- 2.45.2