【问题标题】:Default data type in yaccyacc 中的默认数据类型
【发布时间】:2021-12-11 20:01:06
【问题描述】:

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

【问题讨论】:

  • 有哪些手册和ppts?您找到了哪些相关信息?
  • 是的,当他们做$$ = $1 + $2时,$$的数据类型是如何推断出来的?
  • 无论使用什么类型,在the token kind names 中用union 声明它。
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: c compiler-construction bison yacc


【解决方案1】:

默认类型为int

来自Bison manual section 3.4.1, Data types of semantic values

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

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

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

您还可以在 yacc 的 Posix 规范中找到它,它可能在您的机器上以 man 1p yacc 的形式出现,可在 http://man7.orgLinux man-pages 存储库中在线获取。或者,您可以咨询 opengroup.org 上的 official Posix specification for yacc(您可能必须注册才能看到该页面,但它与您在 man7.org 上找到的信息基本相同。)。在这两种情况下,如果你仔细阅读非常,你会发现默认类型的描述;它在%type 声明的描述中标记为“声明部分”的部分中,它说:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多