yytext 包含不匹配的字符
yytext contains characters not in match
背景
我正在使用 flex 为我正在实现的编程语言生成词法分析器。
我对这个标识符规则有一些问题:
[a-zA-Z_][a-zA-Z_0-9]* {
printf("yytext is %s\n", 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
中包含这些字符,我该如何解决这个问题?
我看不出您的词法分析器是如何产生该输出的,但是很容易看出它是如何在您的解析器中产生的。
基本上保留yytext
的值是不正确的:
yylval.s = yytext; /* DON'T DO THIS */
实际上,这是一个悬垂指针,因为 yytext
指向词法分析器框架内的私有内存,并且该指针仅在下一次调用词法分析器之前有效。由于解析器通常需要在执行归约动作之前查看下一个输入标记,因此几乎可以肯定,产生式中每个终端的 s
成员中的指针在执行动作时已经失效.
如果要保留yytext
指向的token的字符串值,必须复制:
yylval.s = strdup(yytext);
然后您将负责在不再需要时释放该副本。
背景
我正在使用 flex 为我正在实现的编程语言生成词法分析器。
我对这个标识符规则有一些问题:
[a-zA-Z_][a-zA-Z_0-9]* {
printf("yytext is %s\n", 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
中包含这些字符,我该如何解决这个问题?
我看不出您的词法分析器是如何产生该输出的,但是很容易看出它是如何在您的解析器中产生的。
基本上保留yytext
的值是不正确的:
yylval.s = yytext; /* DON'T DO THIS */
实际上,这是一个悬垂指针,因为 yytext
指向词法分析器框架内的私有内存,并且该指针仅在下一次调用词法分析器之前有效。由于解析器通常需要在执行归约动作之前查看下一个输入标记,因此几乎可以肯定,产生式中每个终端的 s
成员中的指针在执行动作时已经失效.
如果要保留yytext
指向的token的字符串值,必须复制:
yylval.s = strdup(yytext);
然后您将负责在不再需要时释放该副本。