c - Lex 正则表达式获得了一些额外的字符

标签 c bison yacc flex-lexer lex

我的 lex 文件中有以下定义:

L   [a-zA-Z_]                                           
A   [a-zA-Z_0-9] 
%%
{L}{A}*                 { yylval.id = yytext; return IDENTIFIER; }

然后我在我的 YACC 文件中执行以下操作:

primary_expression
    : IDENTIFIER            { puts("IDENTIFIER: "); printf("%s", $1); }

我的源代码(我正在分析的代码)具有以下分配:

ab= 10;

出于某种原因,printf("%s", $1); 部分正在打印 ab= 而不仅仅是 ab

我很确定那是正在打印 ab= 的部分,因为当我删除 printf("%s", $1); 时,不会打印标识符完全没有。

我真的没办法了。我究竟做错了什么?

让我知道是否可以更清楚。

最佳答案

What am I doing wrong?

您假设 yytext 指向的字符串是常量。它不是。

yytext 指向的字符串的生命周期是关联规则的词法 Action 。如果该规则最终返回,yytext 将继续存在,直到下一次调用 yylex。就是这样。

bison 生成的解析器具有单符号前瞻性。因此,当解析器执行语义操作时,yylex 已被再次调用(用于先行);因此,即使是规则中的最后一个(或唯一一个)标记,您也不能使用 yytext 的保存值。

解决方法:复制字符串。 (我使用 strdup,但出于某种原因有些人喜欢 malloc 和 strcpy。如果你这样做,请不要忘记 NUL 终止符。)并记住 free() 完成后的副本。

供引用:what the flex manual says.

关于c - Lex 正则表达式获得了一些额外的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24398448/

相关文章:

c - 如何根据其他数组的数量对数组进行排序?

bison - 警告 : assignment makes pointer from integer without a cast yylval=atoi(yytext);

makefile - Make 添加意外的 mv 命令

c - 成员 "Token"的 Yacc 错误请求不是结构或 union

python - xml DTD 文件的解析器

c++ - 有 Yacc 语法调试器吗?

c++ - 如何使用 dlmopen 在不同线程中打开多个共享库?

c - 如何将结构体数组传递给 C 中的函数?

c - 为什么程序没有运行 flex 和 bison 编译的 C 程序的主要功能

c++ - 什么是最快的 C++ 类或 C 库将纬度和经度从十进制度数转换为字符串并返回