1 # Checking Push Parsing. -*- Autotest -*- 2 3 # Copyright (C) 2007, 2009-2012 Free Software Foundation, Inc. 4 5 # This program is free software: you can redistribute it and/or modify 6 # it under the terms of the GNU General Public License as published by 7 # the Free Software Foundation, either version 3 of the License, or 8 # (at your option) any later version. 9 # 10 # This program is distributed in the hope that it will be useful, 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 # GNU General Public License for more details. 14 # 15 # You should have received a copy of the GNU General Public License 16 # along with this program. If not, see <http://www.gnu.org/licenses/>. 17 18 AT_BANNER([[Push Parsing Tests]]) 19 20 ## -------------------------------- ## 21 ## Memory Leak for Early Deletion. ## 22 ## -------------------------------- ## 23 24 AT_SETUP([[Memory Leak for Early Deletion]]) 25 26 # Requires Valgrind. 27 AT_BISON_OPTION_PUSHDEFS 28 AT_DATA_GRAMMAR([[input.y]], 29 [[ 30 %{ 31 #include <assert.h> 32 #include <stdio.h> 33 #define YYINITDEPTH 1 34 ]AT_YYERROR_DECLARE[ 35 %} 36 37 %define api.pure 38 %define api.push-pull push 39 40 %% 41 42 start: 'a' 'b' 'c' ; 43 44 %% 45 46 ]AT_YYERROR_DEFINE[ 47 48 int 49 main (void) 50 { 51 yypstate *ps; 52 53 /* Make sure we don't try to free ps->yyss in this case. */ 54 ps = yypstate_new (); 55 yypstate_delete (ps); 56 57 /* yypstate_delete used to leak ps->yyss if the stack was reallocated but the 58 parse did not return on success, syntax error, or memory exhaustion. */ 59 ps = yypstate_new (); 60 assert (yypush_parse (ps, 'a', YY_NULL) == YYPUSH_MORE); 61 yypstate_delete (ps); 62 63 ps = yypstate_new (); 64 assert (yypush_parse (ps, 'a', YY_NULL) == YYPUSH_MORE); 65 assert (yypush_parse (ps, 'b', YY_NULL) == YYPUSH_MORE); 66 yypstate_delete (ps); 67 68 return 0; 69 } 70 ]]) 71 AT_BISON_OPTION_POPDEFS 72 73 AT_BISON_CHECK([[-o input.c input.y]]) 74 AT_COMPILE([[input]]) 75 AT_PARSER_CHECK([[./input]]) 76 77 AT_CLEANUP 78 79 ## --------------------------- ## 80 ## Multiple impure instances. ## 81 ## --------------------------- ## 82 83 AT_SETUP([[Multiple impure instances]]) 84 85 m4_pushdef([AT_MULTIPLE_IMPURE_INSTANCES_CHECK], [ 86 AT_BISON_OPTION_PUSHDEFS([%define api.push-pull $1]) 87 AT_DATA_GRAMMAR([[input.y]], 88 [[ 89 %{ 90 #include <assert.h> 91 #include <stdio.h> 92 ]AT_YYERROR_DECLARE[ 93 ]m4_if([$1], [[both]], [AT_YYLEX_DECLARE([])])[ 94 %} 95 96 %define api.push-pull ]$1[ 97 98 %% 99 100 start: ; 101 102 %% 103 ]AT_YYERROR_DEFINE[ 104 ]m4_if([$1], [[both]], [AT_YYLEX_DEFINE])[ 105 106 int 107 main (void) 108 { 109 int i; 110 for (i = 0; i < 2; ++i) 111 { 112 yypstate *ps = yypstate_new (); 113 assert (ps); 114 assert (yypstate_new () == YY_NULL); 115 ]m4_if([$1], [[both]], [[assert (yyparse () == 2)]])[; 116 yychar = 0; 117 assert (yypush_parse (ps) == 0); 118 assert (yypstate_new () == YY_NULL); 119 ]m4_if([$1], [[both]], [[assert (yyparse () == 2)]])[; 120 yypstate_delete (ps); 121 } 122 123 return 0; 124 } 125 ]]) 126 127 AT_BISON_CHECK([[-o input.c input.y]]) 128 AT_COMPILE([[input]]) 129 AT_PARSER_CHECK([[./input]]) 130 AT_BISON_OPTION_POPDEFS 131 ]) 132 133 AT_MULTIPLE_IMPURE_INSTANCES_CHECK([[both]]) 134 AT_MULTIPLE_IMPURE_INSTANCES_CHECK([[push]]) 135 136 m4_popdef([AT_MULTIPLE_IMPURE_INSTANCES_CHECK]) 137 138 AT_CLEANUP 139 140 ## ----------------------- ## 141 ## Unsupported Skeletons. ## 142 ## ----------------------- ## 143 144 AT_SETUP([[Unsupported Skeletons]]) 145 146 AT_BISON_OPTION_PUSHDEFS 147 AT_DATA([[input.y]], 148 [[%glr-parser 149 %define api.push-pull push 150 %% 151 start: ; 152 ]]) 153 AT_BISON_OPTION_POPDEFS 154 155 AT_BISON_CHECK([[input.y]], [[1]], [], 156 [[input.y:2.9-21: error: %define variable 'api.push-pull' is not used 157 ]]) 158 159 AT_CLEANUP 160