C语言 Bison:纯推送解析器中存储的最后一个 $$ 值在哪里



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

%define api.pure full
%define api.push-pull push

为了通过它的C API将语义值传递给python,我声明了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规则生成的值(即其$$(?

我尝试了yylvalyyval,似乎它们没有定义。我怀疑指向该值的指针可能存储在ps结构中的某个位置,但我找不到任何有关它的文档。

堆栈在

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

最新更新