0

我试图解决这个问题“为以元音开头、以辅音结尾并且可能也有数字的模式编写一个 lex 程序。”

这是我的代码:

%{
    #include<stdio.h>
    #include<string.h>
    int cno=0, wno=0, lno=o;
%}

character [a-zA-z]
digit [0-9]
word({character}|{digit})+
line\n
%%
{line}{cno++;lno++;}
{line}{wno++; cno+=strlen(yytext);}{cno++;}
%%

int main(void)
{
    yylex();
    print("Count alphanumeric pattern: %d;", cno);
    print("Length of string: %d;", wno);
    print("Line numbers: %d\n", lno);
    return 0;
}

这是输出:

line 23: unrecognized rule
line 23: fatal parse error
4

1 回答 1

1

我认为以下代码将解决您的问题。

%{
int valid_patterns = 0, invalid_patterns =0;
%}

PATTERN ([aeiouAEIOU][A-Za-z0-9]*[b-df-hj-np-tv-zB-DF-HJ-NP-TV-Z])*


%%
{PATTERN} {printf("\n\t Pattern Matched: %s", yytext); valid_patterns++;}
[A-Za-z0-9]+ {invalid_patterns++;}
"\n" {
    printf("\n\n\t Total Matched Patterns  : %d", valid_patterns);
    printf("\n\t Total Unmatched Patterns: %d\n", invalid_patterns);
    valid_patterns = 0; invalid_patterns = 0;
}
%%


/*** User code section***/

int yywrap(){}

int main(int argc, char **argv[])
{
    printf("\n Enter your inputs: \n\n");
    yylex();

    return 0;
}

根据您的问题要求对 PATTERN 的第一条规则进行说明:

  • [aeiouAEIOU]确保模式以元音开头。
  • [A-Za-z0-9]*表示任何字母数字字符都可以出现在中间。
  • [b-df-hj-np-tv-zB-DF-HJ-NP-TV-Z]确保模式以辅音结尾。
  • (...)*表示可能有 0 次或多次出现欲望模式。

第二条规则[A-Za-z0-9]+捕获与要求不匹配的任何其他输入。当您输入新行时,最终规则"\n"会采取行动,它会打印有关您输入的信息。

一个 I/O 例子---

输入:Hello amazing people around the world

输出:

 Pattern Matched: amazing
 Pattern Matched: around

 Total Matched Patterns  : 2
 Total Unmatched Patterns: 4
于 2021-07-27T18:22:12.480 回答