X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/25005f6ab0c38e8106148648834389b787ad5877..9138c575d80fea7f2ca5106b55932e3f25d7be92:/tests/cxx-type.at diff --git a/tests/cxx-type.at b/tests/cxx-type.at index ded69471..b716a1d4 100644 --- a/tests/cxx-type.at +++ b/tests/cxx-type.at @@ -1,5 +1,5 @@ # Checking GLR Parsing. -*- Autotest -*- -# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2004, 2005, 2006 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 @@ -13,8 +13,8 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. AT_BANNER([[C++ Type Syntax (GLR).]]) @@ -34,12 +34,50 @@ $1 %{ #include - #define YYSTYPE const char* + union Node { + struct { + int isNterm; + int parents; + } nodeInfo; + struct { + int isNterm; /* 1 */ + int parents; + char const *form; + union Node *children[3]; + } nterm; + struct { + int isNterm; /* 0 */ + int parents; + char *text; + } term; + }; + typedef union Node Node; + static Node *new_nterm (char const *, Node *, Node *, Node *); + static Node *new_term (char *); + static void free_node (Node *); + static char *node_to_string (Node *); + #define YYSTYPE Node * ]m4_bmatch([$2], [stmtMerge], [ static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);])[ #define YYINITDEPTH 10 - static char* format (const char*, ...); - + #define YYSTACKEXPANDABLE 1 + struct YYLTYPE; +#if YYPURE +# if YYLSP_NEEDED +# define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp +# define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s +# else +# define LEX_PARAMETERS YYSTYPE *lvalp +# endif +#endif +#ifndef LEX_PARAMETERS +# define LEX_PARAMETERS void +#endif +#ifndef ERROR_PARAMETERS +# define ERROR_PARAMETERS char const *s +#endif + int yylex (LEX_PARAMETERS); + void yyerror (ERROR_PARAMETERS); %} %token TYPENAME ID @@ -49,34 +87,41 @@ $1 %glr-parser +%destructor { free_node ($$); } stmt expr decl declarator TYPENAME ID + %% prog : - | prog stmt { -]AT_LOCATION_IF([ - printf ("%d.%d-%d.%d: ", + | prog stmt { + char *output;]AT_LOCATION_IF([ + printf ("%d.%d-%d.%d: ", @2.first_line, @2.first_column, @2.last_line, @2.last_column);])[ - printf ("%s\n", ]$[2); + output = node_to_string (]$[2); + printf ("%s\n", output); + free (output); + free_node (]$[2); } ; stmt : expr ';' $2 { $$ = ]$[1; } | decl $3 - | error ';' { $$ = ""; } - | '@' { YYACCEPT; } + | error ';' { $$ = new_nterm ("", 0, 0, 0); } + | '@' { YYACCEPT; } ; expr : ID - | TYPENAME '(' expr ')' { $$ = format ("(%s,%s)", ]$[3, ]$[1); } - | expr '+' expr { $$ = format ("+(%s,%s)", ]$[1, ]$[3); } - | expr '=' expr { $$ = format ("=(%s,%s)", ]$[1, ]$[3); } + | TYPENAME '(' expr ')' + { $$ = new_nterm ("(%s,%s)", ]$[3, ]$[1, 0); } + | expr '+' expr { $$ = new_nterm ("+(%s,%s)", ]$[1, ]$[3, 0); } + | expr '=' expr { $$ = new_nterm ("=(%s,%s)", ]$[1, ]$[3, 0); } ; decl : TYPENAME declarator ';' - { $$ = format ("(%s,%s)", ]$[1, ]$[2); } + { $$ = new_nterm ("(%s,%s)", ]$[1, ]$[2, 0); } | TYPENAME declarator '=' expr ';' - { $$ = format ("(%s,%s,%s)", ]$[1, ]$[2, ]$[4); } + { $$ = new_nterm ("(%s,%s,%s)", ]$[1, + ]$[2, ]$[4); } ; declarator : ID @@ -91,33 +136,28 @@ declarator : ID #include int -main (int argc, char** argv) +main (int argc, char **argv) { if (argc != 2) abort (); if (!freopen (argv[1], "r", stdin)) - abort (); - exit (yyparse ()); + return 3; + return yyparse (); } int -#if YYPURE && YYLSP_NEEDED - yylex (YYSTYPE *lvalp, YYLTYPE *llocp) -#elif YYPURE - yylex (YYSTYPE *lvalp) -#else - yylex () -#endif +yylex (LEX_PARAMETERS) { char buffer[256]; int c; unsigned int i; static int lineNum = 1; - static int colNum = 1; - + static int colNum = 0; #if YYPURE +# undef yylloc # define yylloc (*llocp) +# undef yylval # define yylval (*lvalp) #endif @@ -129,20 +169,20 @@ int case EOF: return 0; case '\t': - colNum = 1 + ((colNum + 7) & ~7); + colNum = (colNum + 7) & ~7; break; case ' ': case '\f': colNum += 1; - break; - case '\n': + break; + case '\n': lineNum += 1; - colNum = 1; + colNum = 0; break; default: { int tok; #if YYLSP_NEEDED - yylloc.first_line = yylloc.last_line = lineNum; + yylloc.first_line = yylloc.last_line = lineNum; yylloc.first_column = colNum; #endif if (isalpha (c)) @@ -162,13 +202,13 @@ int ungetc (c, stdin); buffer[i++] = 0; tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID; - yylval = strcpy (malloc (i), buffer); + yylval = new_term (strcpy ((char *) malloc (i), buffer)); } - else + else { colNum += 1; tok = c; - yylval = ""; + yylval = 0; } #if YYLSP_NEEDED yylloc.last_column = colNum-1; @@ -179,27 +219,93 @@ int } } -int -yyerror ( +void +yyerror (ERROR_PARAMETERS) +{ #if YYPURE && YYLSP_NEEDED - YYLTYPE *llocp, + /* Pacify GCC by using llocp. */ + if (! llocp) + abort (); #endif - const char *s - ) -{ fprintf (stderr, "%s\n", s); - return 0; } +static Node * +new_nterm (char const *form, Node *child0, Node *child1, Node *child2) +{ + Node *node = (Node *) malloc (sizeof (Node)); + node->nterm.isNterm = 1; + node->nterm.parents = 0; + node->nterm.form = form; + node->nterm.children[0] = child0; + if (child0) + child0->nodeInfo.parents += 1; + node->nterm.children[1] = child1; + if (child1) + child1->nodeInfo.parents += 1; + node->nterm.children[2] = child2; + if (child2) + child2->nodeInfo.parents += 1; + return node; +} + +static Node * +new_term (char *text) +{ + Node *node = (Node *) malloc (sizeof (Node)); + node->term.isNterm = 0; + node->term.parents = 0; + node->term.text = text; + return node; +} + +static void +free_node (Node *node) +{ + if (!node) + return; + node->nodeInfo.parents -= 1; + /* Free only if 0 (last parent) or -1 (no parents). */ + if (node->nodeInfo.parents > 0) + return; + if (node->nodeInfo.isNterm == 1) + { + free_node (node->nterm.children[0]); + free_node (node->nterm.children[1]); + free_node (node->nterm.children[2]); + } + else + free (node->term.text); + free (node); +} -static char* format (const char* form, ...) +static char * +node_to_string (Node *node) { - char buffer[1024]; - va_list args; - va_start (args, form); - vsprintf (buffer, form, args); - va_end (args); - return strcpy (malloc (strlen (buffer) + 1), buffer); + char *child0; + char *child1; + char *child2; + char *buffer; + if (!node) + { + buffer = (char *) malloc (1); + buffer[0] = 0; + } + else if (node->nodeInfo.isNterm == 1) + { + child0 = node_to_string (node->nterm.children[0]); + child1 = node_to_string (node->nterm.children[1]); + child2 = node_to_string (node->nterm.children[2]); + buffer = (char *) malloc (strlen (node->nterm.form) + strlen (child0) + + strlen (child1) + strlen (child2) + 1); + sprintf (buffer, node->nterm.form, child0, child1, child2); + free (child0); + free (child1); + free (child2); + } + else + buffer = strdup (node->term.text); + return buffer; } ]] @@ -207,7 +313,7 @@ m4_bmatch([$2], [stmtMerge], [[static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1) { - return format ("(%s,%s)", x0, x1); + return new_nterm ("(%s,%s)", x0, x1, 0); } ]]) ) @@ -256,15 +362,15 @@ m4_define([_AT_RESOLVED_GLR_OUTPUT], ]]) m4_define([_AT_RESOLVED_GLR_OUTPUT_WITH_LOC], -[[3.1-3.6: +(z,q) -5.1-5.4: (T,x) -7.1-7.8: (T,x,y) -9.1-9.6: =(x,y) -11.1-11.10: +((x,T),y) -13.1-13.6: (T,x) -15.1-15.14: (T,y,+(z,q)) -17.6-17.16: -19.1-19.6: +(z,q) +[[3.0-3.5: +(z,q) +5.0-5.3: (T,x) +7.0-7.7: (T,x,y) +9.0-9.5: =(x,y) +11.0-11.9: +((x,T),y) +13.0-13.5: (T,x) +15.0-15.13: (T,y,+(z,q)) +17.0-17.15: +19.0-19.5: +(z,q) ]]) m4_define([_AT_AMBIG_GLR_OUTPUT], @@ -280,15 +386,15 @@ m4_define([_AT_AMBIG_GLR_OUTPUT], ]]) m4_define([_AT_AMBIG_GLR_OUTPUT_WITH_LOC], -[[3.1-3.6: +(z,q) -5.1-5.4: (T,x) -7.1-7.8: (T,x,y) -9.1-9.6: =(x,y) -11.1-11.10: +((x,T),y) -13.1-13.6: ((T,x),(x,T)) -15.1-15.14: ((T,y,+(z,q)),=((y,T),+(z,q))) -17.6-17.16: -19.1-19.6: +(z,q) +[[3.0-3.5: +(z,q) +5.0-5.3: (T,x) +7.0-7.7: (T,x,y) +9.0-9.5: =(x,y) +11.0-11.9: +((x,T),y) +13.0-13.5: ((T,x),(x,T)) +15.0-15.13: ((T,y,+(z,q)),=((y,T),+(z,q))) +17.0-17.15: +19.0-19.5: +(z,q) ]]) m4_define([_AT_GLR_STDERR], @@ -305,61 +411,61 @@ m4_define([_AT_VERBOSE_GLR_STDERR], AT_SETUP([GLR: Resolve ambiguity, impure, no locations]) _AT_TEST_GLR_CXXTYPES([], - [%dprec 1], [%dprec 2]) -AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, - _AT_RESOLVED_GLR_OUTPUT, _AT_GLR_STDERR) + [%dprec 1], [%dprec 2]) +AT_PARSER_CHECK([[./types test-input]], 0, + _AT_RESOLVED_GLR_OUTPUT, _AT_GLR_STDERR) AT_CLEANUP AT_SETUP([GLR: Resolve ambiguity, impure, locations]) _AT_TEST_GLR_CXXTYPES([%locations],[%dprec 1],[%dprec 2]) -AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, - _AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR) +AT_PARSER_CHECK([[./types test-input]], 0, + _AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR) AT_CLEANUP AT_SETUP([GLR: Resolve ambiguity, pure, no locations]) _AT_TEST_GLR_CXXTYPES([%pure-parser], - [%dprec 1], [%dprec 2]) -AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, - _AT_RESOLVED_GLR_OUTPUT, _AT_GLR_STDERR) + [%dprec 1], [%dprec 2]) +AT_PARSER_CHECK([[./types test-input]], 0, + _AT_RESOLVED_GLR_OUTPUT, _AT_GLR_STDERR) AT_CLEANUP AT_SETUP([GLR: Resolve ambiguity, pure, locations]) _AT_TEST_GLR_CXXTYPES([%pure-parser %locations], - [%dprec 1], [%dprec 2]) -AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, - _AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR) + [%dprec 1], [%dprec 2]) +AT_PARSER_CHECK([[./types test-input]], 0, + _AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR) AT_CLEANUP AT_SETUP([GLR: Merge conflicting parses, impure, no locations]) _AT_TEST_GLR_CXXTYPES([], - [%merge ], [%merge ]) -AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, - _AT_AMBIG_GLR_OUTPUT, _AT_GLR_STDERR) + [%merge ], [%merge ]) +AT_PARSER_CHECK([[./types test-input]], 0, + _AT_AMBIG_GLR_OUTPUT, _AT_GLR_STDERR) AT_CLEANUP AT_SETUP([GLR: Merge conflicting parses, impure, locations]) _AT_TEST_GLR_CXXTYPES([%locations], - [%merge ], [%merge ]) -AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, - _AT_AMBIG_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR) + [%merge ], [%merge ]) +AT_PARSER_CHECK([[./types test-input]], 0, + _AT_AMBIG_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR) AT_CLEANUP AT_SETUP([GLR: Merge conflicting parses, pure, no locations]) _AT_TEST_GLR_CXXTYPES([%pure-parser], - [%merge ], [%merge ]) -AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, - _AT_AMBIG_GLR_OUTPUT, _AT_GLR_STDERR) + [%merge ], [%merge ]) +AT_PARSER_CHECK([[./types test-input]], 0, + _AT_AMBIG_GLR_OUTPUT, _AT_GLR_STDERR) AT_CLEANUP AT_SETUP([GLR: Merge conflicting parses, pure, locations]) _AT_TEST_GLR_CXXTYPES([%pure-parser %locations], - [%merge ],[%merge ]) -AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, - _AT_AMBIG_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR) + [%merge ],[%merge ]) +AT_PARSER_CHECK([[./types test-input]], 0, + _AT_AMBIG_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR) AT_CLEANUP AT_SETUP([GLR: Verbose messages, resolve ambiguity, impure, no locations]) _AT_TEST_GLR_CXXTYPES([%error-verbose], - [%merge ], [%merge ]) -AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, - _AT_AMBIG_GLR_OUTPUT, _AT_VERBOSE_GLR_STDERR) + [%merge ], [%merge ]) +AT_PARSER_CHECK([[./types test-input]], 0, + _AT_AMBIG_GLR_OUTPUT, _AT_VERBOSE_GLR_STDERR) AT_CLEANUP