词法分析中如何在Flex的.l文件内访问当前状态
在Lex .l文件中访问当前自定义状态的方案
为每个自定义状态单独编写EOF规则
这是最直接且符合Lex设计的方式,不需要获取状态值,直接通过状态限定语法为每个状态单独定义EOF匹配规则,精准输出对应错误:<str><<EOF>> { showError("未闭合的字符串", EOF_ERROR); return 0; } <chars><<EOF>> { showError("未闭合的字符常量", EOF_ERROR); return 0; } <comment><<EOF>> { showError("未闭合的注释", EOF_ERROR); return 0; } <text_block><<EOF>> { showError("未闭合的文本块", EOF_ERROR); return 0; } <text_block_chars><<EOF>> { showError("未闭合的文本块内容", EOF_ERROR); return 0; }这种方式无需调用任何内部函数,代码逻辑清晰,维护起来也更方便。
自定义全局变量追踪当前状态
如果想统一处理所有状态的EOF错误,可以在.l文件的声明块中定义全局变量,在进入每个自定义状态时更新该变量:%{ char current_state[32] = "INITIAL"; %} %% \" { BEGIN(str); strcpy(current_state, "str"); } \' { BEGIN(chars); strcpy(current_state, "chars"); } "/*" { BEGIN(comment); strcpy(current_state, "comment"); } // 补充其他进入对应状态的规则... <str,chars,comment,text_block,text_block_chars><<EOF>> { char err_msg[64]; sprintf(err_msg, "未闭合的%s", current_state); showError(err_msg, EOF_ERROR); return 0; } %%这种方式需要手动维护状态变量,但能实现统一的错误处理逻辑。
Lex本身没有提供在动作代码中直接获取当前状态名称的内置方法,以上两种方案都可以仅通过修改.l文件实现,无需改动生成的lex.yy.c文件。
内容的提问来源于stack exchange,提问作者Deepak Sangle
相关产品推荐
相关产品推荐

