%{ #include #include #define ECHOS(s) fwrite(s, strlen(s), 1, yyout) std::stack tag_stack; std::string tag_candidate = ""; bool push_tag() { if (tag_candidate == "") { return false; } tag_stack.push(tag_candidate); ECHOS("<" + tag_stack.top() + ">"); tag_candidate = ""; } bool pop_tag() { ECHOS(""); tag_stack.pop(); } /* q0(.) -> q1 q0(\d) -> q2 q1(\d) -> qe q2(\d) -> q2 q2(.) -> qe qe(\d) -> qe */ %} %x HEAD STRING COMMENT COMMENT_MULTILINE %s BODY ws [ \t\r\v\f] wsnl [ \t\r\v\f\n] %% { \/\/ { BEGIN COMMENT; ECHOS(""); BEGIN BODY; } } { \n { ECHO; } \*\/ { ECHOS("-->"); BEGIN BODY; } } { .* { ECHO; } )[wsnl]{ { BEGIN BODY; } } %%