# 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 . AT_BANNER([[Push Parsing Tests]]) ## -------------------------------- ## ## Memory Leak for Early Deletion. ## ## -------------------------------- ## AT_SETUP([[Memory Leak for Early Deletion]]) # Requires Valgrind. AT_DATA_GRAMMAR([[input.y]], [[ %{ #include #include #define YYINITDEPTH 1 void yyerror (char const *msg); %} %define api.pure %define api.push-pull push %% start: 'a' 'b' 'c' ; %% void yyerror (char const *msg) { fprintf (stderr, "%s\n", msg); } 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_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_DATA_GRAMMAR([[input.y]], [[ %{ #include #include void yyerror (char const *msg); int yylex (void); %} %define api.push-pull ]$1[ %% start: ; %% void yyerror (char const *msg) { fprintf (stderr, "%s\n", msg); } int yylex (void) { return 0; } int main (void) { yypstate *ps; int i; for (i = 0; i < 2; ++i) { 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_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_DATA([[input.y]], [[%glr-parser %define api.push-pull push %% start: ; ]]) AT_BISON_CHECK([[input.y]], [[1]], [], [[input.y:2.9-21: %define variable 'api.push-pull' is not used ]]) AT_CLEANUP