| # Checking Push Parsing. -*- Autotest -*- |
| |
| # Copyright (C) 2007, 2009-2012 Free Software Foundation, Inc. |
| |
| # This program is free software: you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation, either version 3 of the License, or |
| # (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| |
| AT_BANNER([[Push Parsing Tests]]) |
| |
| ## -------------------------------- ## |
| ## Memory Leak for Early Deletion. ## |
| ## -------------------------------- ## |
| |
| AT_SETUP([[Memory Leak for Early Deletion]]) |
| |
| # Requires Valgrind. |
| AT_BISON_OPTION_PUSHDEFS |
| AT_DATA_GRAMMAR([[input.y]], |
| [[ |
| %{ |
| #include <assert.h> |
| #include <stdio.h> |
| #define YYINITDEPTH 1 |
| ]AT_YYERROR_DECLARE[ |
| %} |
| |
| %define api.pure |
| %define api.push-pull push |
| |
| %% |
| |
| start: 'a' 'b' 'c' ; |
| |
| %% |
| |
| ]AT_YYERROR_DEFINE[ |
| |
| int |
| main (void) |
| { |
| yypstate *ps; |
| |
| /* Make sure we don't try to free ps->yyss in this case. */ |
| ps = yypstate_new (); |
| yypstate_delete (ps); |
| |
| /* yypstate_delete used to leak ps->yyss if the stack was reallocated but the |
| parse did not return on success, syntax error, or memory exhaustion. */ |
| ps = yypstate_new (); |
| assert (yypush_parse (ps, 'a', YY_NULL) == YYPUSH_MORE); |
| yypstate_delete (ps); |
| |
| ps = yypstate_new (); |
| assert (yypush_parse (ps, 'a', YY_NULL) == YYPUSH_MORE); |
| assert (yypush_parse (ps, 'b', YY_NULL) == YYPUSH_MORE); |
| yypstate_delete (ps); |
| |
| return 0; |
| } |
| ]]) |
| AT_BISON_OPTION_POPDEFS |
| |
| AT_BISON_CHECK([[-o input.c input.y]]) |
| AT_COMPILE([[input]]) |
| AT_PARSER_CHECK([[./input]]) |
| |
| AT_CLEANUP |
| |
| ## --------------------------- ## |
| ## Multiple impure instances. ## |
| ## --------------------------- ## |
| |
| AT_SETUP([[Multiple impure instances]]) |
| |
| m4_pushdef([AT_MULTIPLE_IMPURE_INSTANCES_CHECK], [ |
| AT_BISON_OPTION_PUSHDEFS([%define api.push-pull $1]) |
| AT_DATA_GRAMMAR([[input.y]], |
| [[ |
| %{ |
| #include <assert.h> |
| #include <stdio.h> |
| ]AT_YYERROR_DECLARE[ |
| ]m4_if([$1], [[both]], [AT_YYLEX_DECLARE([])])[ |
| %} |
| |
| %define api.push-pull ]$1[ |
| |
| %% |
| |
| start: ; |
| |
| %% |
| ]AT_YYERROR_DEFINE[ |
| ]m4_if([$1], [[both]], [AT_YYLEX_DEFINE])[ |
| |
| int |
| main (void) |
| { |
| int i; |
| for (i = 0; i < 2; ++i) |
| { |
| yypstate *ps = yypstate_new (); |
| assert (ps); |
| assert (yypstate_new () == YY_NULL); |
| ]m4_if([$1], [[both]], [[assert (yyparse () == 2)]])[; |
| yychar = 0; |
| assert (yypush_parse (ps) == 0); |
| assert (yypstate_new () == YY_NULL); |
| ]m4_if([$1], [[both]], [[assert (yyparse () == 2)]])[; |
| yypstate_delete (ps); |
| } |
| |
| return 0; |
| } |
| ]]) |
| |
| AT_BISON_CHECK([[-o input.c input.y]]) |
| AT_COMPILE([[input]]) |
| AT_PARSER_CHECK([[./input]]) |
| AT_BISON_OPTION_POPDEFS |
| ]) |
| |
| AT_MULTIPLE_IMPURE_INSTANCES_CHECK([[both]]) |
| AT_MULTIPLE_IMPURE_INSTANCES_CHECK([[push]]) |
| |
| m4_popdef([AT_MULTIPLE_IMPURE_INSTANCES_CHECK]) |
| |
| AT_CLEANUP |
| |
| ## ----------------------- ## |
| ## Unsupported Skeletons. ## |
| ## ----------------------- ## |
| |
| AT_SETUP([[Unsupported Skeletons]]) |
| |
| AT_BISON_OPTION_PUSHDEFS |
| AT_DATA([[input.y]], |
| [[%glr-parser |
| %define api.push-pull push |
| %% |
| start: ; |
| ]]) |
| AT_BISON_OPTION_POPDEFS |
| |
| AT_BISON_CHECK([[input.y]], [[1]], [], |
| [[input.y:2.9-21: error: %define variable 'api.push-pull' is not used |
| ]]) |
| |
| AT_CLEANUP |