- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用 Bison & Flex 或多或少 1 个月,所以如果我没有看到明显的东西(但我认为不是),我很抱歉。
我在使用 Flex Bison 释放内存时遇到问题。这是我的代码的样子:
parser.l
{DATE} { yylval.str= strdup(yytext);
pair<string,string> newpair = make_pair("DATE",yytext);
myvector.push_back(newpair);
return TOKEN_DATE ;}
这是我的 .l 文件的示例之一。我将 yytext 的值复制到 yylval.str 中。然后我用该内容(实际上是键/值)创建一个新对,然后返回 bison 的 token 日期。我的解析器 .y 不超过 yyparse;当捕获到某些东西时,它会打印出来。
我尝试对此运行 valgrind,但出现多个关于 strdup 的错误。我知道这个函数使用 malloc,但我不知道何时何地使用 FREE。
我可能猜它在 .y 文件中,但是在哪里?
test:
TOKEN_DATE { cout << $1 << endl; // here ? and what to free ?}
我真的不太明白所有这些,我真的很感激一个简单明了的解释。
提前致谢
编辑:
我尝试了几种方法,例如:
test:
TOKEN_DATE TOKEN_TOTO TOKEN_BLABLA { cout << $1 << endl; free($1); free($2);}
| TOKEN_DATE test { cout << $1 << endl, free($1); }
看起来编译和执行都不错,但是valgrind还是跟我说strdup函数中包含的malloc有问题。但是我不能在flex文件里面写free(yylval.str),否则bison是不会知道这个值的(如果我没理解错的话,我试过不行)。我真的不知道如何解决这个泄漏问题。
最佳答案
当您不再需要复制的字符串时,您需要释放它。在你相当简单的情况下,你可以 free($1) 在打印出来之后,但通常情况是解析器将复制的字符串插入到某个数据结构中,在这种情况下,该数据结构成为 malloc 存储的所有者,并且对 free 的调用将在析构函数中执行。
这与任何其他资源管理问题并没有什么不同;您需要始终清楚谁是已分配资源的所有者,因为所有者有责任在不再需要时释放资源。
内部发生的事情是 bison
维护了一堆语义值,每个语义值都有类型 YYSTYPE
(即“语义类型”),这也是yylval
的类型。当 token 移入堆栈时,bison
将 yylval
复制到堆栈顶部。在执行与产生式对应的 Action 之前,bison
将产生式中每个终端和非终端的语义值安排为$1
、$2
等(这不是拷贝;各种 $x
符号被替换为对 bison
堆栈上某个位置的引用。)
非终结符也有语义值,因为每个 Action 都将一个值存储到伪变量$$
中。 (如果 action 不这样做,$$
的值是不可预测的,但它仍然存在。)在 action 完成后,bison 删除 $1
,$2
... 取栈顶的值,然后将伪变量$$
复制到栈顶。它不会对弹出的值做任何事情,所以如果它们需要被释放或以其他方式销毁, Action 必须自己做。
因为语义值是简单复制的,所以语义类型不应包含任何不可简单复制的 C++ 对象。
如果使用%union
声明,那么语义类型YYSTYPE
是一个union
对象,需要告诉 bison
union 标记适用于每个终端和非终端。在这种情况下,$$
和所有 $n
都会自动附加正确的 .tag
,并且操作变得更加类型化-安全。
关于c++ - 在哪里释放 Bison/Flex 中的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22534993/
我有一个使用 Yacc 编写的语法。语法的相关部分摘录在这里 postfix : primary | postfix '[' expr ']' | postfix '[' ex
如何在 bison/yacc 中使用继承的属性? 说,我有这样的语法 - 程序 -> stmts 我想做的是在 Bison 身上: 程序:stmts {$$.next = newLabel(); $1
有什么方法可以更改 Bison 错误消息的格式?例如,不要说 syntax error, unexpected T_ID, expected ';' or T_IMPORT说 unexpected i
我的语法有这两个标记声明: %token RP %token ELSE 而这两条规则: Statement : IF LP Exp RP Statement; Statement : IF LP
如果有一个表单的输入文件: BEGIN stuff.... END BEGIN stuff ... END 我的 .y 文件是这样的 %token BEGIN %token END %star
我希望为现有语言创建一个 JavaScript 解析器,该语言目前具有笨拙的“手工制作”C# 和 Java 解析器。我想使用 Jison,并且也一直在尝试学习 Bison 的基础知识。 我不确定如何回
目前我正在研究一个源到源编译器,我已经编写了一个野牛解析器,可以正确地为输入创建 AST。我现在需要对语法树进行多次转换,因此我需要向树中插入许多节点。 我可以手动创建所有要添加到语法树中的结构体/联
如果有一个表单的输入文件: BEGIN stuff.... END BEGIN stuff ... END 我的 .y 文件是这样的 %token BEGIN %token END %star
我正在寻找为现有语言创建 JavaScript 解析器的方法,该语言目前具有笨拙的“手工制作”C# 和 Java 解析器。想用Jison,也在努力学习Bison的基础。 一个我不确定如何回答的问题是
我正在使用 flex/bison 编写解析器(我可以用 Python 编写解析器,但我总是更喜欢经典。) 当我用这个编译代码时: gcc -lfl -ly chance.tab.c lex.yy.c
正在使用 flex/bison 开发编译器。我的构建输出中有此警告。 警告:在默认操作中键入冲突 ('s' '') 请问有什么帮助吗? 最佳答案 它似乎与源中的 %token 和 %type 声明有关
考虑这个 lex.l 文件: %{ #include "y.tab.h" %} digit [0-9] letter [a-zA-Z] %% "+"
我正在为 bison 中的一个简单的 Pascal 编译器编写语法,我想可视化我在 pascal.y 中指定的语法的解析树。是否可以基于我的 pascal.y 文件以图形方式显示语法树? 最佳答案 野
我正在尝试编写一个能够使用以下输入的语法: begin #this is a example x = 56; while x > 0 do begin point 15
我正在尝试使用 BNF 语法编写 Flex/Bison 文件。但是,当我尝试编译时出现错误,而且我不确定如何调试它们。 BNF语法: ::= | head() ::=:: | @ | tail() |
我正在用 Flex/Bison 编写一个小程序来标记/解析我创建的查询语言。 我想知道是否有任何方法可以在 Flex/Bison 中创建任何关键字。 我的意思是:flex 将输入分解成一个标记列表,但
我正在尝试使用 flex 和 bison 创建过滤器,因为我想从复杂的语言中获取某些语法元素。我的计划是使用 flex + bison 来识别语法,并转储出感兴趣元素的位置。 (然后使用脚本根据转储的
我正在尝试实现一个可以进行浮点运算的 Flex/bison 计算器。我的 Flex 代码如下所示 %{ #include "calc.tab.h" #include void yyerror(cha
我正在尝试使用 FLEX 和 BISON 进行一些练习。 这是我写的代码: calc_pol.y %{ #define YYSTYPE double #include "calc_pol.tab.h"
我有一个使用括号和方括号作为分隔符的语法。当由 bison 生成的解析器输入带有不平衡分隔符的输入时,传递给 yyerror 的 YYLTYPE* 中的错误位置是输入的结尾。所以,例如,在输入 x
我是一名优秀的程序员,十分优秀!