]> git.saurik.com Git - bison.git/blobdiff - tests/calc.at
Mention the "yacc" command in the synopsis.
[bison.git] / tests / calc.at
index 82674c10071fd25184c6f575230cbc66430e4555..7cf12d39e9c064537dfed544a22f8912168217d7 100644 (file)
 m4_define([_AT_DATA_CALC_Y],
 [m4_if([$1$2$3], $[1]$[2]$[3], [],
        [m4_fatal([$0: Invalid arguments: $@])])dnl
-AT_DATA([calc.y],
+AT_DATA_GRAMMAR([calc.y],
 [[/* Infix notation calculator--calc */
 ]$4[
 %{
-#include <config.h>
-/* We don't need perfect functions for these tests. */
-#undef malloc
-#undef memcmp
-#undef realloc
 #include <stdio.h>
 
 #if STDC_HEADERS
@@ -51,22 +46,21 @@ AT_DATA([calc.y],
 # include <string.h>
 #endif
 #include <ctype.h>
-#include <assert.h>
 
 extern void perror (const char *s);
 
 /* Exercise pre-prologue dependency to %union.  */
-typedef int value_t;
+typedef int value;
 
-value_t global_result = 0;
-int global_count = 0;
+static value global_result = 0;
+static int global_count = 0;
 
 %}
 
 /* Exercise %union. */
 %union
 {
-  value_t ival;
+  value ival;
 };
 
 %{
@@ -100,9 +94,9 @@ static int power (int base, int exponent);
 /* yyerror receives the location if:
    - %location & %pure & %glr
    - %location & %pure & %yacc & %parse-param. */
-static void yyerror (const char *s
-                     ]AT_YYERROR_ARG_LOC_IF([, YYLTYPE *yylloc])[
-                     ]AT_PARAM_IF([, value_t *result, int *count])[
+static void yyerror (]AT_YYERROR_ARG_LOC_IF([YYLTYPE *yylloc, ])[
+                     ]AT_PARAM_IF([value *result, int *count, ])[
+                     const char *s
                      );
 static int yylex (LEX_FORMALS);
 static int yygetc (LEX_FORMALS);
@@ -151,13 +145,15 @@ exp:
 ;
 %%
 /* The input. */
-FILE *yyin;
+static FILE *yyin;
 
 static void
-yyerror (const char *s
-         ]AT_YYERROR_ARG_LOC_IF([, YYLTYPE *yylloc])[
-         ]AT_PARAM_IF([, value_t *result, int *count])[)
+yyerror (]AT_YYERROR_ARG_LOC_IF([YYLTYPE *yylloc, ])[
+         ]AT_PARAM_IF([value *result, int *count, ])[
+         const char *s
+         )
 {
+]AT_PARAM_IF([(void) result; (void) count; ])[
 ]AT_YYERROR_SEES_LOC_IF([
   fprintf (stderr, "%d.%d-%d.%d: ",
           LOC.first_line, LOC.first_column,
@@ -292,9 +288,9 @@ power (int base, int exponent)
 int
 main (int argc, const char **argv)
 {
-  value_t result = 0;
+  value result = 0;
   int count = 0;
-  yyin = NULL;
+  int status;
 
   if (argc == 2)
     yyin = fopen (argv[1], "r");
@@ -310,11 +306,12 @@ main (int argc, const char **argv)
 #if YYDEBUG
   yydebug = 1;
 #endif
-  yyparse (]AT_PARAM_IF([&result, &count])[);
-  assert (global_result == result);
-  assert (global_count  == count);
-
-  return 0;
+  status = yyparse (]AT_PARAM_IF([&result, &count])[);
+  if (global_result != result)
+    abort ();
+  if (global_count != count)
+    abort ();
+  return status;
 }
 ]])
 ])# _AT_DATA_CALC_Y
@@ -352,10 +349,11 @@ m4_bmatch([$1],
 ])
 
 
-# _AT_CHECK_CALC_ERROR(BISON-OPTIONS, INPUT, [NUM-DEBUG-LINES],
+# _AT_CHECK_CALC_ERROR(BISON-OPTIONS, EXIT-STATUS, INPUT,
+#                      [NUM-DEBUG-LINES],
 #                      [VERBOSE-AND-LOCATED-ERROR-MESSAGE])
-# -------------------------------------------------------------
-# Run `calc' on INPUT, and expect a `parse error' message.
+# ---------------------------------------------------------
+# Run `calc' on INPUT, and expect a `syntax error' message.
 #
 # If INPUT starts with a slash, it is used as absolute input file name,
 # otherwise as contents.
@@ -364,23 +362,23 @@ m4_bmatch([$1],
 # is correctly output on stderr.
 #
 # If BISON-OPTIONS contains `%error-verbose', then make sure the
-# IF-YYERROR-VERBOSE message is properly output after `parse error, '
+# IF-YYERROR-VERBOSE message is properly output after `syntax error, '
 # on STDERR.
 #
 # If BISON-OPTIONS contains `%debug' but not `%glr', then NUM-STDERR-LINES
 # is the number of expected lines on stderr.
 m4_define([_AT_CHECK_CALC_ERROR],
-[m4_bmatch([$2], [^/],
-           [AT_PARSER_CHECK([./calc $2], 0, [], [stderr])],
+[m4_bmatch([$3], [^/],
+           [AT_PARSER_CHECK([./calc $3], $2, [], [stderr])],
            [AT_DATA([[input]],
-[[$2
+[[$3
 ]])
-AT_PARSER_CHECK([./calc input], 0, [], [stderr])])
+AT_PARSER_CHECK([./calc input], $2, [], [stderr])])
 m4_bmatch([$1],
   [%debug.*%glr\|%glr.*%debug],
      [],
   [%debug],
-     [AT_CHECK([wc -l <stderr | sed 's/[[^0-9]]//g'], 0, [$3
+     [AT_CHECK([wc -l <stderr | sed 's/[[^0-9]]//g'], 0, [$4
 ])])
 
 # Normalize the observed and expected error messages, depending upon the
@@ -400,7 +398,7 @@ sed '/^Starting/d
 mv at-stderr stderr
 # 2. Create the reference error message.
 AT_DATA([[expout]],
-[$4
+[$5
 ])
 # 3. If locations are not used, remove them.
 AT_YYERROR_SEES_LOC_IF([],
@@ -408,7 +406,7 @@ AT_YYERROR_SEES_LOC_IF([],
 mv at-expout expout]])
 # 4. If error-verbose is not used, strip the`, unexpected....' part.
 m4_bmatch([$1], [%error-verbose], [],
-[[sed 's/parse error, .*$/parse error/' expout >at-expout
+[[sed 's/syntax error, .*$/syntax error/' expout >at-expout
 mv at-expout expout]])
 # 5. Check
 AT_CHECK([cat stderr], 0, [expout])
@@ -441,10 +439,11 @@ m4_pushdef([AT_GLR_OR_PARAM_IF],
 m4_pushdef([AT_YYERROR_ARG_LOC_IF],
 [AT_GLR_OR_PARAM_IF([AT_PURE_AND_LOC_IF([$1], [$2])],
                     [$2])])
-# yyerror cannot see the locations if !glr & pure.
+# yyerror cannot see the locations if !glr & pure & !param.
 m4_pushdef([AT_YYERROR_SEES_LOC_IF],
 [AT_LOCATION_IF([AT_GLR_IF([$1],
-                           [AT_PURE_IF([$2], [$1])])],
+                           [AT_PURE_IF([AT_PARAM_IF([$1], [$2])],
+                                       [$1])])],
                 [$2])])
 ])
 
@@ -498,30 +497,30 @@ _AT_CHECK_CALC([$1],
 (2^2)^3 = 64],
                [486])
 
-# Some parse errors.
-_AT_CHECK_CALC_ERROR([$1], [0 0], [11],
-                     [1.3-1.4: parse error, unexpected "number"])
-_AT_CHECK_CALC_ERROR([$1], [1//2], [15],
-                     [1.3-1.4: parse error, unexpected '/', expecting "number" or '-' or '('])
-_AT_CHECK_CALC_ERROR([$1], [error], [4],
-                     [1.1-1.2: parse error, unexpected $undefined, expecting "number" or '-' or '\n' or '('])
-_AT_CHECK_CALC_ERROR([$1], [1 = 2 = 3], [22],
-                     [1.7-1.8: parse error, unexpected '='])
-_AT_CHECK_CALC_ERROR([$1],
+# Some syntax errors.
+_AT_CHECK_CALC_ERROR([$1], [1], [0 0], [11],
+                     [1.3-1.4: syntax error, unexpected "number"])
+_AT_CHECK_CALC_ERROR([$1], [1], [1//2], [15],
+                     [1.3-1.4: syntax error, unexpected '/', expecting "number" or '-' or '('])
+_AT_CHECK_CALC_ERROR([$1], [1], [error], [4],
+                     [1.1-1.2: syntax error, unexpected $undefined, expecting "number" or '-' or '\n' or '('])
+_AT_CHECK_CALC_ERROR([$1], [1], [1 = 2 = 3], [22],
+                     [1.7-1.8: syntax error, unexpected '='])
+_AT_CHECK_CALC_ERROR([$1], [1],
                      [
 +1],
                      [14],
-                     [2.1-2.2: parse error, unexpected '+'])
+                     [2.1-2.2: syntax error, unexpected '+'])
 # Exercise error messages with EOF: work on an empty file.
-_AT_CHECK_CALC_ERROR([$1], [/dev/null], [4],
-                     [1.1-1.2: parse error, unexpected "end of input", expecting "number" or '-' or '\n' or '('])
+_AT_CHECK_CALC_ERROR([$1], [1], [/dev/null], [4],
+                     [1.1-1.2: syntax error, unexpected "end of input", expecting "number" or '-' or '\n' or '('])
 
 # Exercise the error token: without it, we die at the first error,
 # hence be sure i. to have several errors, ii. to test the action
 # associated to `error'.
-_AT_CHECK_CALC_ERROR([$1], [(1 ++ 2) + (0 0) = 1], [82],
-[1.5-1.6: parse error, unexpected '+', expecting "number" or '-' or '('
-1.15-1.16: parse error, unexpected "number"
+_AT_CHECK_CALC_ERROR([$1], [0], [(1 ++ 2) + (0 0) = 1], [82],
+[1.5-1.6: syntax error, unexpected '+', expecting "number" or '-' or '('
+1.15-1.16: syntax error, unexpected "number"
 calc: error: 0 != 1])
 
 AT_CHECK_POPDEFS
@@ -563,7 +562,7 @@ AT_CHECK_CALC_LALR([%error-verbose %debug %locations %defines %name-prefix="calc
 
 AT_CHECK_CALC_LALR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc])
 
-AT_CHECK_CALC_LALR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param "value_t *result", "result" %parse-param "int *count", "count"])
+AT_CHECK_CALC_LALR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {value *result} %parse-param {int *count}])
 
 
 # ----------------------- #
@@ -598,4 +597,4 @@ AT_CHECK_CALC_GLR([%error-verbose %debug %locations %defines %name-prefix="calc"
 
 AT_CHECK_CALC_GLR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc])
 
-AT_CHECK_CALC_GLR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param "value_t *result", "result" %parse-param "int *count", "count"])
+AT_CHECK_CALC_GLR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {value *result} %parse-param {int *count}])