# Checking Push Parsing. -*- Autotest -*- # Copyright (C) 2007 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]]) ## ---------------------------------------------- ## ## Push Parsing: Memory Leak for Early Deletion. ## ## ---------------------------------------------- ## AT_SETUP([[Push Parsing: 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', NULL) == YYPUSH_MORE); yypstate_delete (ps); ps = yypstate_new (); assert (yypush_parse (ps, 'a', NULL) == YYPUSH_MORE); assert (yypush_parse (ps, 'b', NULL) == YYPUSH_MORE); yypstate_delete (ps); return 0; } ]]) AT_CHECK([[bison -o input.c input.y]]) AT_COMPILE([[input]]) AT_PARSER_CHECK([[./input]]) AT_CLEANUP ## ----------------------------------------- ## ## Push Parsing: Multiple impure instances. ## ## ----------------------------------------- ## AT_SETUP([[Push Parsing: Multiple impure instances]]) AT_DATA_GRAMMAR([[input.y]], [[ %{ #include #include void yyerror (char const *msg); int yylex (void); %} %define api.push_pull "both" %% 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 () == NULL); assert (yyparse () == 2); yychar = 0; assert (yypush_parse (ps) == 0); assert (yypstate_new () == NULL); assert (yyparse () == 2); yypstate_delete (ps); } return 0; } ]]) AT_CHECK([[bison -o input.c input.y]]) AT_COMPILE([[input]]) AT_PARSER_CHECK([[./input]], 0, [], [[cannot allocate multiple impure push-parser instances cannot allocate multiple impure push-parser instances cannot allocate multiple impure push-parser instances cannot allocate multiple impure push-parser instances cannot allocate multiple impure push-parser instances cannot allocate multiple impure push-parser instances cannot allocate multiple impure push-parser instances cannot allocate multiple impure push-parser instances ]]) AT_CLEANUP ## ------------------------------------- ## ## Push Parsing: Unsupported Skeletons. ## ## ------------------------------------- ## AT_SETUP([[Push Parsing: Unsupported Skeletons]]) AT_DATA([[input.y]], [[%glr-parser %define api.push_pull "push" %% start: ; ]]) AT_CHECK([[bison input.y]], [0], [], [[input.y:2.9-21: warning: %define variable `api.push_pull' is not used ]]) AT_CLEANUP