../../doc/flex_scanner.ll

%{
#include "genfun.h"
#if 0
#define PUSH(s) \
 yy_push_state(s); \
 generateNewLine(); \
 generate_normal("<!-- PUSH " #s " -->"); \
 generateNewLine();
 
#define POP(s) \
 yy_pop_state(); \
 generateNewLine(); \
 generate_normal("<!-- POP " #s " -->"); \
 generateNewLine();
#else
 #define PUSH(s) yy_push_state(s);
 #define POP(s) yy_pop_state();
#endif
 
#define TRIMNORMAL(n)\
 do{ if(yyleng > n){\
 yytext[yyleng - n]= '0円';\
 generate_normal(yytext);\
 }}while(0)
%}
%option stack nomain yylineno noyywrap nounput
%option prefix="flex_scanner_"
%x verbatim_code options name_def sc_decl in_string sect2 pattern
%x comment sect2prolog start_cond sect3
NL	 \r?\n
OPTWS		[[:blank:]]*
WS [[:blank:]]
NOT_WS		[^[:blank:]\r\n]
NAME [[:alpha:]_][[:alnum:]_-]*
LEXOPT		[aceknopr]
REGEXOP [\*\.\+\?\/\^\(\|\)\]\[]
NUMESCSEQ	\\(([0-7]{1,3})|x([[:xdigit:]]{1,2}))
CCL1 alnum|alpha|ascii|blank|cntrl|digit|graph
CCL2 lower|print|punct|space|upper|xdigit
CCL {CCL1}|{CCL2}
%%
 int bracelevel=0;
<INITIAL>{
 ^"%{" generatePreProc(yytext); PUSH(verbatim_code);
 ^"%"[sx] generatePreProc(yytext); PUSH(sc_decl);
 ^"%option" generatePreProc(yytext); PUSH(options);
 ^"%array" |
 ^"%pointer" |
 ^"%"{LEXOPT} generatePreProc(yytext);
 ^{NAME} generateFunction(yytext); PUSH(name_def);
 ^"%%" generatePreProc(yytext); BEGIN(sect2);
 "/*" startComment(yytext); PUSH(comment);
 {NL} generateNewLine();
 [^\n_[:alpha:]%\/]+ generate_normal(yytext);
 . generate_normal(yytext);
}
<verbatim_code>{
 ^"%}" generatePreProc(yytext); POP(verbatim_code);
 [^\r\n%]+ generate_normal(yytext);
 [%\r] generate_normal(yytext);
 {NL} generateNewLine();
}
<options>{
 {WS}+ generate_normal(yytext);
 {NAME} generateKeyWord(yytext);
 "=" generateSymbol(yytext);
 \"[^\"\n]*\" {
 startString("\"");
 if(yyleng> 2){
 yytext[yyleng-1] = '0円';
 generateString(yytext+1);
 }
 endString("\"");
 }
 {NL} generateNewLine(); POP(options);
 . generate_normal(yytext);
}
<sc_decl>{ 
 {WS}+ generate_normal(yytext);
 {NAME} generateFunction(yytext);
 {NL} generateNewLine(); POP(sc_decl);
 . generate_normal(yytext);
}
<name_def>{
 {WS}+ generate_normal(yytext);
 {NL} generateNewLine(); yy_set_bol(1);POP(name_def);
 . yyless(0); PUSH(pattern);
}
<pattern>{
 {WS}+ generate_normal(yytext); POP(pattern);
 {NL} {
 yy_set_bol(1);
 yyless(0);
 POP(pattern);
 }
 "{"{NAME}"}" {
 generateSymbol("{");
 yytext[yyleng-1] = '0円';
 generateFunction(yytext+1);
 generateSymbol("}");
 }
 "\"" startString(yytext); PUSH(in_string);
 {REGEXOP} generateSymbol(yytext);
 "<<EOF>>" generateKeyWord(yytext);
 "[:"({CCL})":]" {
 generateSymbol("[:");
 yytext[yyleng-2] = '0円';
 generateKeyWord(yytext+2);
 generateSymbol(":]");
 }
 {NUMESCSEQ} generateNumber(yytext);
 \\[^\n] generatePreProc(yytext);
 . generate_normal(yytext);
}
<in_string>{
 "\"" endString(yytext); POP(in_string);
 {NUMESCSEQ} generateNumber(yytext);
 \\[^\n] generatePreProc(yytext);
 {NL} generateNewLine(); POP(in_string); /* actually an error */
 . generateString(yytext);
}
<comment>{
 "*/" endComment(yytext); POP(comment);
 [^*\n]+ generateComment(yytext);
 "*" generateComment(yytext);
 {NL} generateNewLine();
}
<sect2prolog>{
	^"%{".*	 ++bracelevel; generatePreProc(yytext);
	^"%}".*	 --bracelevel; generatePreProc(yytext);
	^{WS}.+ generate_normal(yytext);
	^{NOT_WS}.*	 {
 if ( bracelevel <= 0 ) {
 yyless( 0 );
 yy_set_bol( 1 );
 BEGIN(sect2);
 }
 else
 generate_normal(yytext);
 }
 {NL} generateNewLine();
 .+ generate_normal(yytext);
}
<sect2>{
 "<" generatePreProc(yytext); PUSH(start_cond);
	"/*"	 startComment(yytext); PUSH(comment);
	{WS}+		 generate_normal(yytext);
	^"%%" generatePreProc(yytext); BEGIN(sect3);
	{NL} generateNewLine();
 \} generate_normal(yytext);
 . yyless(0); PUSH(pattern);
}
<start_cond>{
 ">" generatePreProc(yytext); POP(start_cond);
 "," generate_normal(yytext);
 {NAME}|"*" generateFunction(yytext);
 {NL} generateNewLine();
 [^[:alpha:]_\n,>\*]+ generate_normal(yytext);
}
<sect3>{
 {NL} generateNewLine();
 .+ generate_normal(yytext);
}
%%
/* vim:set ft=flex expandtab cindent tabstop=4 softtabstop=4 shiftwidth=4 textwidth=0: */

AltStyle によって変換されたページ (->オリジナル) /