为何在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
相关产品推荐
相关产品推荐

