c - Bison:纯推送解析器中存储的最后一个 $$ 值在哪里?

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

最佳答案

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

关于c - Bison:纯推送解析器中存储的最后一个 $$ 值在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48254587/

相关文章:

c++ - 从无符号整数类型样式转换。这种风格好吗?

c++ - 将 _msize 与 new[] 一起使用安全吗?

c - 为什么 fprintf 开始乱序打印或根本不打印?

c - 具有相同类型的不兼容指针类型

parsing - Flex/Lex 和 Yacc/Bison 有什么区别?

c - 如果我只是在读取文件,是否需要检查 fclose() 的返回状态?

c - c99中的时间以毫秒为单位?

makefile - Yacc 和 Lex 包含混淆

Bison 冲突转移/减少

c - 创建 AST 后进行语义检查