bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 5/6] tests: handle locations in a more generic way.


From: Akim Demaille
Subject: [PATCH 5/6] tests: handle locations in a more generic way.
Date: Fri, 22 Jun 2012 12:54:14 +0200

* 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 <stdio.h>
   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)
 <declare>(T,x)
 <init-declare>(T,x,y)
 =(x,y)
@@ -360,10 +336,10 @@ m4_define([_AT_RESOLVED_GLR_OUTPUT],
 <init-declare>(T,y,+(z,q))
 <error>
 +(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: <declare>(T,x)
 7.0-7.7: <init-declare>(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: <init-declare>(T,y,+(z,q))
 17.0-17.15: <error>
 19.0-19.5: +(z,q)
-]]])
+]])
 
 m4_define([_AT_AMBIG_GLR_OUTPUT],
-[[[+(z,q)
+[[+(z,q)
 <declare>(T,x)
 <init-declare>(T,x,y)
 =(x,y)
@@ -384,10 +360,10 @@ m4_define([_AT_AMBIG_GLR_OUTPUT],
 <OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
 <error>
 +(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: <declare>(T,x)
 7.0-7.7: <init-declare>(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: <OR>(<init-declare>(T,y,+(z,q)),=(<cast>(y,T),+(z,q)))
 17.0-17.15: <error>
 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 <stmtMerge>], [%merge <stmtMerge>])
 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 <stmtMerge>], [%merge <stmtMerge>])
 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 <stmtMerge>], [%merge <stmtMerge>])
 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 <stmtMerge>],[%merge <stmtMerge>])
 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 <stmtMerge>], [%merge <stmtMerge>])
 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: address@hidden)])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 <stdlib.h> /* 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 <stdio.h>
 /* 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
+])
 
 
 ## --------------- ##
-- 
1.7.10.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]