Lex 文件无法识别关键字。如何编写正则表达式来读取特定关键字?

Lex file doesn't recognize keywords. How can I write my regex to read particular keywords?

这是我的 lex 文件

%{
    #include<stdio.h> 
    int codelines = 0;
    int commentlines = 0;
    int blanklines = 0;
    int headerlines = 0;
    int brackets = 0;
    int keywords = 0;

    
%}

%%
int|return|char {keywords++}
^[ \t]*\n {blanklines++;}
[ a-zA-Z0-9();]+ {codelines++;}
\{|\} {brackets++;}
#[a-zA-Z0-9<>.]+ {headerlines++;}
\/\/[a-zA-Z0-9 *=]* {commentlines++;}
%%

int main(void) {
    yylex();

    printf("\n");
    printf("Number of Code Lines %d\n", codelines);
    printf("Number of Comment Lines %d\n", commentlines);
    printf("Number of Blank Lines %d\n", blanklines);
    printf("Number of Header Lines %d\n", headerlines);
    printf("Number of Braces %d\n", brackets);
    printf("Number of Keywords %d\n", keywords);
}

这是我要传递给的输入文件

#include<stdio.h>
                                                                                                                                        
int main() {
    int a;
    int b;
    int c;
    //My name is Witcher
    //Analyzer
    return 0;
}

输出是这样的,这是错误的,因为检测到 none 个关键字

Number of Code Lines 8
Number of Comment Lines 2
Number of Blank Lines 0
Number of Header Lines 1
Number of Braces 2
Number of Keywords 0

关键字应该是这样的

Number of Code Lines 8
Number of Comment Lines 2
Number of Blank Lines 0
Number of Header Lines 1
Number of Braces 2
Number of Keywords 5

我已经尝试通过在应该识别关键字时添加不同的语句来进行调试,但语句根本不是 运行

发生的事情是 lex 在这里有 2 个重要的属性:

  1. Lex 只匹配一个单词一次。因此,如果两个不同的正则表达式能够匹配同一个词,将会发生的情况是 lex 将选择一个正则表达式进行匹配,而另一个则不会。所以问题是,哪个正则表达式要匹配?
  2. 要选择哪个正则表达式来匹配一个词,lex 总是选择最长的可能规则。

示例:定义 2 个关键字:
<= {printf("Less equal");}
< {printf("Less");}
并将输入作为 a<=b。输出将是 Less equal 因为 <= 比简单的 <

更长 在您的代码中,代码行正则表达式匹配您希望通过关键字正则表达式匹配的单词。例如,int main(void) 是代码行正则表达式的有效匹配词。
您应该尝试重写代码行 regex