我理解了这个问题并编写了下面的代码。我的代码工作,它打印检测到的有效和无效模式的数量,当我退出程序与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: nn");
yylex();
printf("nntNumber of VALID patterns = %dn", valid);
printf("tNumber of invalid patterns = %dnn", invalid);
return 0;
}
但是我想要这样:
- 每当我输入一个新行,它应该打印检测到的模式,有效模式的数量和无效模式的数量。
- 应该有一个EXIT命令
要实现您的目标,您应该这样修改您的代码:
/*** Definition Section ***/
%{
int valid = 0;
int invalid = 0;
%}
/*** Rules Section ***/
%%
([A-Z][a-zA-Z0-9]*[a-z])* {printf("ntPattern Detected: %s ", yytext); valid++;}
[a-zA-Z0-9]* {invalid++;}
"n" {
printf("nntNumber of VALID patterns = %dn", valid);
printf("tNumber of invalid patterns = %dnn", invalid);
valid = 0;
invalid = 0;
}
EXIT__ return 0;
%%
/*** User code section***/
int yywrap(){}
int main(int argc, char **argv[])
{
printf("n Enter inputs: nn");
yylex();
return 0;
}
这里主要的变化是在规则部分。
- 规则1:
([A-Z][a-zA-Z0-9]*[a-z])*
检测并计数以大写字母开头,以小写字母结尾的有效模式。在实际操作中,它打印检测到的模式并执行计数工作。这里yytext
包含缓冲区中的文本,对于此规则,它是检测到的模式。 - 规则2:
[a-zA-Z0-9]*
跟踪无效模式。这将有助于防止返回不匹配的模式。 - 规则3:
"n"
当您输入新行时,它会检测。在实际操作中,每当我输入新行时,它都会打印检测到的模式、有效模式的数量和无效模式的数量。此外,将下一行输入的计数变量重置为零。 - 规则4:
EXIT__
当你输入这个命令时,程序将退出。
可以避免在用户代码部分的主函数中打印有效和无效模式的数量。
但是,如果您也想在末尾打印检测到的有效和无效模式的数量,那么该程序将需要进行一些修改。