Ubuntu下用Flex开发时,如何在C++中打开任意.k扩展名文件?
没问题,这其实是个很常见的需求——要让你的Flex词法分析器支持命令行传参指定输入文件,只需要结合C的命令行参数处理和Flex的yyin文件指针调整一下代码就行,我给你一步步讲清楚:
1. 替换硬编码文件名,改用命令行参数
C程序的main函数天生支持接收命令行参数,格式是int main(int argc, char *argv[]):
argc是传入的参数总数(包括程序名本身)argv是参数数组,argv[0]是你的程序名,argv[1]就是用户传入的文件名
你可以把原来硬编码的文件名替换成argv[1],同时加上参数检查(防止用户没传文件名的情况),代码示例如下:
#include <stdio.h> #include <iostream> #include <string.h> using namespace std; // 声明Flex生成的词法分析函数和文件指针 extern int yylex(); extern FILE *yyin; int main(int argc, char *argv[]) { // 检查是否传入了文件名参数 if (argc < 2) { cout << "用法: " << argv[0] << " <输入文件>.k" << endl; return 1; } // 可选:强制检查文件扩展名是否为.k char *file_ext = strrchr(argv[1], '.'); if (!file_ext || strcmp(file_ext, ".k") != 0) { cout << "错误:请传入以.k为扩展名的文件" << endl; return 1; } // 打开用户指定的文件,赋值给Flex的yyin指针 yyin = fopen(argv[1], "r"); if (!yyin) { cout << "无法打开文件: " << argv[1] << endl; return 1; } // 启动词法分析 yylex(); // 记得关闭文件 fclose(yyin); return 0; }
2. 调整Flex文件,禁用默认main函数
默认情况下,Flex会自动生成一个简单的main函数(从标准输入读取内容)。如果你自己写了上面的main,需要在Flex文件的开头加上以下选项,让Flex不要生成默认的main:
%option noyywrap // 关闭yywrap函数的需求(如果不需要多文件处理) %option no main // 禁止生成默认的main函数
3. 编译与运行(Ubuntu环境)
假设你的Flex文件叫lexer.l,编译步骤如下:
- 用Flex生成C代码:
flex lexer.l - 用gcc编译生成可执行文件:
gcc lex.yy.c -o myprogram -lfl
之后你就可以通过命令行传入任意.k文件了:
./myprogram a.k ./myprogram b.k
这样就不用再每次修改代码里的文件名啦!
内容的提问来源于stack exchange,提问作者karma
相关产品推荐
相关产品推荐

