%{ /* style sheet lexer from http://www.w3.org/TR/REC-CSS1#appendix-b */ #include #include #include #include "stylesheet.h" #include "style_y.h" #define yytext styletext #define yyleng styleleng #define yylval stylelval extern int style_lineno; %} unicode \\[0-9a-f]{1,4} latin1 [\241-\377] escape {unicode}|\\[ -~\241-\377] stringchar {escape}|{latin1}|[ !#$%&(-~] nmstrt [a-zA-Z]|{latin1}|{escape} nmchar [-a-zA-Z0-9]|{latin1}|{escape} ident {nmstrt}{nmchar}* name {nmchar}+ d [0-9] notnm [^-a-z0-9\\]|{latin1} w [ \t\n]* num {d}+|{d}*\.{d}+ string \"({stringchar}|\')*\"|\'({stringchar}|\")*\' %x COMMENT %s AFTER_IDENT %% "/*" {BEGIN(COMMENT);} "*/" {BEGIN(0);} \n {/* ignore */} . {/* ignore */} @import {BEGIN(0); return IMPORT_SYM;} "!"{w}important {BEGIN(0); return IMPORTANT_SYM;} {ident} {BEGIN(AFTER_IDENT); #ifdef DEBUG fprintf(stderr,"ident:%s\n",yytext); #endif yylval.id = StringToSSID(yytext); return IDENT;} {string} {BEGIN(0); yylval.str = strdup(yytext); return STRING;} {num} {BEGIN(0); yylval.num = atof(yytext); return NUMBER;} {num}"%" {BEGIN(0); yylval.num = atof(yytext); return PERCENTAGE;} {num}pt/{notnm} {BEGIN(0); yylval.num = atof(yytext); return LENGTH_PT;} {num}mm/{notnm} {BEGIN(0); yylval.num = atof(yytext); return LENGTH_MM;} {num}cm/{notnm} {BEGIN(0); yylval.num = atof(yytext); return LENGTH_CM;} {num}pc/{notnm} {BEGIN(0); yylval.num = atof(yytext); return LENGTH_PC;} {num}in/{notnm} {BEGIN(0); yylval.num = atof(yytext); return LENGTH_IN;} {num}px/{notnm} {BEGIN(0); yylval.num = atof(yytext); return LENGTH_PX;} {num}em/{notnm} {BEGIN(0); yylval.num = atof(yytext); return EMS;} {num}ex/{notnm} {BEGIN(0); yylval.num = atof(yytext); return EXS;} ":"link {return LINK_PSCLASS_AFTER_IDENT;} ":"visited {return VISITED_PSCLASS_AFTER_IDENT;} ":"active {return ACTIVE_PSCLASS_AFTER_IDENT;} ":"first-line {return FIRST_LINE_AFTER_IDENT;} ":"first-letter {return FIRST_LETTER_AFTER_IDENT;} "#"{name} {yylval.str = strdup(yytext+1); return HASH_AFTER_IDENT;} "."{name} {yylval.id = StringToSSID(yytext+1); return CLASS_AFTER_IDENT;} ":"link {BEGIN(AFTER_IDENT); return LINK_PSCLASS;} ":"visited {BEGIN(AFTER_IDENT); return VISITED_PSCLASS;} ":"active {BEGIN(AFTER_IDENT); return ACTIVE_PSCLASS;} ":"first-line {BEGIN(AFTER_IDENT); return FIRST_LINE;} ":"first-letter {BEGIN(AFTER_IDENT); return FIRST_LETTER;} "#"{name} {BEGIN(AFTER_IDENT); yylval.str = strdup(yytext+1); return HASH;} "."{name} {BEGIN(AFTER_IDENT); yylval.id = StringToSSID(yytext+1); return CLASS;} url\({w}{string}{w}\) | url\({w}([^ \n\'\")]|\\\ |\\\'|\\\"|\\\))+{w}\) {BEGIN(0); yylval.str = strdup(yytext); return URL;} rgb\({w}{num}%?{w}\,{w}{num}%?{w}\,{w}{num}%?{w}\) {BEGIN(0); yylval.str = strdup(yytext); return RGB;} [-/+{};,#:] {BEGIN(0); return *yytext;} [ \t]+ {BEGIN(0); /* ignore whitespace */} \n {BEGIN(0); style_lineno++; /* ignore */} \<\!\-\- {BEGIN(0); return CDO;} \-\-\> {BEGIN(0); return CDC;} . { fprintf(stderr, "%d: Illegal character (%d)\n", style_lineno, *yytext);} %%