bison - YYSTYPE/YYLTYPE/yylval/yylloc 中的 S/L/l 代表什么?
问题描述
在 flex/bison 中,有两种数据类型和对应的静态变量:
- YY S TYPE/yy l val
- YY L TYPE/yy l loc
我想知道什么是S/L/l
立场?
我的猜测是:
S
代表symbol
(即符号的语义数据类型)L
代表location
和l
代表“词法分析器”(意思是要与词法分析器共享的变量)。
解决方案
问题形式为“为什么这个历史名称拼写为 X?” 几乎总是无法回答,因为很难回到 30 年或更长时间的时间去找到第一个想到变量名的人并询问他们在想什么。即使他们还活着,他们现在也可能不记得他们最初的思想链。
问一个相关的问题可能是合理的,“我可以使用什么助记工具将这些奇怪的名字牢牢记在脑海中?” 当然,这样的问题必然是特定于文化的,例如,对于母语为英语的人来说,好的助记工具不一定对母语是希腊语的人有好处。但是,撇开这些不谈,以下是我的想法(附有一些小的历史记录):
yylval
据我所知,从一开始就在 Yacc。最初,它与另一个外部可见变量配对,yyval
:yylval
是词法扫描器“返回”的yyval
语义值,是产生式规则的语义动作(即$$
翻译成的内容)生成的语义值。因此,yylval
是前瞻标记的(语义值),我很确定这就是第一个标记的l
来源。就算不是历史意义,也是合理的助记词。(不幸的是,前瞻符号的词法类型是yychar
而不是yyltype
,所以助记符并不完美。)我一直建议将
YYSTYPE
其视为“语义类型”的意思,因为野牛手册指的是“语义动作”产生的“语义值”。我认为这里使用形容词“语义”在其他文献中也很常见。可能S
来自“堆栈”的起源(如“值堆栈的类型”),但由于解析器有多个堆栈,这不是一个非常有用的助记符。Bison 将位置信息添加到解析模型中,这意味着需要有另一个具有另一种数据类型的全局变量,用于将位置信息从词法扫描器传递到解析器。似乎很清楚,它
YYLTYPE yylloc;
是通过类比产生的yylval
,实际上在野牛生成的解析器内部有一个名为的局部变量yyloc
,其作用类似于yyval
. 所以L
inYYLTYPE
绝对可以认为是“L ocation TYPE”的意思,而first in与 firstl
in类似yylloc
,表示前瞻记号的位置。l
yylval
推荐阅读
- iis - IIS ARR 不处理端口 80 上的请求
- javascript - 如何将色块附加到我的 li 列表?
- react-native - React Native - 改变曲线方向
- reactjs - 如何在 React 中调整 Google Material 图标的大小?
- python - 是否可以合并 2 个列表列表?
- r - 使水管工.R 直接在 json 中返回字符串,而不是在具有单个元素的列表中
- puppeteer - 使用 Puppeteer 捕获选择组输入下拉菜单的屏幕截图
- azure - 如何从 C# 或 Microsoft.Azure.Management 删除应用服务 -> Web 应用 -> 日志文件
- powershell - PS脚本的简单日志文件?
- javascript - 使用参数在新窗口中打开 URL