删除嵌套注释bz lex

use*_*772 5 comments lex lexical-analysis flex-lexer

如何在lex(或flex)中编程以从文本中删除嵌套注释并仅打印不在注释中的文本?我应该以某种方式识别我在评论时的状态以及块评论的起始"标签"的数量.

让我们有规则:1.
阻止评论

/*
block comment
*/
Run Code Online (Sandbox Code Playgroud)

线评论

// line comment
Run Code Online (Sandbox Code Playgroud)

3.评论可以嵌套.

例1

show /* comment /* comment */ comment */ show
Run Code Online (Sandbox Code Playgroud)

输出:

show  show
Run Code Online (Sandbox Code Playgroud)

例2

show /* // comment
comment
*/
show
Run Code Online (Sandbox Code Playgroud)

输出:

show 
show 
Run Code Online (Sandbox Code Playgroud)

例3

show
///* comment
comment
// /*
comment
//*/ comment
//
comment */
show
Run Code Online (Sandbox Code Playgroud)

输出:

show
show
Run Code Online (Sandbox Code Playgroud)

ric*_*ici 6

你的理论是正确的.这是一个简单的实现; 可以改进.

%x COMMENT
%%
%{
   int comment_nesting = 0;
%}

"/*"            BEGIN(COMMENT); ++comment_nesting;
"//".*          /* // comments to end of line */

<COMMENT>[^*/]* /* Eat non-comment delimiters */
<COMMENT>"/*"   ++comment_nesting;
<COMMENT>"*/"   if (--comment_nesting == 0) BEGIN(INITIAL);
<COMMENT>[*/]   /* Eat a / or * if it doesn't match comment sequence */

  /* Could have been .|\n ECHO, but this is more efficient. */
([^/]*([/][^/*])*)* ECHO;  
%%
Run Code Online (Sandbox Code Playgroud)