Flex/Lex定义错误求助:未声明标识符'keyword'问题
解决Lex词法分析器中"keyword未定义"的错误
错误原因
你错误使用了Lex的宏定义语法,Lex用于正则复用的规则宏有特定定义方式,并非简单的赋值或字符串声明,导致生成的C代码中找不到对应符号。
正确解决步骤
在定义段正确声明关键字宏
在Lex文件的%%规则段之前,采用「宏名 + 空格 + 关键字正则」的格式定义,所有关键字用|分隔:keyword "if"|"else"|"while"|"return" // 替换成你的玩具语言关键字注意:这个定义要放在
%{ ... %}的C代码块外面,属于Lex专属的宏定义区域。规则段正确引用宏
在%%之后的规则里,用{keyword}匹配关键字并执行打印动作:{keyword} { printf("keyword\n"); }
完整示例Lex文件
%{ #include <stdio.h> %} // 定义你的玩具语言关键字宏 keyword "if"|"else"|"fn"|"let" %% // 匹配关键字(需放在标识符规则之前,避免被识别为标识符) {keyword} { printf("keyword\n"); } // 匹配标识符 [a-zA-Z_][a-zA-Z0-9_]* { printf("identifier\n"); } // 匹配数字 [0-9]+ { printf("number\n"); } // 忽略其他符号与换行 .|\n { /* 无动作,跳过 */ } %% int main() { yylex(); return 0; }
常见坑点
- 不要把Lex宏写在
%{ ... %}里:该区域内容会直接插入C代码,Lex不会解析,若在此写#define keyword ...,{keyword}不会被Lex替换,C编译时会被认定为未定义标识符。 - 不要用赋值式定义:Lex不支持
keyword = "if"|"else"这类写法,必须是宏名后跟空格加正则表达式。 - 关键字规则要优先于标识符:标识符的正则会匹配关键字,所以必须让关键字规则先被匹配。
内容的提问来源于stack exchange,提问作者Panda
相关产品推荐
相关产品推荐

