mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-22 10:43:02 +00:00
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: .
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user