Home | History | Annotate | Download | only in tests
      1 # Bison Parser Headers.                               -*- Autotest -*-
      2 # Copyright (C) 2001, 2002, 2006 Free Software Foundation, Inc.
      3 
      4 # This program is free software; you can redistribute it and/or modify
      5 # it under the terms of the GNU General Public License as published by
      6 # the Free Software Foundation; either version 2, or (at your option)
      7 # any later version.
      8 
      9 # This program is distributed in the hope that it will be useful,
     10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12 # GNU General Public License for more details.
     13 
     14 # You should have received a copy of the GNU General Public License
     15 # along with this program; if not, write to the Free Software
     16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
     17 # 02110-1301, USA.
     18 
     19 AT_BANNER([[Parser Headers.]])
     20 
     21 
     22 ## ---------------------- ##
     23 ## %union and --defines.  ##
     24 ## ---------------------- ##
     25 
     26 
     27 AT_SETUP([%union and --defines])
     28 
     29 AT_DATA([input.y],
     30 [%union
     31 {
     32   int   integer;
     33   char *string ;
     34 }
     35 %%
     36 exp: {};
     37 ])
     38 
     39 AT_CHECK([bison --defines input.y])
     40 
     41 AT_CLEANUP
     42 
     43 
     44 
     45 ## --------------------- ##
     46 ## Invalid CPP headers.  ##
     47 ## --------------------- ##
     48 
     49 # AT_TEST_CPP_GUARD_H([INPUT-FILE-BASE)
     50 # -------------------------------------
     51 m4_define([AT_TEST_CPP_GUARD_H],
     52 [AT_SETUP([Invalid CPP guards: $1])
     53 
     54 # Possibly create inner directories.
     55 dirname=`AS_DIRNAME([$1])`
     56 AS_MKDIR_P([$dirname])
     57 
     58 AT_DATA_GRAMMAR([$1.y],
     59 [%{
     60 #include <$1.h>
     61 void yyerror (const char *);
     62 int yylex (void);
     63 %}
     64 %%
     65 dummy:;
     66 %%
     67 #include <$1.h>
     68 ])
     69 
     70 AT_CHECK([bison --defines=$1.h --output=y.tab.c $1.y])
     71 
     72 AT_COMPILE([y.tab.o], [-I. -c y.tab.c])
     73 
     74 AT_CLEANUP
     75 ])
     76 
     77 AT_TEST_CPP_GUARD_H([input/input])
     78 AT_TEST_CPP_GUARD_H([9foo])
     79 
     80 
     81 
     82 ## ---------------- ##
     83 ## export YYLTYPE.  ##
     84 ## ---------------- ##
     85 
     86 
     87 AT_SETUP([export YYLTYPE])
     88 
     89 AT_DATA_GRAMMAR([input.y],
     90 [%locations
     91 
     92 %name-prefix="my_"
     93 %{
     94 #include <stdio.h>
     95 #include <stdlib.h>
     96 
     97 static int
     98 my_lex (void)
     99 {
    100   return EOF;
    101 }
    102 
    103 static void
    104 my_error (const char *msg)
    105 {
    106   fprintf (stderr, "%s\n", msg);
    107 }
    108 
    109 %}
    110 %%
    111 exp:;
    112 ])
    113 
    114 AT_CHECK([bison --defines -o input.c input.y])
    115 
    116 # YYLTYPE should be defined, and MY_LLOC declared.
    117 AT_DATA([caller.c],
    118 [[#include "input.h"
    119 YYLTYPE *my_llocp = &my_lloc;
    120 
    121 int my_parse (void);
    122 
    123 int
    124 main (void)
    125 {
    126   return my_parse ();
    127 }
    128 ]])
    129 
    130 # Link and execute, just to make sure everything is fine (and in
    131 # particular, that MY_LLOC is indeed defined somewhere).
    132 AT_COMPILE([caller.o], [-c caller.c])
    133 AT_COMPILE([input.o], [-c input.c])
    134 AT_COMPILE([caller], [caller.o input.o])
    135 AT_PARSER_CHECK([./caller])
    136 
    137 AT_CLEANUP
    138