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