X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/e776192e4fcb3b34d8a279d7cc1ea153e96ae2e7..78bcec17c82fe777c90f86717773de35bb5018e7:/tests/input.at?ds=sidebyside diff --git a/tests/input.at b/tests/input.at index 68bd1f6d..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. ## ## ------------ ## @@ -104,3 +80,111 @@ 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