X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/56c47203421107ee019a20f3b56cfb967ad75bd2..9501dc6e69988cd8cf7623278a3894af9479e198:/tests/input.at diff --git a/tests/input.at b/tests/input.at index 8c952aa9..d0a61ba2 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.6-14: invalid value: $1 +[[input.y:2.6-14: integer out of range: `$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: integer out of range: `@1' ]]) AT_CLEANUP ## -------------- ## -## Type clashes. ## +## Type Clashes. ## ## -------------- ## -AT_SETUP([Type clashes]) +AT_SETUP([Type Clashes]) AT_DATA([input.y], [[%token foo @@ -98,9 +74,141 @@ 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 on default action: != <> +input.y:5.4-8: type clash 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_GRAMMAR([input.y], +[[%{ +/* This is seen in GCC: a %{ and %} in middle of a comment. */ +const char *foo = "So %{ and %} can be here too."; + +#ifdef __STDC__ +/\ +* A comment with backslash-newlines in it. %{ %} *\ +/ + +char str[] = "\\ +" A string with backslash-newlines in it %{ %} \\ +""; + +char apostrophe = '\\ +'\ +'; +#endif + +#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 '@<:@' + +/* Exercise quotes in strings. */ +%token FAKE "fake @<:@@:>@ \a\b\f\n\r\t\v\"\'\?\\\u005B\U0000005c ??!??'??(??)??-??/?? \x0\0" + +%% +/* Exercise M4 quoting: '@:>@@:>@', @<:@, 1. */ +exp: '@<:@' '\1' two '$' '@' '{' oline output + { + /* Exercise quotes in braces. */ + char tmp[] = "@<:@%c@:>@,\n"; + printf (tmp, $1); + } +; + +two: '\x000000000000000000000000000000000000000000000000000000000000000000002'; +oline: '@' 'o' 'l' 'i' 'n' 'e' '@' '_' '_' 'o' 'l' 'i' 'n' 'e' '_' '_'; +output: '#' 'o' 'u' 't' 'p' 'u' 't' ' '; +%% +/* 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\2$@{@oline@__@&t@oline__\ +#output "; /* " + */ + yylval = value_t_as_yystype (*input); + return *input++; +} + +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\n", msg); +} +]]) + +# Pacify Emacs'font-lock-mode: " + +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.o], [-c input.c]) +AT_COMPILE([main.o], [-c main.c]) +AT_COMPILE([input], [input.o main.o]) +AT_PARSER_CHECK([./input], 0, +[[[@<:@], ]]) AT_CLEANUP