X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/6c35d22c399d53cc4ce2b0f594a3033ede3ae117..56100c60da8ba5d852bbfbbe69666309039f87ab:/tests/input.at diff --git a/tests/input.at b/tests/input.at index 548032de..7c5f73e5 100644 --- a/tests/input.at +++ b/tests/input.at @@ -21,30 +21,6 @@ AT_BANNER([[Input Processing.]]) # Mostly test that we are robust to mistakes. -## ----------------------- ## -## Torturing the Scanner. ## -## ----------------------- ## - -AT_SETUP([Torturing the Scanner]) - -AT_DATA([input.y], -[[%{ -/* This is seen in GCC: a %{ and %} in middle of a comment. */ -const char *foo = "So %{ and %} can be here."; -%} -/* %{ and %} can be here too. */ - -%% -exp: 'a'; -]]) - -AT_CHECK([bison input.y]) - -AT_CLEANUP - - - - ## ------------ ## ## Invalid $n. ## ## ------------ ## @@ -57,7 +33,7 @@ exp: { $$ = $1 ; }; ]]) AT_CHECK([bison input.y], [1], [], -[[input.y:2: invalid value: $1 +[[input.y:2.6-14: invalid value: $1 ]]) AT_CLEANUP @@ -75,17 +51,17 @@ exp: { @$ = @1 ; }; ]]) AT_CHECK([bison input.y], [1], [], -[[input.y:2: invalid value: @1 +[[input.y:2.6-14: invalid value: @1 ]]) AT_CLEANUP ## -------------- ## -## Type clashes. ## +## Type Clashes. ## ## -------------- ## -AT_SETUP([Type clashes]) +AT_SETUP([Type Clashes]) AT_DATA([input.y], [[%token foo @@ -98,9 +74,117 @@ exp: foo {} foo ]]) AT_CHECK([bison input.y], [1], [], -[[input.y:5: type clash (`bar' `') on default action -input.y:6: type clash (`bar' `') on default action -input.y:7: empty rule for typed nonterminal, and no action +[[input.y:4.4-15: type clash (`bar' `') on default action +input.y:5.4-8: type clash (`bar' `') on default action +input.y:6.4: empty rule for typed nonterminal, and no action +]]) + +AT_CLEANUP + + + +## ----------------------- ## +## Torturing the Scanner. ## +## ----------------------- ## + +# Be sure to compile and run, so that the C compiler checks what +# we do. + +AT_SETUP([Torturing the Scanner]) + +AT_DATA([input.y], +[[%{ +/* This is seen in GCC: a %{ and %} in middle of a comment. */ +const char *foo = "So %{ and %} can be here too."; + +#include +%} +/* %{ and %} can be here too. */ + +%{ +/* Exercise pre-prologue dependency to %union. */ +typedef int value_t; +%} + +/* Exercise M4 quoting: '@:>@@:>@', 0. */ + +/* Also exercise %union. */ +%union +{ + value_t ival; /* A comment to exercise an old bug. */ +}; + + +/* Exercise post-prologue dependency to %union. */ +%{ +static YYSTYPE value_t_as_yystype (value_t val); + +/* Exercise quotes in declarations. */ +char quote[] = "@:>@@:>@,"; +%} + +%{ +static void yyerror (const char *s); +static int yylex (void); +%} + +%type '1' + +/* Exercise quotes in strings. */ +%token FAKE "fake @<:@@:>@," + +%% +/* Exercise M4 quoting: '@:>@@:>@', 1. */ +exp: '1' + { + /* Exercise quotes in braces. */ + char tmp[] = "@<:@%c@:>@,\n"; + printf (tmp, $1); + } +; +%% +/* Exercise M4 quoting: '@:>@@:>@', 2. */ + +static YYSTYPE +value_t_as_yystype (value_t val) +{ + YYSTYPE res; + res.ival = val; + return res; +} + +static int +yylex (void) +{ + static const char *input = "1"; + yylval = value_t_as_yystype (*input); + return *input++; +} + +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\n", msg); +} +]]) + +AT_DATA([main.c], +[[typedef int value_t; +#include "input.h" + +int yyparse (void); + +int +main (void) +{ + return yyparse (); +} +]]) + +AT_CHECK([bison -d -v -o input.c input.y]) +AT_COMPILE([input], [input.c main.c]) +AT_PARSER_CHECK([./input], 0, +[[[1], ]]) AT_CLEANUP