c - yacc 中的默认数据类型
问题描述
yacc/bison 中栈元素的数据类型是什么?我尝试过 yacc 手册,一些学术 ppts 但找不到任何东西/喜欢$$, $1, $2
等。
解决方案
默认类型是int
.
如果您的程序对所有语言结构使用相同的数据类型,Bison 通常将类型 int 用于语义值。
我强烈建议收藏并阅读 Bison 手册。它包含对该工具的高度可读的介绍,它实际上描述了 Bison 的工作原理。在 Internet 上,您会找到很多关于遗留工具的古老文档,这可能就是您正在查看的文档。一般来说,他们都说默认类型是int
,但您可能不得不努力寻找规范。例如,您可以在 Stephen Johnson 经常链接的Yacc 文档中找到它,位于http://dinosaur.compilertools.net的“支持任意值类型”的小节中:
默认情况下,动作和词法分析器返回的值是整数。
您还可以在yacc的Posix规范中找到它,它可能在您的机器man 1p yacc
上以. 或者,您可以在 opengroup.org 上查阅yacc 的官方 Posix 规范(您可能必须注册才能看到该页面,但它与您在 man7.org 上找到的信息基本相同。)。在这两种情况下,如果你仔细阅读,你会发现默认类型的描述;它位于声明描述中标有“声明部分”的部分中,其中显示:%type
如果这个结构[ie %type ...]存在,yacc 将执行类型检查;如果此构造不存在,则解析堆栈应仅保存int类型。
请注意,这并不是对 Bison 的完全准确描述。如果您使用声明(如我的第一个链接中所述),那么无论您的语法描述中%define api.value.type { ... }
是否有声明,这将是所有堆栈的语义类型。%type
如果您使用 Bison,Bison 手册应该是您的 goto 参考。
推荐阅读
- linux - 在 AWS EC2 ubuntu 实例上使用自己的 mosquitto 代理时重新连接到 mqtt 代理失败
- visual-studio-code - 在VSCode中设置等号的快捷方式
- javascript - jQuery 仅在桌面屏幕宽度上执行滚动条件
- python - 在 PyGame 中切换显示的表面允许用户滚动表面的边界
- javascript - 为什么添加“ rel='stylesheet'”会阻止本地css文件在浏览器中加载?
- java - Spring 的哪个部分负责创建默认的 JSON 样式的异常消息?
- mysql - 获得加薪后低于平均工资的员工
- c++ - 来自 cin 的字符数组
- elixir - 检查模块是否实现了行为
- r - 随机增量循环