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 个重要的属性:
- Lex 只匹配一个单词一次。因此,如果两个不同的正则表达式能够匹配同一个词,将会发生的情况是 lex 将选择一个正则表达式进行匹配,而另一个则不会。所以问题是,哪个正则表达式要匹配?
- 要选择哪个正则表达式来匹配一个词,lex 总是选择最长的可能规则。
示例:定义 2 个关键字:
<= {printf("Less equal");}
< {printf("Less");}
并将输入作为 a<=b
。输出将是 Less equal
因为 <=
比简单的 <
更长
在您的代码中,代码行正则表达式匹配您希望通过关键字正则表达式匹配的单词。例如,int main(void)
是代码行正则表达式的有效匹配词。
您应该尝试重写代码行 regex
这是我的 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 个重要的属性:
- Lex 只匹配一个单词一次。因此,如果两个不同的正则表达式能够匹配同一个词,将会发生的情况是 lex 将选择一个正则表达式进行匹配,而另一个则不会。所以问题是,哪个正则表达式要匹配?
- 要选择哪个正则表达式来匹配一个词,lex 总是选择最长的可能规则。
示例:定义 2 个关键字:
<= {printf("Less equal");}
< {printf("Less");}
并将输入作为 a<=b
。输出将是 Less equal
因为 <=
比简单的 <
更长
在您的代码中,代码行正则表达式匹配您希望通过关键字正则表达式匹配的单词。例如,int main(void)
是代码行正则表达式的有效匹配词。
您应该尝试重写代码行 regex