Bison:pure-push解析器中存储的最后一个$$值在哪里?

时间:2018-01-14 21:58:39

标签: c bison

我写了一个解析器定义,它与python作为扩展接口。我声明了以下选项,以便Bison生成一个可重入的推送解析器:

PnlCase

为了通过它的C API将语义值传递给python,我将%define api.pure full %define api.push-pull push 声明为YYSTYPE,如下所示:

PyObject*

现在,最后一条(“接受”)规则具有以下操作:

%define api.value.type {PyObject*}

这里的full : declarations data { $$ = Py_BuildValue("(s, O, O)", "full", $1, $2); } ; 函数将创建一个包含字符串和另外两个任意类型对象的元组对象,并返回一个Py_BuildValue指针。

鉴于我以下列方式调用解析器:

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结构中的某处,但我找不到任何文档。

1 个答案:

答案 0 :(得分:2)

在解析结束时释放堆栈,因此按$$推送的任何内容都将消失。如果要返回一个值,则应该为推送解析器提供一个额外的参数,该参数指向存储结果的位置,而不是将其分配给$$