From 6d55954743c7243ba46680f368c76ee70b1112f8 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Fri, 22 Jun 2012 11:34:37 +0200 Subject: [PATCH] tests: handle locations in a more generic way. * tests/local.at (AT_YYERROR_PROTOTYPE): New. Use it. * tests/cxx-type.at: Extensive revamp to use a more traditional quotation scheme, and to use the generic yyerror implementation. Prefer Autotest macros to CPP macros. * tests/java.at: . --- tests/cxx-type.at | 110 +++++++++++++++++++++++------------------------------- tests/java.at | 20 +++------- tests/local.at | 36 ++++++++++++------ 3 files changed, 77 insertions(+), 89 deletions(-) diff --git a/tests/cxx-type.at b/tests/cxx-type.at index 746d05a..e6fd8a8 100644 --- a/tests/cxx-type.at +++ b/tests/cxx-type.at @@ -23,15 +23,15 @@ AT_BANNER([[C++ Type Syntax (GLR).]]) # and with RESOLVE1 and RESOLVE2 as annotations on the conflicted rule for # stmt. Then compile the result. m4_define([_AT_TEST_GLR_CXXTYPES], -[ -AT_BISON_OPTION_PUSHDEFS([$1]) +[AT_BISON_OPTION_PUSHDEFS([%glr-parser $1]) AT_DATA_GRAMMAR([types.y], [[/* Simplified C++ Type and Expression Grammar. */ $1 -%{ +%code requires +{ #include union Node { struct { @@ -51,33 +51,22 @@ $1 } term; }; typedef union Node Node; + #define YYSTYPE Node * +} + +%code +{ static Node *new_nterm (char const *, Node *, Node *, Node *); static Node *new_term (char *); static void free_node (Node *); static char *node_to_string (Node *); - #define YYSTYPE Node * ]m4_bmatch([$2], [stmtMerge], [ static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);])[ #define YYINITDEPTH 10 #define YYSTACKEXPANDABLE 1 - struct YYLTYPE; -#if YYPURE -# if YYLSP_NEEDED -# define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp -# define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s -# else -# define LEX_PARAMETERS YYSTYPE *lvalp -# endif -#endif -#ifndef LEX_PARAMETERS -# define LEX_PARAMETERS void -#endif -#ifndef ERROR_PARAMETERS -# define ERROR_PARAMETERS char const *s -#endif - int yylex (LEX_PARAMETERS); - void yyerror (ERROR_PARAMETERS); -%} + ]AT_YYERROR_DECLARE[ + ]AT_YYLEX_DECLARE[ +} %token TYPENAME ID @@ -144,8 +133,10 @@ main (int argc, char **argv) return yyparse (); } +]AT_YYERROR_DEFINE[ + int -yylex (LEX_PARAMETERS) +yylex (]AT_LEX_FORMALS[) { char buffer[256]; int c; @@ -181,11 +172,9 @@ yylex (LEX_PARAMETERS) break; default: { - int tok; -#if YYLSP_NEEDED + int tok;]AT_LOCATION_IF([[ yylloc.first_line = yylloc.last_line = lineNum; - yylloc.first_column = colNum; -#endif + yylloc.first_column = colNum;]])[ if (isalpha (c)) { i = 0; @@ -210,27 +199,14 @@ yylex (LEX_PARAMETERS) colNum += 1; tok = c; yylval = YY_NULL; - } -#if YYLSP_NEEDED - yylloc.last_column = colNum-1; -#endif + }]AT_LOCATION_IF([[ + yylloc.last_column = colNum-1;]])[ return tok; } } } } -void -yyerror (ERROR_PARAMETERS) -{ -#if YYPURE && YYLSP_NEEDED - /* Pacify GCC by using llocp. */ - if (! llocp) - abort (); -#endif - fprintf (stderr, "%s\n", s); -} - static Node * new_nterm (char const *form, Node *child0, Node *child1, Node *child2) { @@ -351,7 +327,7 @@ AT_BISON_OPTION_POPDEFS ]) m4_define([_AT_RESOLVED_GLR_OUTPUT], -[[[+(z,q) +[[+(z,q) (T,x) (T,x,y) =(x,y) @@ -360,10 +336,10 @@ m4_define([_AT_RESOLVED_GLR_OUTPUT], (T,y,+(z,q)) +(z,q) -]]]) +]]) m4_define([_AT_RESOLVED_GLR_OUTPUT_WITH_LOC], -[[[3.0-3.5: +(z,q) +[[3.0-3.5: +(z,q) 5.0-5.3: (T,x) 7.0-7.7: (T,x,y) 9.0-9.5: =(x,y) @@ -372,10 +348,10 @@ m4_define([_AT_RESOLVED_GLR_OUTPUT_WITH_LOC], 15.0-15.13: (T,y,+(z,q)) 17.0-17.15: 19.0-19.5: +(z,q) -]]]) +]]) m4_define([_AT_AMBIG_GLR_OUTPUT], -[[[+(z,q) +[[+(z,q) (T,x) (T,x,y) =(x,y) @@ -384,10 +360,10 @@ m4_define([_AT_AMBIG_GLR_OUTPUT], ((T,y,+(z,q)),=((y,T),+(z,q))) +(z,q) -]]]) +]]) m4_define([_AT_AMBIG_GLR_OUTPUT_WITH_LOC], -[[[3.0-3.5: +(z,q) +[[3.0-3.5: +(z,q) 5.0-5.3: (T,x) 7.0-7.7: (T,x,y) 9.0-9.5: =(x,y) @@ -396,15 +372,23 @@ m4_define([_AT_AMBIG_GLR_OUTPUT_WITH_LOC], 15.0-15.13: ((T,y,+(z,q)),=((y,T),+(z,q))) 17.0-17.15: 19.0-19.5: +(z,q) -]]]) +]]) m4_define([_AT_GLR_STDERR], -[[[syntax error -]]]) +[[syntax error +]]) + +m4_define([_AT_GLR_STDERR_WITH_LOC], +[[17.5-4: syntax error +]]) m4_define([_AT_VERBOSE_GLR_STDERR], -[[[syntax error, unexpected ID, expecting '=' or '+' or ')' -]]]) +[[syntax error, unexpected ID, expecting '=' or '+' or ')' +]]) + +m4_define([_AT_VERBOSE_GLR_STDERR_WITH_LOC], +[[17.5-4: syntax error, unexpected ID, expecting '=' or '+' or ')' +]]) ## ---------------------------------------------------- ## ## Compile the grammar described in the documentation. ## @@ -414,59 +398,59 @@ AT_SETUP([GLR: Resolve ambiguity, impure, no locations]) _AT_TEST_GLR_CXXTYPES([], [%dprec 1], [%dprec 2]) AT_PARSER_CHECK([[./types test-input]], 0, - _AT_RESOLVED_GLR_OUTPUT, _AT_GLR_STDERR) + [_AT_RESOLVED_GLR_OUTPUT], [_AT_GLR_STDERR]) AT_CLEANUP AT_SETUP([GLR: Resolve ambiguity, impure, locations]) _AT_TEST_GLR_CXXTYPES([%locations],[%dprec 1],[%dprec 2]) AT_PARSER_CHECK([[./types test-input]], 0, - _AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR) + [_AT_RESOLVED_GLR_OUTPUT_WITH_LOC], [_AT_GLR_STDERR_WITH_LOC]) AT_CLEANUP AT_SETUP([GLR: Resolve ambiguity, pure, no locations]) _AT_TEST_GLR_CXXTYPES([%define api.pure], [%dprec 1], [%dprec 2]) AT_PARSER_CHECK([[./types test-input]], 0, - _AT_RESOLVED_GLR_OUTPUT, _AT_GLR_STDERR) + [_AT_RESOLVED_GLR_OUTPUT], [_AT_GLR_STDERR]) AT_CLEANUP AT_SETUP([GLR: Resolve ambiguity, pure, locations]) _AT_TEST_GLR_CXXTYPES([%define api.pure %locations], [%dprec 1], [%dprec 2]) AT_PARSER_CHECK([[./types test-input]], 0, - _AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR) + [_AT_RESOLVED_GLR_OUTPUT_WITH_LOC], [_AT_GLR_STDERR_WITH_LOC]) AT_CLEANUP AT_SETUP([GLR: Merge conflicting parses, impure, no locations]) _AT_TEST_GLR_CXXTYPES([], [%merge ], [%merge ]) AT_PARSER_CHECK([[./types test-input]], 0, - _AT_AMBIG_GLR_OUTPUT, _AT_GLR_STDERR) + [_AT_AMBIG_GLR_OUTPUT], [_AT_GLR_STDERR]) AT_CLEANUP AT_SETUP([GLR: Merge conflicting parses, impure, locations]) _AT_TEST_GLR_CXXTYPES([%locations], [%merge ], [%merge ]) AT_PARSER_CHECK([[./types test-input]], 0, - _AT_AMBIG_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR) + [_AT_AMBIG_GLR_OUTPUT_WITH_LOC], [_AT_GLR_STDERR_WITH_LOC]) AT_CLEANUP AT_SETUP([GLR: Merge conflicting parses, pure, no locations]) _AT_TEST_GLR_CXXTYPES([%define api.pure], [%merge ], [%merge ]) AT_PARSER_CHECK([[./types test-input]], 0, - _AT_AMBIG_GLR_OUTPUT, _AT_GLR_STDERR) + [_AT_AMBIG_GLR_OUTPUT], [_AT_GLR_STDERR]) AT_CLEANUP AT_SETUP([GLR: Merge conflicting parses, pure, locations]) _AT_TEST_GLR_CXXTYPES([%define api.pure %locations], [%merge ],[%merge ]) AT_PARSER_CHECK([[./types test-input]], 0, - _AT_AMBIG_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR) + [_AT_AMBIG_GLR_OUTPUT_WITH_LOC], [_AT_GLR_STDERR_WITH_LOC]) AT_CLEANUP AT_SETUP([GLR: Verbose messages, resolve ambiguity, impure, no locations]) _AT_TEST_GLR_CXXTYPES([%error-verbose], [%merge ], [%merge ]) AT_PARSER_CHECK([[./types test-input]], 0, - _AT_AMBIG_GLR_OUTPUT, _AT_VERBOSE_GLR_STDERR) + [_AT_AMBIG_GLR_OUTPUT], [_AT_VERBOSE_GLR_STDERR]) AT_CLEANUP diff --git a/tests/java.at b/tests/java.at index b9e9dee..f822ec6 100644 --- a/tests/java.at +++ b/tests/java.at @@ -32,6 +32,7 @@ AT_BANNER([[Java Calculator.]]) m4_define([_AT_DATA_JAVA_CALC_Y], [m4_if([$1$2$3], $[1]$[2]$[3], [], [m4_fatal([$0: Invalid arguments: $@])])dnl +AT_BISON_OPTION_PUSHDEFS([%language "Java" $4]) AT_DATA([Calc.y], [[/* Infix notation calculator--calc */ %language "Java" @@ -122,20 +123,8 @@ AT_LOCATION_IF([[ public Position getEndPos() { return yypos; } - - public void yyerror (Calc.Location l, String s) - { - if (l == null) - System.err.println (s); - else - System.err.println (l + ": " + s); - } -]], [[ - public void yyerror (String s) - { - System.err.println (s); - } ]])[ + ]AT_YYERROR_DEFINE[ Integer yylval; @@ -211,11 +200,12 @@ class Position { } ]]) +AT_BISON_OPTION_POPDEFS ])# _AT_DATA_JAVA_CALC_Y # AT_DATA_CALC_Y([BISON-OPTIONS]) -# ------------------------------------------------- +# ------------------------------- # Produce `calc.y'. m4_define([AT_DATA_JAVA_CALC_Y], [_AT_DATA_JAVA_CALC_Y($[1], $[2], $[3], [$1]) @@ -224,7 +214,7 @@ m4_define([AT_DATA_JAVA_CALC_Y], # _AT_CHECK_JAVA_CALC_ERROR(BISON-OPTIONS, INPUT, # [VERBOSE-AND-LOCATED-ERROR-MESSAGE]) -# --------------------------------------------------------- +# -------------------------------------------------------------- # Run `calc' on INPUT, and expect a `syntax error' message. # # If INPUT starts with a slash, it is used as absolute input file name, diff --git a/tests/local.at b/tests/local.at index b945968..0209393 100644 --- a/tests/local.at +++ b/tests/local.at @@ -281,7 +281,7 @@ $2]) # AT_YYLEX_DEFINE(INPUT-STRING, [ACTION]) # --------------------------------------- m4_define([AT_YYLEX_DECLARE_EXTERN], -[int AT_API_PREFIX[]lex (void);dnl +[int AT_API_PREFIX[]lex (]AT_LEX_FORMALS[);dnl ]) m4_define([AT_YYLEX_DECLARE], @@ -291,7 +291,7 @@ m4_define([AT_YYLEX_DECLARE], m4_define([AT_YYLEX_DEFINE], [[#include /* abort */ static int -]AT_API_PREFIX[lex (void) +]AT_API_PREFIX[lex (]AT_LEX_FORMALS[) { static char const input[] = "$1"; static size_t toknum = 0; @@ -306,15 +306,20 @@ static int }]dnl ]) +# AT_YYERROR_PROTOTYPE # AT_YYERROR_DECLARE_EXTERN # AT_YYERROR_DECLARE # AT_YYERROR_DEFINE # ------------------------- -# Beware that must be called inside a AT_BISON_OPTION_PUSHDEFS/POPDEFS -# pair. +# Must be called inside a AT_BISON_OPTION_PUSHDEFS/POPDEFS pair. +m4_define([AT_YYERROR_PROTOTYPE], +[m4_case(AT_LANG, +[c], [[void ]AT_API_PREFIX[error (]AT_YYERROR_ARG_LOC_IF([YYLTYPE *llocp, ])[const char *msg)]])[]dnl +]) + m4_define([AT_YYERROR_DECLARE_EXTERN], [m4_case(AT_LANG, -[c], [void AT_API_PREFIX[]error (]AT_YYERROR_ARG_LOC_IF([YYLTYPE *llocp, ])[const char *msg);])[]dnl +[c], [AT_YYERROR_PROTOTYPE;])[]dnl ]) m4_define([AT_YYERROR_DECLARE], @@ -326,8 +331,8 @@ m4_define([AT_YYERROR_DEFINE], [m4_case(AT_LANG, [c], [[#include /* A C error reporting function. */ -static void -yyerror (]AT_YYERROR_ARG_LOC_IF([YYLTYPE *llocp, ])[const char *msg) +static +]AT_YYERROR_PROTOTYPE[ { ]AT_YYERROR_SEES_LOC_IF([[ fprintf (stderr, "%d.%d", @@ -348,10 +353,19 @@ void (void) l; std::cerr << ]AT_LOCATION_IF([l << ": " << ])[m << std::endl; }]], -[java], [[public void yyerror (String msg) -{ - System.err.println (msg); -}]])]) +[java], [AT_LOCATION_IF([[public void yyerror (Calc.Location l, String s) + { + if (l == null) + System.err.println (s); + else + System.err.println (l + ": " + s); + } +]], [[ + public void yyerror (String s) + { + System.err.println (s); + }]])])dnl +]) ## --------------- ## -- 2.7.4