You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flex代码仅扫描首个匹配项问题:如何实现文件逐行重复扫描?

问题原因及修复方案

核心问题:仅调用一次yylex()

你的main函数里只执行了一次yylex(),而yylex()每次调用仅会匹配并返回一个token,处理完第一个匹配项后就直接退出,不会继续扫描文件剩余内容。

其他潜在问题

  1. 正则表达式语法错误
    • 字符集里的逗号会被当作普通匹配字符,比如[0,1,8,9]实际会匹配0、,、1、8、9,不符合你匹配数字的需求,应改为[0189]。
    • 小数点无需用引号包裹,["."]可以简化为\.。
  2. 空白/换行规则写法不规范
    • 当前TAB和ALGR规则的写法模糊,比如想匹配制表符应该用\t,匹配换行用\n;否则当前的空格写法可能导致匹配逻辑混乱,还会遗漏其他空白类型(比如回车)。

修复后的代码示例

%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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:37:07