我希望 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
and中使用它们parserFree
,而且还用于令牌分配和释放。
如何声明附加参数以同时parserAlloc
传递?Lemon中有指令,但它让我每次输入令牌时都传递我的参数。malloc
free
%extra_argument