使用 flex 来大写 C 注释

Use flex to uppercase C comments

我想使用 flex 将文本中的 C 注释大写。

这是我的flex代码:

%{
#include <ctype.h>
%}

%%

\/\/.* {
    for(int i = 0; i < strlen(yytext); i++)
        printf("%c", toupper(yytext[i]));   
}

\/\*[^\*]*\*(\*|[^\*\/][^\*]*)*\/ {
    for(int i = 0; i < strlen(yytext); i++)
        printf("%c", toupper(yytext[i]));
}

%%

int main(int argc ,char* argv[]) {
    yylex();
    return 0;
}

int yywrap() {
    return 1;
}

测试文本如下:

/*aBc*aBc/aBc*/
/** /aBc*/
/*aBc*/aBc*/
aBc
aBc/*aBC
aBc/aBc*aBc
aBc**/
/*aBc/*aBc
//aBc
//aBc
aBc

结果:

/*ABC*ABC/ABC*/
/** /ABC*/
/*ABC*/aBc*/
aBc
aBc/*ABC
ABC/ABC*ABC
ABC**/
/*ABC/*ABC
//ABC
//aBc
aBc

结果中倒数第二行和第四行很奇怪。

我的程序有什么问题?

问题只是您使用的正则表达式不正确。

这是 C 风格注释的正确 flex 正则表达式:

"/*"[^*]*"*"+([^*/][^*]*"*"+)*"/"

它使用双引号(弹性功能)来引用正则表达式元字符。请注意,不必在字符 类.

内转义正则表达式运算符

备选方案也不是很好:

  1. 斜木林:

    \/\*[^*]*\*+([^*/][^*]*\*+)*\/
    
  2. 字符混乱 类:

    [/][*][^*]*[*]+([^*/][^*]*[*]+)*[/]