X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/12bebc0445dd46e15376edced8596bae96be78b6..fc8f2965383e318c8be2a20865edb7303f0420ee:/tests/cxx-type.at diff --git a/tests/cxx-type.at b/tests/cxx-type.at index c1555aef..89afc58a 100644 --- a/tests/cxx-type.at +++ b/tests/cxx-type.at @@ -1,5 +1,5 @@ -# Checking the output filenames. -*- Autotest -*- -# Copyright 2000, 2001 Free Software Foundation, Inc. +# Checking GLR Parsing. -*- Autotest -*- +# Copyright (C) 2002, 2003 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 @@ -18,22 +18,44 @@ AT_BANNER([[C++ Type Syntax (GLR).]]) -# _AT_TEST_GLR_CALC(`$1',DECL, RESOLVE1, RESOLVE2) -# (first argument is a literal $1; it's a trick). +# _AT_TEST_GLR_CXXTYPES(DECL, RESOLVE1, RESOLVE2) +# ----------------------------------------------- # Store into types.y the calc program, with DECL inserted as a declaration, # and with RESOLVE1 and RESOLVE2 as annotations on the conflicted rule for # stmt. Then compile the result. -m4_define([_AT_TEST_GLR_CALC], -[AT_DATA([types.y], -[[/* Simplified C++ Type and Expression Grammar */ +m4_define([_AT_TEST_GLR_CXXTYPES], +[ +AT_BISON_OPTION_PUSHDEFS([$1]) -$2 +AT_DATA_GRAMMAR([types.y], +[[/* Simplified C++ Type and Expression Grammar. */ + +$1 %{ #include - #define YYSTYPE const char* - static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1); + #define YYSTYPE char const * +]m4_bmatch([$2], [stmtMerge], +[ static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);])[ #define YYINITDEPTH 10 + static char *format (char const *, ...); + 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); + int yyerror (ERROR_PARAMETERS); %} %token TYPENAME ID @@ -45,85 +67,161 @@ $2 %% -prog : - | prog stmt { printf ("\n"); } +prog : + | prog stmt { +]AT_LOCATION_IF([ + printf ("%d.%d-%d.%d: ", + @2.first_line, @2.first_column, + @2.last_line, @2.last_column);])[ + printf ("%s\n", ]$[2); + } ; -stmt : expr ';' $3 - | decl $4 - | error ';' - | '@' { YYACCEPT; } +stmt : expr ';' $2 { $$ = ]$[1; } + | decl $3 + | error ';' { $$ = ""; } + | '@' { YYACCEPT; } ; -expr : ID { printf ("%s ", $$); } - | TYPENAME '(' expr ')' - { printf ("%s ", $1); } - | expr '+' expr { printf ("+ "); } - | expr '=' expr { printf ("= "); } +expr : ID + | TYPENAME '(' expr ')' { $$ = format ("(%s,%s)", ]$[3, ]$[1); } + | expr '+' expr { $$ = format ("+(%s,%s)", ]$[1, ]$[3); } + | expr '=' expr { $$ = format ("=(%s,%s)", ]$[1, ]$[3); } ; -decl : TYPENAME declarator ';' - { printf ("%s ", $1); } +decl : TYPENAME declarator ';' + { $$ = format ("(%s,%s)", ]$[1, ]$[2); } | TYPENAME declarator '=' expr ';' - { printf ("%s ", $1); } + { $$ = format ("(%s,%s,%s)", ]$[1, ]$[2, ]$[4); } ; -declarator : ID { printf ("\"%s\" ", $1); } - | '(' declarator ')' +declarator : ID + | '(' declarator ')' { $$ = ]$[2; } ; %% #include -#include +#include +#include +#include -main (int argc, char** argv) +int +main (int argc, char **argv) { - freopen (argv[1], "r", stdin); + if (argc != 2) + abort (); + if (!freopen (argv[1], "r", stdin)) + abort (); exit (yyparse ()); } -#if YYPURE -int yylex (YYSTYPE *lvalp) -#define yylval (*lvalp) -#else -int yylex () -#endif +int +yylex (LEX_PARAMETERS) { char buffer[256]; int c; - while (1) { - c = getchar (); - switch (c) { - case EOF: - return 0; - case ' ': case '\t': case '\n': case '\f': - break; - default: - if (isalpha (c)) { - ungetc (c, stdin); - scanf ("%[A-Za-z0-9_]", buffer); - yylval = strdup (buffer); - return isupper (buffer[0]) ? TYPENAME : ID; - } - return c; + unsigned int i; + static int lineNum = 1; + static int colNum = 1; + + +#if YYPURE +# define yylloc (*llocp) +# define yylval (*lvalp) +#endif + + while (1) + { + c = getchar (); + switch (c) + { + case EOF: + return 0; + case '\t': + colNum = 1 + ((colNum + 7) & ~7); + break; + case ' ': case '\f': + colNum += 1; + break; + case '\n': + lineNum += 1; + colNum = 1; + break; + default: + { + int tok; +#if YYLSP_NEEDED + yylloc.first_line = yylloc.last_line = lineNum; + yylloc.first_column = colNum; +#endif + if (isalpha (c)) + { + i = 0; + + do + { + buffer[i++] = c; + colNum += 1; + if (i == sizeof buffer - 1) + abort (); + c = getchar (); + } + while (isalnum (c) || c == '_'); + + ungetc (c, stdin); + buffer[i++] = 0; + tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID; + yylval = strcpy (malloc (i), buffer); + } + else + { + colNum += 1; + tok = c; + yylval = ""; + } +#if YYLSP_NEEDED + yylloc.last_column = colNum-1; +#endif + return tok; + } + } } - } } int -yyerror (const char *s) +yyerror (ERROR_PARAMETERS) { +#if YYPURE && YYLSP_NEEDED + /* Pacify GCC by using llocp. */ + if (! llocp) + abort (); +#endif fprintf (stderr, "%s\n", s); return 0; } -static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1) + +static char * +format (char const *form, ...) +{ + char buffer[1024]; + va_list args; + va_start (args, form); + vsprintf (buffer, form, args); + va_end (args); + return strcpy (malloc (strlen (buffer) + 1), buffer); +} + +]] +m4_bmatch([$2], [stmtMerge], +[[static YYSTYPE +stmtMerge (YYSTYPE x0, YYSTYPE x1) { - printf (" "); - return ""; + return format ("(%s,%s)", x0, x1); } ]]) +) AT_DATA([test-input], [[ @@ -151,40 +249,65 @@ z + q; This is total garbage, but it should be ignored. ]]) -AT_CHECK([bison types.y], 0, [], ignore) -AT_CHECK([gcc -o types types.tab.c], 0, [], ignore) +AT_CHECK([bison -o types.c types.y], 0, [], ignore) +AT_COMPILE([types]) +AT_BISON_OPTION_POPDEFS ]) m4_define([_AT_RESOLVED_GLR_OUTPUT], -[[z q + -"x" T -"x" y T -x y = -x T y + -"x" T -"y" z q + T -y -z q + +[[+(z,q) +(T,x) +(T,x,y) +=(x,y) ++((x,T),y) +(T,x) +(T,y,+(z,q)) + ++(z,q) +]]) + +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) ]]) m4_define([_AT_AMBIG_GLR_OUTPUT], -[[z q + -"x" T -"x" y T -x y = -x T y + -"x" T x T -"y" z q + T y T z q + = -y -z q + +[[+(z,q) +(T,x) +(T,x,y) +=(x,y) ++((x,T),y) +((T,x),(x,T)) +((T,y,+(z,q)),=((y,T),+(z,q))) + ++(z,q) +]]) + +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) ]]) -m4_define([_AT_GLR_STDERR], -[[parse error +m4_define([_AT_GLR_STDERR], +[[syntax error ]]) -m4_define([_AT_VERBOSE_GLR_STDERR], -[[parse error, unexpected ID, expecting '=' or '+' or ')' +m4_define([_AT_VERBOSE_GLR_STDERR], +[[syntax error, unexpected ID, expecting '=' or '+' or ')' ]]) ## ---------------------------------------------------- ## @@ -192,57 +315,62 @@ m4_define([_AT_VERBOSE_GLR_STDERR], ## ---------------------------------------------------- ## AT_SETUP([GLR: Resolve ambiguity, impure, no locations]) -_AT_TEST_GLR_CALC([$1],[],[%dprec 1],[%dprec 2]) -AT_CHECK([[./types test-input | sed 's/ *$//']], 0, _AT_RESOLVED_GLR_OUTPUT, - _AT_GLR_STDERR) +_AT_TEST_GLR_CXXTYPES([], + [%dprec 1], [%dprec 2]) +AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, + _AT_RESOLVED_GLR_OUTPUT, _AT_GLR_STDERR) AT_CLEANUP AT_SETUP([GLR: Resolve ambiguity, impure, locations]) -_AT_TEST_GLR_CALC([$1],[%locations],[%dprec 1],[%dprec 2]) -AT_CHECK([[./types test-input | sed 's/ *$//']], 0, _AT_RESOLVED_GLR_OUTPUT, - _AT_GLR_STDERR) +_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_CLEANUP AT_SETUP([GLR: Resolve ambiguity, pure, no locations]) -_AT_TEST_GLR_CALC([$1],[%pure-parser],[%dprec 1],[%dprec 2]) -AT_CHECK([[./types test-input | sed 's/ *$//']], 0, _AT_RESOLVED_GLR_OUTPUT, - _AT_GLR_STDERR) +_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) AT_CLEANUP AT_SETUP([GLR: Resolve ambiguity, pure, locations]) -_AT_TEST_GLR_CALC([$1],[%pure-parser -%locations],[%dprec 1],[%dprec 2]) -AT_CHECK([[./types test-input | sed 's/ *$//']], 0, _AT_RESOLVED_GLR_OUTPUT, - _AT_GLR_STDERR) +_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) AT_CLEANUP AT_SETUP([GLR: Merge conflicting parses, impure, no locations]) -_AT_TEST_GLR_CALC([$1],[],[%merge ],[%merge ]) -AT_CHECK([[./types test-input | sed 's/ *$//']], 0, _AT_AMBIG_GLR_OUTPUT, - _AT_GLR_STDERR) +_AT_TEST_GLR_CXXTYPES([], + [%merge ], [%merge ]) +AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, + _AT_AMBIG_GLR_OUTPUT, _AT_GLR_STDERR) AT_CLEANUP AT_SETUP([GLR: Merge conflicting parses, impure, locations]) -_AT_TEST_GLR_CALC([$1],[%locations],[%merge ],[%merge ]) -AT_CHECK([[./types test-input | sed 's/ *$//']], 0, _AT_AMBIG_GLR_OUTPUT, - _AT_GLR_STDERR) +_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) AT_CLEANUP AT_SETUP([GLR: Merge conflicting parses, pure, no locations]) -_AT_TEST_GLR_CALC([$1],[%pure-parser],[%merge ],[%merge ]) -AT_CHECK([[./types test-input | sed 's/ *$//']], 0, _AT_AMBIG_GLR_OUTPUT, - _AT_GLR_STDERR) +_AT_TEST_GLR_CXXTYPES([%pure-parser], + [%merge ], [%merge ]) +AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, + _AT_AMBIG_GLR_OUTPUT, _AT_GLR_STDERR) AT_CLEANUP AT_SETUP([GLR: Merge conflicting parses, pure, locations]) -_AT_TEST_GLR_CALC([$1],[%pure-parser -%locations],[%merge ],[%merge ]) -AT_CHECK([[./types test-input | sed 's/ *$//']], 0, _AT_AMBIG_GLR_OUTPUT, - _AT_GLR_STDERR) +_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) AT_CLEANUP AT_SETUP([GLR: Verbose messages, resolve ambiguity, impure, no locations]) -_AT_TEST_GLR_CALC([$1],[%error-verbose], -[%merge ],[%merge ]) -AT_CHECK([[./types test-input | sed 's/ *$//']], 0, - _AT_AMBIG_GLR_OUTPUT, _AT_VERBOSE_GLR_STDERR) +_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) AT_CLEANUP