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