编写一个 lex 程序,检测并计算以大写字母开头、以小写字母结尾的模式
Write a lex program that detects and counts the pattern that starts with an uppercase letter, ends with a lowercase letter
我理解了问题并编写了以下代码。当我使用 ctrl+z
.
退出程序时,我的代码有效,它会打印检测到的有效和无效模式的数量
这是我的代码:
%{
int valid = 0;
int invalid = 0;
%}
%%
([A-Z][a-zA-Z0-9]*[a-z])* {valid++;}
[a-zA-Z0-9]* {invalid++;}
%%
int yywrap(){}
int main(int argc, char **argv[])
{
printf("\n Enter inputs: \n\n");
yylex();
printf("\n\n\tNumber of VALID patterns = %d\n", valid);
printf("\tNumber of invalid patterns = %d\n\n", invalid);
return 0;
}
但我想要这样的东西:
- 每当我输入一个新行时,它应该打印检测到的模式、有效模式的数量和无效模式的数量。
- 应该有一个 EXIT 命令。
为了实现你的目标,你应该像这样修改你的代码:
/*** Definition Section ***/
%{
int valid = 0;
int invalid = 0;
%}
/*** Rules Section ***/
%%
([A-Z][a-zA-Z0-9]*[a-z])* {printf("\n\tPattern Detected: %s ", yytext); valid++;}
[a-zA-Z0-9]* {invalid++;}
"\n" {
printf("\n\n\tNumber of VALID patterns = %d\n", valid);
printf("\tNumber of invalid patterns = %d\n\n", invalid);
valid = 0;
invalid = 0;
}
EXIT__ return 0;
%%
/*** User code section***/
int yywrap(){}
int main(int argc, char **argv[])
{
printf("\n Enter inputs: \n\n");
yylex();
return 0;
}
这里的主要变化出现在规则部分。
- Rule-1:
([A-Z][a-zA-Z0-9]*[a-z])*
它检测并计算以大写字母开头、以小写字母结尾的有效模式。实际上,它会打印检测到的图案并进行计数工作。这里 yytext
包含缓冲区中的文本,对于此规则,它是检测到的模式。
- Rule-2:
[a-zA-Z0-9]*
跟踪无效模式。这将有助于防止返回不匹配的模式。
- Rule-3:
"\n"
它会检测您何时输入新行。实际上,每当我输入新行时,它都会打印检测到的模式、有效模式的数量和无效模式的数量。此外,将下一行输入的计数变量重置为零。
- Rule-4:
EXIT__
只要你输入这个命令,程序就会退出。
您可以避免在用户代码部分的 main 函数中打印有效和无效模式的数量。
但是如果你也想在最后打印检测到的有效和无效模式的数量,那么这个程序将需要一些修改。
我理解了问题并编写了以下代码。当我使用 ctrl+z
.
这是我的代码:
%{
int valid = 0;
int invalid = 0;
%}
%%
([A-Z][a-zA-Z0-9]*[a-z])* {valid++;}
[a-zA-Z0-9]* {invalid++;}
%%
int yywrap(){}
int main(int argc, char **argv[])
{
printf("\n Enter inputs: \n\n");
yylex();
printf("\n\n\tNumber of VALID patterns = %d\n", valid);
printf("\tNumber of invalid patterns = %d\n\n", invalid);
return 0;
}
但我想要这样的东西:
- 每当我输入一个新行时,它应该打印检测到的模式、有效模式的数量和无效模式的数量。
- 应该有一个 EXIT 命令。
为了实现你的目标,你应该像这样修改你的代码:
/*** Definition Section ***/
%{
int valid = 0;
int invalid = 0;
%}
/*** Rules Section ***/
%%
([A-Z][a-zA-Z0-9]*[a-z])* {printf("\n\tPattern Detected: %s ", yytext); valid++;}
[a-zA-Z0-9]* {invalid++;}
"\n" {
printf("\n\n\tNumber of VALID patterns = %d\n", valid);
printf("\tNumber of invalid patterns = %d\n\n", invalid);
valid = 0;
invalid = 0;
}
EXIT__ return 0;
%%
/*** User code section***/
int yywrap(){}
int main(int argc, char **argv[])
{
printf("\n Enter inputs: \n\n");
yylex();
return 0;
}
这里的主要变化出现在规则部分。
- Rule-1:
([A-Z][a-zA-Z0-9]*[a-z])*
它检测并计算以大写字母开头、以小写字母结尾的有效模式。实际上,它会打印检测到的图案并进行计数工作。这里yytext
包含缓冲区中的文本,对于此规则,它是检测到的模式。 - Rule-2:
[a-zA-Z0-9]*
跟踪无效模式。这将有助于防止返回不匹配的模式。 - Rule-3:
"\n"
它会检测您何时输入新行。实际上,每当我输入新行时,它都会打印检测到的模式、有效模式的数量和无效模式的数量。此外,将下一行输入的计数变量重置为零。 - Rule-4:
EXIT__
只要你输入这个命令,程序就会退出。
您可以避免在用户代码部分的 main 函数中打印有效和无效模式的数量。
但是如果你也想在最后打印检测到的有效和无效模式的数量,那么这个程序将需要一些修改。