%{ #include bool leave_docs = false; bool in_docs = false; %} %x SINGLE_LINE %x MULTI_LINE %x STRING %x INCLUDE %% "#include <" { ECHO; BEGIN(INCLUDE); } ">" { ECHO; BEGIN(INITIAL); } \" { ECHO; BEGIN(STRING); } \\\" { ECHO; } \" { ECHO; BEGIN(INITIAL); } . { ECHO; } "///"|"//!" { in_docs = true; if (leave_docs) { ECHO; } BEGIN(SINGLE_LINE); } "/**/" { putchar(' '); } "/**"|"/*!" { in_docs = true; if (leave_docs) { ECHO; } BEGIN(MULTI_LINE); } "//" { BEGIN(SINGLE_LINE); } . { ECHO; } "\\\n" { } \n { if (leave_docs && in_docs) { ECHO; in_docs = false; } BEGIN(INITIAL); } . { if (leave_docs && in_docs) { ECHO; } } "/*" { BEGIN(MULTI_LINE); } "*/" { if (leave_docs && in_docs) { ECHO; in_docs = false; } else { putchar(' '); } BEGIN(INITIAL); } . { if (leave_docs && in_docs) { ECHO; } } %% // single line comment /* * multi line comment */ /// single line doc 1 //! single line doc 2 /** * multi line doc 1 */ /*! * multi line doc 2 */ #include int main(int argc, char *argv[]) { if (argc > 1) { leave_docs = true; } yylex(); return EXIT_SUCCESS; }