Daniel Hagerty hag@gnu.org
David J. MacKenzie djm@gnu.org
David Kastrup dak@gnu.org
+ Dennis Clarke dclarke@blastwave.org
Derek M. Jones derek@knosof.co.uk
Di-an Jan dianj@freeshell.org
Dick Streefland dick.streefland@altium.nl
Noah Friedman friedman@gnu.org
Odd Arild Olsen oao@fibula.no
Oleg Smolsky oleg.smolsky@pacific-simulators.co.nz
+Oleksii Taran oleksii.taran@gmail.com
Paolo Bonzini bonzini@gnu.org
Pascal Bart pascal.bart@epita.fr
Paul Eggert eggert@cs.ucla.edu
Local Variables:
mode: text
+coding: utf-8
End:
-----
return 0;
}
+ const char *input = NULL;
+
int
- main (void)
+ main (int argc, const char* argv[])
{
+ assert (argc == 2);
+ input = argv[1];
return yyparse ();
}
int
yylex (void)
{
- for (;;)
- {
- int ch;
- assert (!feof (stdin));
- ch = getchar ();
- if (ch == EOF)
- return 0;
- else if (ch == 'B' || ch == 'P')
- return ch;
- }
+ return *input++;
}
]])
AT_BISON_OPTION_POPDEFS
[glr-regr1.y: conflicts: 1 shift/reduce
])
AT_COMPILE([glr-regr1])
- AT_PARSER_CHECK([[echo BPBPB | ./glr-regr1]], 0,
+ AT_PARSER_CHECK([[./glr-regr1 BPBPB]], 0,
[[E -> 'B'
E -> 'B'
E -> E 'P' E
])
AT_COMPILE([glr-regr2a])
- AT_PARSER_CHECK([[echo s VARIABLE_1 t v x q | ./glr-regr2a]], 0,
+ AT_DATA([input1.txt],
+ [[s VARIABLE_1 t v x q
+ ]])
+ AT_PARSER_CHECK([[./glr-regr2a input1.txt]], 0,
[[Variable: 'VARIABLE_1'
- ]], [])
- AT_PARSER_CHECK([[echo s VARIABLE_1 , ANOTHER_VARIABLE_2 t e | ./glr-regr2a]],
+ ]])
+
+ AT_DATA([input2.txt],
+ [[s VARIABLE_1 , ANOTHER_VARIABLE_2 t e
+ ]])
+ AT_PARSER_CHECK([[./glr-regr2a input2.txt]],
0,
[[Varlist: 'VARIABLE_1,ANOTHER_VARIABLE_2'
]])
- AT_PARSER_CHECK([[echo s VARIABLE_3 t v x | ./glr-regr2a]], 0,
+
+ AT_DATA([input3.txt],
+ [[s VARIABLE_3 t v x
+ ]])
+ AT_PARSER_CHECK([[./glr-regr2a input3.txt]], 0,
[[Variable: 'VARIABLE_3'
- ]], [])
+ ]])
AT_CLEANUP
])
AT_COMPILE([glr-regr3])
- AT_PARSER_CHECK([[echo p1 t4 o2 p1 p1 t1 o1 t2 p2 o1 t3 p2 p2 | ./glr-regr3]],
+ AT_DATA([input.txt],
+ [[p1 t4 o2 p1 p1 t1 o1 t2 p2 o1 t3 p2 p2
+ ]])
+ AT_PARSER_CHECK([[./glr-regr3 input.txt]],
0,
[[Result: 1c04
- ]], [])
+ ]])
AT_CLEANUP
AT_BISON_OPTION_POPDEFS
AT_BISON_CHECK([[-o glr-regr18.c glr-regr18.y]], 1, [],
-[glr-regr18.y:26.18-24: result type clash on merge function 'merge': <type2> != <type1>
-glr-regr18.y:25.18-24: previous declaration
-glr-regr18.y:27.13-19: result type clash on merge function 'merge': <type3> != <type2>
-glr-regr18.y:26.18-24: previous declaration
+[glr-regr18.y:26.18-24: error: result type clash on merge function 'merge': <type2> != <type1>
+glr-regr18.y:25.18-24: previous declaration
+glr-regr18.y:27.13-19: error: result type clash on merge function 'merge': <type3> != <type2>
+glr-regr18.y:26.18-24: previous declaration
])
AT_CLEANUP
# self-contained, and can be compiled by a C++ compiler.
m4_pushdef([AT_TEST],
[AT_BISON_OPTION_PUSHDEFS([%define api.prefix "$1_" $2])
-AT_DATA_GRAMMAR([$1.AT_SKEL_CC_IF([yy], [y])],
+AT_DATA_GRAMMAR([$1.y],
[[%define api.prefix "$1_"
$2
%error-verbose
]AT_YYLEX_DEFINE(["$1"])[
]])
-AT_BISON_CHECK([-d -o AT_SKEL_CC_IF([$1.cc $1.yy], [$1.c $1.y])])
+AT_BISON_CHECK([-d -o $1.AT_SKEL_CC_IF([cc], [c]) $1.y])
- # Check there is no 'yy' left.
- # C++ output relies on namespaces and still uses yy a lot.
- AT_SKEL_CC_IF([],
- [AT_CHECK([$EGREP yy $1.h], [1])])
-
- # Check there is not 'YY' left.
- # Ignore comments, YYPARSE_PARAM (obsolete), YYPUSH_MORE(_DEFINED)?
- # (constant definition), YY_\w+_INCLUDED (header guards).
- #
- # YYDEBUG (not renamed) can be read, but not changed.
- AT_CHECK([[sed -ne 's,/\*[^*]*\*/,,g;s,//.*,,' \
- -e '/YY/p' ]$1.AT_SKEL_CC_IF([hh], [h])[ |
- $EGREP -wv 'YY(PARSE_PARAM|PUSH_MORE(_DEFINED)?|_[0-9A-Z_]+_INCLUDED)|(defined|if) YYDEBUG']],
- [1])
-
AT_LANG_COMPILE([$1.o])
AT_CHECK([[echo "$1" >>expout]])
AT_TEST([x8], [%define api.pure %define api.push-pull both])
#AT_TEST([x5], [%locations %language "c++" %glr-parser])
+ # Check there is no 'yy' left.
+ # C++ output relies on namespaces and still uses yy a lot.
+ #
+ # Check there is no 'YY' left.
+ # Ignore comments, YYPARSE_PARAM (obsolete), YYPUSH_MORE(_DEFINED)?
+ # (constant definition), YY_\w+_INCLUDED (header guards).
+ #
+ # YYDEBUG (not renamed) can be read, but not changed.
+ AT_CHECK([[$PERL -n -0777 -e '
+ s{/\*.*?\*/}{}gs;
+ s{//.*}{}g;
+ s{\b(YYPARSE_PARAM
+ |YYPUSH_MORE(_DEFINED)?
+ |YY_\w+_INCLUDED
+ |YY_NULL
+ |(defined|if)\ YYDEBUG
+ )\b}{}gx;
+ while (/^(.*YY.*)$/gm)
+ {
+ print "$ARGV: $1\n";
+ }
+ if ($ARGV =~ /\.h$/)
+ {
+ while (/^(.*yy.*)$/gm)
+ {
+ print "$ARGV: $1\n";
+ }
+ }
+ ' -- *.hh *.h]])
+
# Check that the headers are self-contained, and protected against
# multiple inclusions. While at it, check they are sane for C++.
for h in *.h *.hh
AT_SKIP_IF_CANNOT_LINK_C_AND_CXX
AT_COMPILE_CXX([parser], [[x[1-8].o -DCC_IS_CXX=$CC_IS_CXX main.cc]])
- AT_CHECK([./parser], [0], [[expout]])
+ AT_PARSER_CHECK([./parser], [0], [[expout]])
m4_popdef([AT_TEST])
m4_pushdef([AT_LOCATION_IF],
[m4_bmatch([$3], [%locations], [$1], [$2])])
m4_pushdef([AT_LOCATION_TYPE_IF],
-[m4_bmatch([$3], [%define location_type], [$1], [$2])])
+[m4_bmatch([$3], [%define \(api\.location\.type\|location_type\)], [$1], [$2])])
m4_pushdef([AT_PARAM_IF],
[m4_bmatch([$3], [%parse-param], [$1], [$2])])
# Comma-terminated list of formals parse-parameters.
AT_COMPILE_CXX([cxx-only.o], [cxx-only.cc])
AT_CHECK([$CXX $CXXFLAGS $CPPFLAGS $LDFLAGS c-only.o cxx-only.o -o c-and-cxx ||
exit 77], [ignore], [ignore])
- AT_CHECK([./c-and-cxx])
+ AT_PARSER_CHECK([./c-and-cxx])
])
+## ---------------- ##
+## Invalid inputs. ##
+## ---------------- ##
+
+
+AT_SETUP([Invalid inputs])
+
+AT_DATA([input.y],
+[[%%
+?
+default: 'a' }
+%&
+%a-does-not-exist
+%-
+%{
+]])
+
+AT_BISON_CHECK([input.y], [1], [],
+[[input.y:2.1: error: invalid character: '?'
+input.y:3.14: error: invalid character: '}'
+input.y:4.1: error: invalid character: '%'
+input.y:4.2: error: invalid character: '&'
+input.y:5.1-17: error: invalid directive: '%a-does-not-exist'
+input.y:6.1: error: invalid character: '%'
+input.y:6.2: error: invalid character: '-'
+input.y:7.1-8.0: error: missing '%}' at end of file
+input.y:7.1-8.0: error: syntax error, unexpected %{...%}
+]])
+
+AT_CLEANUP
+
+
+AT_SETUP([Invalid inputs with {}])
+
+AT_DATA([input.y],
+[[
+%destructor
+%initial-action
+%lex-param
+%parse-param
+%printer
+%union
+]])
+
+AT_BISON_CHECK([input.y], [1], [],
+[[input.y:3.1-15: error: syntax error, unexpected %initial-action, expecting {...}
+]])
+
+AT_CLEANUP
+
+
+
## ------------------- ##
## Token definitions. ##
## ------------------- ##
]])
AT_FULL_COMPILE([input])
- AT_CHECK([./input], 0, [[x: 1, y: 2
+ AT_PARSER_CHECK([./input], 0, [[x: 1, y: 2
]])
AT_BISON_OPTION_POPDEFS