yytext包含不匹配的字符



背景

我正在使用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包含不匹配的字符。

问题

为什么flexyytext中包含这些字符?我如何解决这个问题?

我不知道如何从lexer中生成输出,但很容易看出如何在解析器中生成输出。

基本上,保留yytext:的值是不正确的

yylval.s = yytext;  /* DON'T DO THIS */

实际上,这是一个悬空指针,因为yytext指向lexer框架内的私有内存,并且该指针只有在下次调用lexer时才有效。由于解析器通常需要在执行缩减操作之前查看下一个输入令牌,因此几乎可以肯定的是,在执行该操作时,生产中每个终端的s成员中的指针将被无效。

如果要保留yytext指向的令牌的字符串值,则必须复制它:

yylval.s = strdup(yytext);

然后您将负责在不再需要时释放副本。

最新更新