编写一个 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;
}

但我想要这样的东西:

为了实现你的目标,你应该像这样修改你的代码:

/*** 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 函数中打印有效和无效模式的数量。
但是如果你也想在最后打印检测到的有效和无效模式的数量,那么这个程序将需要一些修改。