背景
我正在使用flex为我正在实现的编程语言生成lexer。
我对这个标识符规则有一些问题:
[a-zA-Z_][a-zA-Z_0-9]* {
printf("yytext is %sn", yytext);
yylval.s = yytext;
return TOK_IDENTIFIER;
}
当我的解析器解析如下表达式时,该规则正常工作:
var0 = var1 + var2;
printf
语句将打印出以下内容:
yytext is 'var0'
yytext is 'var1'
yytext is 'var2'
这是它应该做的。
问题
但是,当我的解析器解析像这样的函数声明时:
func(array[10] type, arg2 wef, arg3 afe);
现在printf
语句将打印以下内容:
yytext is 'array['
yytext is 'arg2 wef'
yytext is 'arg3 afe'
问题是yytext
包含不匹配的字符。
问题
为什么flex在yytext
中包含这些字符?我如何解决这个问题?
我不知道如何从lexer中生成输出,但很容易看出如何在解析器中生成输出。
基本上,保留yytext
:的值是不正确的
yylval.s = yytext; /* DON'T DO THIS */
实际上,这是一个悬空指针,因为yytext
指向lexer框架内的私有内存,并且该指针只有在下次调用lexer时才有效。由于解析器通常需要在执行缩减操作之前查看下一个输入令牌,因此几乎可以肯定的是,在执行该操作时,生产中每个终端的s
成员中的指针将被无效。
如果要保留yytext
指向的令牌的字符串值,则必须复制它:
yylval.s = strdup(yytext);
然后您将负责在不再需要时释放副本。