regex - yytext 包含不匹配的字符

标签 regex string match flex-lexer lex

背景

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

问题

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

最佳答案

我不知道如何从词法分析器中生成该输出,但很容易看出如何在解析器中生成它。

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

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

实际上,这是一个悬空指针,因为 yytext 指向词法分析器框架内的私有(private)内存,并且该指针仅在下次调用词法分析器之前有效。由于解析器通常需要在执行归约操作之前查看下一个输入标记,因此几乎可以肯定,产生式中每个终端的 s 成员中的指针在执行归约操作时已失效。操作已执行。

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

yylval.s = strdup(yytext);

然后,当您不再需要该副本时,您将负责释放它。

关于regex - yytext 包含不匹配的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33873224/

相关文章:

javascript - 更精确的通配符正则表达式

python - 如何针对单个值测试多个变量是否相等?

python - 使用正则表达式从 python 中的列表项中删除子字符串

正则表达式匹配没有尾随空格的单词和单词组合

c++ - 在 stringstream 的 ssh 命令中转义 bash 脚本中的引号

c# - 用 0 到 9 的数字填充字符串并开始新的直到长度为 50

string - 坚持 Apostolico-Crochemore 算法

excel - 仅从与人员列表匹配的日期和 ID 中获取名称

java - 可选择使用 String.split(),在分隔符的最后一次出现处拆分字符串

php - 为什么我尝试替换字符串中的字符失败?