Bison:纯推送解析器中存储的最后一个 $$ 值在哪里?
Bison: where is the last $$ value stored in pure-push parser?
我写了一个解析器定义,它作为扩展与 python 交互。我声明了以下选项,以便 Bison 生成可重入推送解析器:
%define api.pure full
%define api.push-pull push
为了通过 C API 将语义值传递给 python,我将 YYSTYPE
声明为 PyObject*
,如下所示:
%define api.value.type {PyObject*}
现在,最后一个 ("accepting") 规则具有以下操作:
full : declarations data
{ $$ = Py_BuildValue("(s, O, O)", "full", , ); }
;
此处的Py_BuildValue
函数将创建一个元组对象,其中包含一个字符串和另外两个任意类型的对象,以及return一个指向它的PyObject*
指针.
鉴于我按以下方式调用解析器:
token_index = 0;
yypstate* ps = yypstate_new();
do{
token_id = get_token_id(token_index);
semval = semvals[token_index];
state = yypush_parse(ps, token_id, &semval);
token_index += 1;
} while (state == YYPUSH_MORE);
...我如何访问由 full
规则(即它的 $$
)生成的值?
我试了yylval
和yyval
,好像没有定义。
我怀疑指向该值的指针可能存储在 ps
结构中的某处,但我找不到关于它的任何文档。
堆栈在解析结束时被释放,因此作为 $$
压入的任何内容都将消失。如果你想 return 一个值,你应该向推送解析器提供一个额外的参数,它指向存储结果的地方,而不是将它分配给 $$
.
我写了一个解析器定义,它作为扩展与 python 交互。我声明了以下选项,以便 Bison 生成可重入推送解析器:
%define api.pure full
%define api.push-pull push
为了通过 C API 将语义值传递给 python,我将 YYSTYPE
声明为 PyObject*
,如下所示:
%define api.value.type {PyObject*}
现在,最后一个 ("accepting") 规则具有以下操作:
full : declarations data
{ $$ = Py_BuildValue("(s, O, O)", "full", , ); }
;
此处的Py_BuildValue
函数将创建一个元组对象,其中包含一个字符串和另外两个任意类型的对象,以及return一个指向它的PyObject*
指针.
鉴于我按以下方式调用解析器:
token_index = 0;
yypstate* ps = yypstate_new();
do{
token_id = get_token_id(token_index);
semval = semvals[token_index];
state = yypush_parse(ps, token_id, &semval);
token_index += 1;
} while (state == YYPUSH_MORE);
...我如何访问由 full
规则(即它的 $$
)生成的值?
我试了yylval
和yyval
,好像没有定义。
我怀疑指向该值的指针可能存储在 ps
结构中的某处,但我找不到关于它的任何文档。
堆栈在解析结束时被释放,因此作为 $$
压入的任何内容都将消失。如果你想 return 一个值,你应该向推送解析器提供一个额外的参数,它指向存储结果的地方,而不是将它分配给 $$
.