summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAkim Demaille <akim@lrde.epita.fr>2012-06-22 11:34:37 +0200
committerAkim Demaille <akim@lrde.epita.fr>2012-06-22 11:34:37 +0200
commit6d55954743c7243ba46680f368c76ee70b1112f8 (patch)
treeff4df1a8de7250fbeed10e8a3a81a98829949345 /tests
parent7490994123d5cae9ae69547f4e121b24412b2760 (diff)
downloadbison-6d55954743c7243ba46680f368c76ee70b1112f8.tar.gz
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: .
Diffstat (limited to 'tests')
-rw-r--r--tests/cxx-type.at110
-rw-r--r--tests/java.at20
-rw-r--r--tests/local.at36
3 files changed, 77 insertions, 89 deletions
diff --git a/tests/cxx-type.at b/tests/cxx-type.at
index 746d05a4..e6fd8a85 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 b9e9deee..f822ec6e 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 b945968e..02093938 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
+])
## --------------- ##