编译这段Flex代码遇阻,请求排查代码错误原因
分析你的Flex代码中的错误
我帮你梳理一下这段Flex代码里的几个关键问题,这些都是导致编译失败的主要原因:
1. 正则表达式的分组与宏引用错误
你定义的数字匹配规则:
{digit}+{{point}{digit+}}? {printf("Number\n");}
这里有两个语法问题:
- Flex中引用已定义的宏只用单个大括号,
{{point}}是错误写法,应该写成{point} - 如果你想把
{point}{digit+}作为一个可选分组,需要用圆括号而非大括号——大括号是用来引用宏的,圆括号才是正则表达式的分组语法。
修正后应该是:
{digit}+({point}{digit+})? {printf("Number\n");}
2. 特殊字符未转义
最后一条错误处理规则:
%. { yyerror(); }
这里的%是Flex的元字符(用于宏定义、规则分隔等场景),直接写会被解析器当成语法指令,而非普通字符。需要转义处理,改成:
\%. { yyerror(); }
或者把%放到字符类里(字符类里的元字符会被当作普通字符):
[%]. { yyerror(); }
3. 可选的优化建议(非编译错误,但值得注意)
- 如果你之后打算启用
yyparse()和Yacc/Bison配合,要确保y.tab.h里已经正确定义了HI、BYE这些token,不然注释去掉后会报未定义错误。 - 字符串匹配规则可以简化写法,比如
("hi"|"oi"|"swagatam")"\n"可以写成(hi|oi|swagatam)\n,Flex会自动识别字符串字面量,不需要额外加引号(加引号也没问题,但没必要)。
修正后的完整代码
%{ #include <stdlib.h> #include "y.tab.h" %} digit [0-9] letter [A-Za-z] point [.] %% {digit}+({point}{digit+})? {printf("Number\n");} {letter}+ {printf("ID\n");} (hi|oi|swagatam)\n { printf("START\n"); /*return HI;*/ } (tchau|bye|biday)\n { printf("END\n"); /*return BYE;*/ } \%. { yyerror(); } %% int main(void) { //yyparse(); yylex(); return 0; } int yywrap(void) { return 0; } int yyerror(void) { printf("Error\n"); exit(1); }
现在你可以用标准的Flex编译命令尝试:
flex your_file.l gcc lex.yy.c -o your_program
内容的提问来源于stack exchange,提问作者erebus
相关产品推荐
相关产品推荐

