首页 > 解决方案 > yacc 中的默认数据类型

问题描述

yacc/bison 中栈元素的数据类型是什么?我尝试过 yacc 手册,一些学术 ppts 但找不到任何东西/喜欢$$, $1, $2等。

标签: ccompiler-constructionbisonyacc

解决方案


默认类型是int.

来自Bison 手册第 3.4.1 节,语义值的数据类型

如果您的程序对所有语言结构使用相同的数据类型,Bison 通常将类型 int 用于语义值。

我强烈建议收藏并阅读 Bison 手册。它包含对该工具的高度可读的介绍,它实际上描述了 Bison 的工作原理。在 Internet 上,您会找到很多关于遗留工具的古老文档,这可能就是您正在查看的文档。一般来说,他们都说默认类型是int,但您可能不得不努力寻找规范。例如,您可以在 Stephen Johnson 经常链接的Yacc 文档中找到它,位于http://dinosaur.compilertools.net的“支持任意值类型”的小节中:

默认情况下,动作和词法分析器返回的值是整数。

您还可以在yaccPosix规范中找到它,它可能在您的机器man 1p yacc上以. 或者,您可以在 opengroup.org 上查阅yacc 的官方 Posix 规范(您可能必须注册才能看到该页面,但它与您在 man7.org 上找到的信息基本相同。)。在这两种情况下,如果你仔细阅读,你会发现默认类型的描述;它位于声明描述中标有“声明部分”的部分中,其中显示:%type

如果这个结构[ie %type ...]存在,yacc 将执行类型检查;如果此构造不存在,则解析堆栈应仅保存int类型。

请注意,这并不是对 Bison 的完全准确描述。如果您使用声明(如我的第一个链接中所述),那么无论您的语法描述中%define api.value.type { ... }是否有声明,这将是所有堆栈的语义类型。%type如果您使用 Bison,Bison 手册应该是您的 goto 参考。


推荐阅读