xref: /netbsd-src/external/bsd/flex/dist/tests/quotes.l (revision 56bd85463476f90bb489799c99292bb30d6771c0)
1 /*
2  * This file is part of flex.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * Neither the name of the University nor the names of its contributors
15  * may be used to endorse or promote products derived from this software
16  * without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
20  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21  * PURPOSE.
22  */
23 
24 /* The point of this test is to be sure our M4 madness does not
25  * interfere with user code. I particular, we are looking
26  * for instances of M4 quotes, [[ and ]], in here to make it through the flex
27  * machinery unscathed.
28  */
29 
30 /* sect 1     [ 1 ]           TEST_XXX */
31 /* sect 1    [[ 2 ]]          TEST_XXX */
32 /* sect 1   [[[ 3 ]]]         TEST_XXX */
33 /* sect 1  [[[[ 4 ]]]]        TEST_XXX */
34 /* sect 1  ]] unmatched [[    TEST_XXX */
35 
36 %{
37 /* A template scanner file to build "scanner.c". */
38 #include <stdio.h>
39 #include <stdlib.h>
40 #include "config.h"
41 #include <assert.h>
42 /*#include "parser.h" */
43 
44 /* sect 1 block    [ 1 ]        TEST_XXX */
45 /* sect 1 block   [[ 2 ]]       TEST_XXX */
46 /* sect 1 block  [[[ 3 ]]]      TEST_XXX */
47 /* sect 1 block [[[[ 4 ]]]]     TEST_XXX */
48 /* sect 1 block ]] unmatched [[ TEST_XXX */
49 
50 static int a[1] = {0};
51 static int b[1] = {0};
52 static int c[1] = {0};
53 
foo(int i)54 static int foo (int i){
55     return a[b[c[i]]]; /* sect 1 code  TEST_XXX */
56 }
57 %}
58 
59 %option 8bit prefix="test"
60 %option nounput nomain noyywrap noinput
61 %option warn
62 
63 
64 %%
65   /* indented code    [ 1 ] */
66   /* indented code   [[ 2 ]] */
67   /* indented code  [[[ 3 ]]] */
68   /* indented code [[[[ 4 ]]]] */
69   /* indented code ]] unmatched [[ */
70 %{
71 // non-indented code    [ 1 ]
72 // non-indented code   [[ 2 ]]
73 // non-indented code  [[[ 3 ]]]
74 // non-indented code [[[[ 4 ]]]]
75 %}
76 
77 a       /* action comment    [ 1 ]          */ ;
78 b       /* action comment   [[ 2 ]]         */ ;
79 c       /* action comment  [[[ 3 ]]]        */ ;
80 d       /* action comment [[[[ 4 ]]]]       */ ;
81 e       /* action comment ]] unmatched [[   */ ;
82 f       return 1+foo(a[b[c[0]]]);
83 .|\n    {
84 
85 #if 0
86                action code     [ 1 ]        TEST_XXX
87                action code    [[ 2 ]]       TEST_XXX
88                action code   [[[ 3 ]]]      TEST_XXX
89                action code  [[[[ 4 ]]]]     TEST_XXX
90                action code  ]] unmatched [[ TEST_XXX
91 #endif
92             /* action block    [ 1 ]        TEST_XXX */
93             /* action block   [[ 2 ]]       TEST_XXX */
94             /* action block  [[[ 3 ]]]      TEST_XXX */
95             /* action block [[[[ 4 ]]]]     TEST_XXX */
96             /* action block ]] unmatched [[ TEST_XXX */
97             assert(!strcmp("[[ 2 ]]", "[""[ 2 ]""]"));
98             assert(!strcmp("[[[ 3 ]]]", "[""[""[ 3 ]""]""]"));
99             assert(!strcmp("[[[[ 4 ]]]]", "[""[""[""[ 4 ]""]""]""]"));
100             assert(!strcmp("]] unmatched [[", "]""] unmatched [""["));
101             assert(!strcmp("]]m4_define(alpha, beta)[[",
102              "]""]m4_""define(alpha, beta)[""["));
103             return 1+foo(a[b[c[0]]]);  /*   TEST_XXX */
104          }
105 %%
106 
107 /* sect 3     [ 1 ]        TEST_XXX */
108 /* sect 3    [[ 2 ]]       TEST_XXX */
109 /* sect 3   [[[ 3 ]]]      TEST_XXX */
110 /* sect 3  [[[[ 4 ]]]]     TEST_XXX */
111 /* sect 3  ]] unmatched [[ TEST_XXX */
112 static int bar (int i){
113     return c[b[a[i]]]; /* sect 3 code TEST_XXX */
114 }
115 int main(void);
116 
117 #define CONCAT_IDENTS(a, b) a##b
118 int
main(void)119 main (void)
120 {
121     /* m4_m4exit(100) */
122     FILE *M4_YY_NOT_IN_HEADER = stdin;
123     yyin = CONCAT_IDENTS(M4_, YY_NOT_IN_HEADER);
124     yyout = stdout;
125     while (yylex())
126         ;
127     assert(!strcmp("YY_G( alpha)", "Y""Y_G( alpha)"));
128     printf("TEST RETURNING OK.\n");
129     return bar(0);
130 }
131 
132