编写一个lex程序,检测并计数以大写字母开始,以小写字母结束的模式



我理解了这个问题并编写了下面的代码。我的代码工作,它打印检测到的有效和无效模式的数量,当我退出程序与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__当你输入这个命令时,程序将退出。

可以避免在用户代码部分的主函数中打印有效和无效模式的数量。
但是,如果您也想在末尾打印检测到的有效和无效模式的数量,那么该程序将需要进行一些修改。

相关内容

最新更新