1%{
2#include "genfun.h"
3
4#if 0
5#define PUSH(s) \
6        yy_push_state(s); \
7        generateNewLine(); \
8        generate_normal("<!-- PUSH  " #s " -->"); \
9        generateNewLine();
10
11#define POP(s) \
12        yy_pop_state(); \
13        generateNewLine(); \
14        generate_normal("<!-- POP   " #s " -->"); \
15        generateNewLine();
16#else
17    #define PUSH(s) yy_push_state(s);
18    #define POP(s) yy_pop_state();
19#endif
20
21#define TRIMNORMAL(n)\
22            do{ if(yyleng > n){\
23                    yytext[yyleng - n]= '\0';\
24                    generate_normal(yytext);\
25                }}while(0)
26%}
27
28%option stack nomain yylineno noyywrap nounput
29%option prefix="flex_scanner_"
30
31%x verbatim_code options name_def sc_decl in_string sect2 pattern
32%x comment sect2prolog start_cond sect3
33
34NL	        \r?\n
35OPTWS		[[:blank:]]*
36WS          [[:blank:]]
37NOT_WS		[^[:blank:]\r\n]
38NAME        [[:alpha:]_][[:alnum:]_-]*
39LEXOPT		[aceknopr]
40REGEXOP     [\*\.\+\?\/\^\(\|\)\]\[]
41NUMESCSEQ	\\(([0-7]{1,3})|x([[:xdigit:]]{1,2}))
42CCL1        alnum|alpha|ascii|blank|cntrl|digit|graph
43CCL2        lower|print|punct|space|upper|xdigit
44CCL         {CCL1}|{CCL2}
45
46%%
47    int bracelevel=0;
48
49<INITIAL>{
50    ^"%{"           generatePreProc(yytext); PUSH(verbatim_code);
51    ^"%"[sx]        generatePreProc(yytext); PUSH(sc_decl);
52    ^"%option"      generatePreProc(yytext); PUSH(options);
53    ^"%array"    |
54    ^"%pointer"  |
55    ^"%"{LEXOPT}    generatePreProc(yytext);
56    ^{NAME}         generateFunction(yytext); PUSH(name_def);
57    ^"%%"           generatePreProc(yytext); BEGIN(sect2);
58    "/*"            startComment(yytext); PUSH(comment);
59    {NL}            generateNewLine();
60    [^\n_[:alpha:]%\/]+     generate_normal(yytext);
61    .               generate_normal(yytext);
62}
63<verbatim_code>{
64    ^"%}"           generatePreProc(yytext); POP(verbatim_code);
65    [^\r\n%]+       generate_normal(yytext);
66    [%\r]           generate_normal(yytext);
67    {NL}            generateNewLine();
68}
69<options>{
70    {WS}+           generate_normal(yytext);
71    {NAME}          generateKeyWord(yytext);
72    "="             generateSymbol(yytext);
73    \"[^\"\n]*\"     {
74                        startString("\"");
75                        if(yyleng> 2){
76                            yytext[yyleng-1] = '\0';
77                            generateString(yytext+1);
78                        }
79                        endString("\"");
80                    }
81    {NL}            generateNewLine(); POP(options);
82    .               generate_normal(yytext);
83}
84<sc_decl>{
85    {WS}+           generate_normal(yytext);
86    {NAME}          generateFunction(yytext);
87    {NL}            generateNewLine(); POP(sc_decl);
88    .               generate_normal(yytext);
89}
90
91<name_def>{
92    {WS}+           generate_normal(yytext);
93    {NL}            generateNewLine(); yy_set_bol(1);POP(name_def);
94    .               yyless(0); PUSH(pattern);
95}
96<pattern>{
97    {WS}+           generate_normal(yytext); POP(pattern);
98    {NL}            {
99                        yy_set_bol(1);
100                        yyless(0);
101                        POP(pattern);
102                    }
103    "{"{NAME}"}"    {
104                        generateSymbol("{");
105                        yytext[yyleng-1] = '\0';
106                        generateFunction(yytext+1);
107                        generateSymbol("}");
108                    }
109    "\""            startString(yytext); PUSH(in_string);
110    {REGEXOP}       generateSymbol(yytext);
111    "<<EOF>>"       generateKeyWord(yytext);
112    "[:"({CCL})":]"   {
113                        generateSymbol("[:");
114                        yytext[yyleng-2] = '\0';
115                        generateKeyWord(yytext+2);
116                        generateSymbol(":]");
117                    }
118    {NUMESCSEQ}     generateNumber(yytext);
119    \\[^\n]         generatePreProc(yytext);
120    .               generate_normal(yytext);
121}
122<in_string>{
123    "\""            endString(yytext); POP(in_string);
124    {NUMESCSEQ}     generateNumber(yytext);
125    \\[^\n]         generatePreProc(yytext);
126    {NL}            generateNewLine(); POP(in_string); /* actually an error */
127    .               generateString(yytext);
128}
129<comment>{
130    "*/"            endComment(yytext); POP(comment);
131    [^*\n]+         generateComment(yytext);
132    "*"             generateComment(yytext);
133    {NL}            generateNewLine();
134}
135<sect2prolog>{
136	^"%{".*	        ++bracelevel; generatePreProc(yytext);
137	^"%}".*	        --bracelevel; generatePreProc(yytext);
138	^{WS}.+         generate_normal(yytext);
139
140	^{NOT_WS}.*	    {
141                        if ( bracelevel <= 0 ) {
142                            yyless( 0 );
143                            yy_set_bol( 1 );
144                            BEGIN(sect2);
145                        }
146                        else
147                            generate_normal(yytext);
148                    }
149
150    {NL}            generateNewLine();
151    .+              generate_normal(yytext);
152}
153<sect2>{
154    "<"             generatePreProc(yytext); PUSH(start_cond);
155	"/*"	        startComment(yytext); PUSH(comment);
156	{WS}+		    generate_normal(yytext);
157	^"%%"           generatePreProc(yytext); BEGIN(sect3);
158	{NL}            generateNewLine();
159    \}              generate_normal(yytext);
160    .               yyless(0); PUSH(pattern);
161}
162<start_cond>{
163    ">"             generatePreProc(yytext); POP(start_cond);
164    ","             generate_normal(yytext);
165    {NAME}|"*"      generateFunction(yytext);
166    {NL}            generateNewLine();
167    [^[:alpha:]_\n,>\*]+      generate_normal(yytext);
168}
169<sect3>{
170    {NL}            generateNewLine();
171    .+              generate_normal(yytext);
172}
173%%
174
175
176/* vim:set ft=flex expandtab cindent tabstop=4 softtabstop=4 shiftwidth=4 textwidth=0: */
177