运行flex.l文件提示unexpected character报错如何解决
报错原因
Flex规则段对行首格式有强制要求:两个%%分隔的规则区域内,所有模式匹配规则必须顶格书写,行首不能存在空格、制表符等任何缩进空白。
你写的代码中,[a-z]、.、\n对应的所有规则行前面都加了前导空格,Flex不会将这些行识别为匹配规则,而是默认判定为需要直接嵌入生成C文件的原生代码,解析到[a-z]这类不符合C语法的内容时,就会抛出unexpected character错误。
另外部分旧版本Flex环境下,空实现的yywrap()会触发隐式声明编译警告,可以一并修复。
修复步骤
- 删除规则段所有匹配规则行的前导缩进,保证每个模式规则顶格书写
- 可在定义段添加
%option noyywrap,替代手动编写的空yywrap()函数,兼容不同版本Flex环境 - 定义段、用户自定义代码段的注释和代码可以保留合理缩进,仅需保证规则段的匹配模式行无行首空白即可
修复后的完整可运行代码如下:
%{ /* definitions*/ %} /*rules*/ %% [a-z] {printf("Single lowercase character\n");} . {printf("Not a lowercase character\n");} \n {return 0;} %% int main() { printf("Enter String: "); yylex(); return 0; }
修复后按标准流程编译运行即可:
- 执行
flex flex.l生成C源文件lex.yy.c - 执行
gcc lex.yy.c -o flex_test -lfl编译生成可执行文件 - 运行程序输入字符即可得到预期匹配输出
内容的提问来源于stack exchange,提问作者coder123
相关产品推荐
相关产品推荐

