| 1 |
/*********************************************************************** |
| 2 |
* |
| 3 |
* file: expr_scan.lex |
| 4 |
* |
| 5 |
* 単純なスキャナ |
| 6 |
* |
| 7 |
*/ |
| 8 |
|
| 9 |
%option 8bit |
| 10 |
|
| 11 |
%x EXPR_SET |
| 12 |
|
| 13 |
CHAR [./0-9A-Za-z] |
| 14 |
NCHAR [^./0-9A-Za-z] |
| 15 |
CHAE [.26AEIMQUYcgkosw] |
| 16 |
CHU [./A-Z] |
| 17 |
CHUE [.AEIMQUY] |
| 18 |
CHL [./a-z] |
| 19 |
CHLE [.cgkosw] |
| 20 |
CHC ({CHU}|{CHL}) |
| 21 |
CHCE ({CHUE}|{CHLE}) |
| 22 |
|
| 23 |
ACY ((\.+\/+|\/+\.+)|(A+a+|a+A+)|(C+c+|c+C+)|(E+e+|e+E+)|(G+g+|g+G+)|(I+i+|i+I+)|(K+k+|k+K+)|(M+m+|m+M+)|(O+o+|o+O+)|(Q+q+|q+Q+)|(S+s+|s+S+)|(U+u+|u+U+)|(W+w+|w+W+)|(Y+y+|y+Y+)) |
| 24 |
ACZ ((B+b+|b+B+)|(D+d+|d+D+)|(F+f+|f+F+)|(H+h+|h+H+)|(J+j+|j+J+)|(L+l+|l+L+)|(N+n+|n+N+)|(P+p+|p+P+)|(R+r+|r+R+)|(T+t+|t+T+)|(V+v+|v+V+)|(X+x+|x+X+)|(Z+z+|z+Z+)|{ACY}) |
| 25 |
CHX \[{ACZ}\] |
| 26 |
CHXE \[{ACY}\] |
| 27 |
|
| 28 |
BLANK [\x20\r\t] |
| 29 |
|
| 30 |
PRINT [\x20-\x7E\xA1-\xDF] |
| 31 |
SJIS1 [\x80-\x9F\xE0-\xFC] |
| 32 |
SJIS2 [\x40-\x7E\x80-\xFC] |
| 33 |
%% |
| 34 |
|
| 35 |
"#"[^\r\n]*[\r]* comment( yytext ); |
| 36 |
|
| 37 |
({CHAR}|{CHX}|{CHXE}){11,} expr_error("ターゲット<%s:%d文字くらい>は明らかに長すぎるので無視!", yytext, yyleng); return JUNK; |
| 38 |
|
| 39 |
{CHU}{0,9}{CHUE} return mkdict(CA_U, 1); |
| 40 |
{CHU}{1,9} return mkdict(CA_U, 0); |
| 41 |
|
| 42 |
{CHC}{0,9}{CHCE} return mkdict(CA_C, 1); |
| 43 |
{CHC}{1,9} return mkdict(CA_C, 0); |
| 44 |
|
| 45 |
{CHAR}{0,9}{CHAE} return mkdict(CA_A, 1); |
| 46 |
{CHAR}{1,9} return mkdict(CA_A, 0); |
| 47 |
|
| 48 |
{CHAR}+ expr_error("ターゲット<%s:%d文字>は明らかに長すぎるので無視!", yytext, yyleng); return JUNK; |
| 49 |
|
| 50 |
{CHXE} return mkchx(yytext[1], 1); |
| 51 |
{CHX} return mkchx(yytext[1], 0); |
| 52 |
|
| 53 |
<EXPR_SET>"]" BEGIN(0); |
| 54 |
<EXPR_SET>{CHAR}-{CHAR} yylval.bmp = mkrng(cv64(yytext[0]), cv64(yytext[2])); return RNGS; |
| 55 |
<EXPR_SET>{CHAR} yylval.bmp = mkrng(cv64(yytext[0]), (unsigned)-1); return RNGS; |
| 56 |
<EXPR_SET>\n BEGIN(0); expr_error("範囲指定の中で改行するなんて…"); g_lineno++; |
| 57 |
<EXPR_SET>{SJIS1}{SJIS2} BEGIN(0); expr_error("文字<%c%c(0x%02X%02X)>は範囲指定に含めるワケにはいかないので無視します。", yytext[0], yytext[1], yytext[0] & 0xFF, yytext[1] & 0xFF); |
| 58 |
<EXPR_SET>{PRINT} BEGIN(0); expr_error("文字<%c>は範囲指定に含められないので無視します。", yytext[0]); |
| 59 |
<EXPR_SET>. BEGIN(0); expr_error("なんですかこの文字は範囲指定なのに? <0x%02X> 無視っすよ?", yytext[0] & 0xFF); |
| 60 |
|
| 61 |
[\^$?\(\)] return yytext[0]; |
| 62 |
"[^" BEGIN(EXPR_SET); return CLS_CMPL; |
| 63 |
"[" BEGIN(EXPR_SET); return CLS; |
| 64 |
|
| 65 |
({BLANK}|"|")*\n({BLANK}|"|")* g_lineno++; return OR; |
| 66 |
({BLANK}|"|")+ return OR; |
| 67 |
|
| 68 |
{SJIS1}{SJIS2} expr_error("文字<%c%c(0x%02X%02X)>はお行儀が悪いので無視します。", yytext[0], yytext[1], yytext[0] & 0xFF, yytext[1] & 0xFF); return JUNK; |
| 69 |
{PRINT} expr_error("文字<%c>はよくわかってないので無視します。", yytext[0]); return JUNK; |
| 70 |
. expr_error("なんですかこの文字は? <0x%02X> 無視っすよ?", yytext[0] & 0xFF); return JUNK; |
| 71 |
|
| 72 |
%% |
| 73 |
|
| 74 |
/* |
| 75 |
* Local Variables: |
| 76 |
* tab-width: 4 |
| 77 |
* End: |
| 78 |
* |
| 79 |
* EOF */ |