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

为何在Lex扫描器主函数中仅调用一次yylex()即可完成全文件扫描?

为什么Lex扫描器调用一次yylex()就能完成整个文件扫描?

这是个很关键的细节问题,核心差异在于Lex生成的yylex()和手动为Yacc编写的yylex(),内部逻辑完全不同:

你提到的场景里,自己写的Yacc配套yylex()每次只返回一个token,必须反复调用到文件结束;但Lex生成的扫描器,只需要调用一次yylex()就能扫完整份文件——比如你给出的这段示例代码:

void main(int argc, char* argv[]) { 
    printf("start\n"); 
    yyin = fopen(argv[1], "r"); 
    yylex(); 
    printf("word count: %d\n", wordCount); 
    fclose(yyin); 
}

背后的原因可以拆解为这几点:

  • Lex工具在生成扫描器代码时,已经把循环扫描的逻辑封装进了yylex()内部。它会自动生成一个持续运行的循环:不断从输入流yyin读取字符,匹配你定义的规则、执行对应的动作(比如统计单词数的wordCount++),直到读取到输入结束标记(EOF),才会退出循环并返回。
  • 而我们手动为Yacc编写的yylex(),通常是实现“单次token识别”的逻辑:每次调用只完成一个符号的匹配和返回,把下一次识别的控制权交还给调用者(也就是Yacc的解析器),所以Yacc需要反复调用它,直到拿到EOF为止。
  • 打个通俗的比方:手动写的yylex()是每次给你递一颗糖,要清空糖罐你得一次次伸手;Lex生成的yylex()是你伸手一次,它就自动把罐子里的糖全递完,直到空罐才停下。

内容的提问来源于stack exchange,提问作者user2269707

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:21:21