%{ #include #include #include "y.tab.h" /* ---- Context Conditions Stack ---- */ #define set_scan(x) BEGIN (_stack[_i]=x) #define push_to(x) _stack[++_i]=YY_START; set_scan(x) #define pop_back set_scan(_stack[--_i]) /* ------------------------------------------ Tag Codification: ... ---------------------------------------------*/ /* ---- Tag Stack ---- */ #define push_tag(t) _tag_stack[++_tag_i]=t #define pop_tag _tag_stack[_tag_i--] int _stack[20]; int _tag_stack[20]; int _i= 0; int _tag_i=0; /* pi - processing instruction comm - comments */ %} %option yylineno E ([ \t]*) L {E}(\n{E})+\. %x pi comm normal element elcontent %% /* ####################Processing Instructions################################## */ \<\? { push_to(pi); return BPI; } \?\> { pop_back; return EPI; } [a-z][a-z:_-]*/([ \t]*)\= { yylval.str = strdup(yytext); return ID; } [a-z][a-z:_-]* { yylval.str = strdup(yytext); return ID; } \= return '='; \"[^"]*\" { yylval.str = strdup(yytext+1); yylval.str[strlen(yytext)-2] = '\0'; return ATTRVAL; } [ \t\n]+ ; /* ####################Root Element################################## */ \<[a-zA-Z][a-zA-Z0-9:_-]* { push_to(element); yylval.str = strdup(yytext+1); return ID;} [ \t\n]+ ; [a-zA-Z][A-Z0-9a-z:_-]*/([ \t]*)\= { yylval.str = strdup(yytext); return ID; } \= return '='; \"[^"]*\" { yylval.str = strdup(yytext+1); yylval.str[strlen(yytext)-2] = '\0'; return ATTRVAL; } \> { push_to(elcontent); } /* ---- Closing an element ---- */ \<\/[a-zA-Z][a-zA-Z0-9:_-]*\> { pop_back; yylval.str = strdup(yytext+2); yylval.str[strlen(yytext)-3] = '\0'; return EELEMENT; } /* ---- Closing an empty element ---- */ \/\> { pop_back; return EEMPTY; } /* ---- Opening a child element ---- */ \<[a-zA-Z][a-zA-Z0-9:_-]* { push_to(element); yylval.str = strdup(yytext+1); return ID; } /* ####################Element Content################################## */ \<[a-zA-Z][a-zA-Z0-9:_-]* { push_to(element); yylval.str = strdup(yytext+1); return ID;} ([^<]|[\n])+/\<\/ { pop_back; yylval.str = strdup(yytext); return TEXT; } ([^<]|[\n])+ { yylval.str = strdup(yytext); return TEXT; } %% int yywrap() {}