# 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 {
} 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
return yyparse ();
}
+]AT_YYERROR_DEFINE[
+
int
-yylex (LEX_PARAMETERS)
+yylex (]AT_LEX_FORMALS[)
{
char buffer[256];
int c;
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;
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)
{
])
m4_define([_AT_RESOLVED_GLR_OUTPUT],
-[[[+(z,q)
+[[+(z,q)
<declare>(T,x)
<init-declare>(T,x,y)
=(x,y)
<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)
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)
<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)
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. ##
_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
# 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],
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;
}]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],
[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",
(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
+])
## --------------- ##