Flex代码仅扫描首个匹配项问题:如何实现文件逐行重复扫描?
问题原因及修复方案
核心问题:仅调用一次yylex()
你的main函数里只执行了一次yylex(),而yylex()每次调用仅会匹配并返回一个token,处理完第一个匹配项后就直接退出,不会继续扫描文件剩余内容。
其他潜在问题
- 正则表达式语法错误
- 字符集里的逗号会被当作普通匹配字符,比如
[0,1,8,9]实际会匹配0、,、1、8、9,不符合你匹配数字的需求,应改为[0189]。 - 小数点无需用引号包裹,
["."]可以简化为\.。
- 字符集里的逗号会被当作普通匹配字符,比如
- 空白/换行规则写法不规范
- 当前TAB和ALGR规则的写法模糊,比如想匹配制表符应该用
\t,匹配换行用\n;否则当前的空格写法可能导致匹配逻辑混乱,还会遗漏其他空白类型(比如回车)。
- 当前TAB和ALGR规则的写法模糊,比如想匹配制表符应该用
修复后的代码示例
%option noyywrap %option yylineno %{ #include <stdio.h> #include <cstdio> #include "token.h" using namespace std; #include <iostream> void yyerror(char *s); %} %% [0189][0-9]{2}[012][0-9]{2} { printf("CSE Line : %d \n", yylineno); return NUMBER;} ([5-9]|10)\.[0-9]{1,2} { printf("MO : \n"); return MO;} \t { printf("Tab \n"); return TAB;} \n { printf("Line cutter \n"); return ALGR;} [ \r]+ /* 忽略其他无需处理的空白字符(空格、回车) */ %% void yyerror(char *s) { fprintf(stderr, "%s\n", s); } int main() { FILE *myFile = fopen("input.txt", "r"); if (!myFile) { printf("Error Opening \n"); return -1; } yyin = myFile; // 循环调用yylex()直到文件扫描结束(yylex()遇EOF返回0) while (yylex() != 0); fclose(myFile); // 关闭文件避免资源泄漏 return 0; }
关键修复点
- 在
main中用while (yylex() != 0);循环调用词法分析函数,直到处理完整个文件。 - 修正正则表达式的字符集错误,移除多余逗号。
- 明确空白和换行的匹配规则,忽略无意义的空白字符。
- 添加文件关闭操作,规范资源管理。
内容的提问来源于stack exchange,提问作者Thanos Rom
相关产品推荐
相关产品推荐

