- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望 Lemon 解析一个简单的类似 C 的表达式,支持对一组具有已知名称的预定义变量进行整数和字符串比较。为了简单起见,我们假设它仅支持字符串比较。因此,以下字符串是我正在讨论的表达式类型的一个很好的示例:
a == "literal_1" || a == "literal_2"
因此,我的词法分析器必须按以下顺序向解析器提供值:
void *p = parserAlloc(malloc);
parser(p, TOK_VARIABLE_A, NULL);
parser(p, TOK_OPERATOR_EQ, NULL);
parser(p, TOK_LITERAL, strdup("literal_1"));
parser(p, TOK_OPERATOR_OR, NULL);
parser(p, TOK_VARIABLE_A, NULL);
parser(p, TOK_OPERATOR_EQ, NULL);
parser(p, TOK_LITERAL, strdup("literal_2"));
parserFree(p, free);
我必须复制传递给解析器的文字字符串,因为它们可能包含我必须首先解码的转义序列。但是谁负责解析完成后释放内存呢?幸运的是,Lemon 用它的 %destructor
指令来救援,所以我可以写:
%token_destructor TOK_LITERAL { free($$); }
但事实上,我不想在我的解析器和词法分析器中硬编码 malloc
、strdup
和 free
的用法。我希望能够将分配器和解除分配器函数作为参数传递,但不仅在 parserInit
和 parserFree
中使用它们,而且还用于 token 分配和解除分配。
如何为 parserAlloc
声明附加参数以同时传递 malloc
和 free
? Lemon 中有 %extra_argument
指令,但它让我在每次提供 token 时传递参数。
最佳答案
parserAlloc的malloc
参数没有存储在任何地方,因为柠檬生成的解析器从不分配内存。 [注 1] 当然,free
函数也不会存储在任何地方,因为直到您调用 parserFree
时才会提供它。
通常,您也不需要在解析器操作中使用分配函数,但如果您使用 %destructor
/%token-destructor
,那么您将需要一个免费
功能。唯一有记录的机制是额外参数功能,正如您所说,它需要在每次调用解析器时提供参数。这有点烦人,特别是因为解析器立即将其存储到解析器状态结构中(即 parse
的第一个参数),但事实就是如此。更改很容易,而且 Lemon 不受任何阻碍,因此您可以进行所需的更改。但按照规定,%extra-argument
是唯一的方法。
如果您在操作中需要同时分配和释放函数,无论出于何种原因,您可以将 %extra-argument
设为指向结构的指针(这实际上是 的正常情况>%额外参数
);该结构将包含指向这两个函数的指针。或者,您可以使用具有标准 realloc
接口(interface)的函数:realloc(NULL, sz)
相当于 malloc(sz)
和 realloc(p, 0)
相当于 free(p)
(只要 p
不为 NULL)。有关详细信息,请参阅 man realloc
。这不会打扰柠檬解析器,因为它从不使用 malloc 或 free。
%stack-size 0
,那么生成的解析器将在溢出之前重新分配解析器堆栈,而不是抛出错误。在这种情况下,解析器使用标准库 realloc
来分配或重新分配堆栈,而不是提供给 parserAlloc
的 malloc 函数,并且 parserFree
释放具有标准库free
的堆栈,而不是作为参数传递的函数。关于Lemon 中 token 析构函数的自定义释放函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36367787/
我已经被这个问题困扰了一段时间了。我想解析一些简单的东西: 喜欢:word1 word2 .. wordN 讨厌:word1 word2 .. wordN 我正在使用柠檬+Flex。目前我的语法看起来
我希望 Lemon 解析一个简单的类似 C 的表达式,支持对一组具有已知名称的预定义变量进行整数和字符串比较。为了简单起见,我们假设它仅支持字符串比较。因此,以下字符串是我正在讨论的表达式类型的一个很
我有以下柠檬语法(从真实语法简化而来): %right ASSIGN . %nonassoc FN_CALL . program ::= expression . expression ::= exp
假设我有一个 Edge。如何轻松找到它连接的两个节点? LEMON 的文档太少了,我找不到这方面的信息。 最佳答案 您可以使用源和目标来查找边缘连接的节点,它是这样工作的 ListDigraph gr
我正在尝试学习 flex 和 lemon,以便解析(适度)复杂的文件格式。到目前为止,我有我的语法和 lex 文件,我相信它正确地解析了一个示例文件。现在,我想将用 flex 扫描的 token 文本
更新了更多信息 我在使用 Lemon 解析简单的元素数组时遇到问题。谁能赐教一下?? 我正在尝试使用 mygrammar 定义解析此字符串“[0 0 612 792][100 200]”,解析器总是跳
所以基本上我想在 PHP 中解析结构 CSS 代码,使用由 PEAR 包 PHP_LexerGenerator 和 PHP_ParserGenerator 生成的词法分析器/解析器。我的目标是像这样解
图表示例: ListDigraph G; ListGraph::Node A = G.addNode(); ListGraph::Node B = G.addNode(); ListGraph::No
我有一张包含许多多边形的 map 。我想用这些多边形的“中心”进行寻路。所以我尝试使用 Lemon Graph Library 来生成我的图和 Dijkstra 的算法。 我在 Lemon 教程中看到
我对从 Lemon Graph Libraries (Lemon's Dijkstra's http://lemon.cs.elte.hu/pub/tutorial/a00009.html) 运行 D
我正在使用 LEMON Parser Generator由于某种原因,它在输出文件的末尾输出了一堆垃圾,而不是用生成的代码替换 lempar.c 中的 %%。我直接从 sqlite 源复制了 lemo
是否有可能在 C++ 中使用循环创建柠檬图? 我的问题: 列为节点的数据库表(我们称之为 t_nodes) 带有图形信息的数据库表(我们称之为 t_edges):node1 |节点2 |边缘得分 超过
我正在尝试将计算器从 Bison 转换为 Lemon。 我遇到了一个涉及标准输入的意外问题,其中这两个程序的行为完全不同。野牛版按 [Enter] 后立即打印结果。随着柠檬版,结果延迟到我输入新的表达
我创建了一个图并在 Lemon Graph Library 中添加了节点和转换 typedef ListDigraph Graph; vector Process; for(temp = temp.c
我正在使用 LEMON Graph library 并且想知道是否有一种有效的方法可以通过其对应的 ListDigraph::NodeMap 的值? 我在想这样的事情: lemon::ListDigr
我正在尝试使用柠檬解析器生成器生成解析器表,但是当我运行 lemon grammar.y 时生成的 .out 文件仅包含以下状态自动机。 有没有办法同时获取非终端的转到表,而不仅仅是自动机的状态?或者
这是 Lemon Tutorial 中的图形初始化示例: ListDigraph g; ListDigraph::Node x = g.addNode(); ListDigraph::Node y =
我有以下代码 typedef ListDigraph::NodeMap Node_names; vector initial_state; vector P_names; //some loop {
当我用这段代码构建图 g 时: ListDigraph g; for (int i = 0; i , ); 最佳答案 可以用nodeFromId成员函数来完成,参见Graph Class Refere
在过去的几周里,我一直在深入研究将 SQL 语句解析为可管理的东西的美丽世界,结果发现我可能需要一个完整的词法分析器/解析器来正确处理所有允许的标记/格式做同样的事情。 我最感兴趣的是 create
我是一名优秀的程序员,十分优秀!