使用 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 正则表达式:
"/*"[^*]*"*"+([^*/][^*]*"*"+)*"/"
它使用双引号(弹性功能)来引用正则表达式元字符。请注意,不必在字符 类.
内转义正则表达式运算符
备选方案也不是很好:
斜木林:
\/\*[^*]*\*+([^*/][^*]*\*+)*\/
字符混乱 类:
[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/]
我想使用 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 正则表达式:
"/*"[^*]*"*"+([^*/][^*]*"*"+)*"/"
它使用双引号(弹性功能)来引用正则表达式元字符。请注意,不必在字符 类.
内转义正则表达式运算符备选方案也不是很好:
斜木林:
\/\*[^*]*\*+([^*/][^*]*\*+)*\/
字符混乱 类:
[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/]