首页 > 解决方案 > YYSTYPE/YYLTYPE/yylval/yylloc 中的 S/L/l 代表什么?

问题描述

在 flex/bison 中,有两种数据类型和对应的静态变量:

我想知道什么是S/L/l立场?

我的猜测是:

标签: bisonflex-lexer

解决方案


问题形式为“为什么这个历史名称拼写为 X?” 几乎总是无法回答,因为很难回到 30 年或更长时间的时间去找到第一个想到变量名的人并询问他们在想什么。即使他们还活着,他们现在也可能不记得他们最初的思想链。

问一个相关的问题可能是合理的,“我可以使用什么助记工具将这些奇怪的名字牢牢记在脑海中?” 当然,这样的问题必然是特定于文化的,例如,对于母语为英语的人来说,好的助记工具不一定对母语是希腊语的人有好处。但是,撇开这些不谈,以下是我的想法(附有一些小的历史记录):

  • yylval据我所知,从一开始就在 Yacc。最初,它与另一个外部可见变量配对,yyval:yylval是词法扫描器“返回”的yyval语义值,是产生式规则的语义动作(即$$翻译成的内容)生成的语义值。因此,yylval是前瞻标记的(语义值),我很确定这就是第一个标记的l来源。就算不是历史意义,也是合理的助记词。(不幸的是,前瞻符号的词法类型是yychar而不是yyltype,所以助记符并不完美。)

  • 我一直建议将YYSTYPE其视为“语义类型”的意思因为野牛手册指的是“语义动作”产生的“语义值”。我认为这里使用形容词“语义”在其他文献中也很常见。可能S来自“堆栈”的起源(如“值堆栈的类型”),但由于解析器有多个堆栈,这不是一个非常有用的助记符。

  • Bison 将位置信息添加到解析模型中,这意味着需要有另一个具有另一种数据类型的全局变量,用于将位置信息从词法扫描器传递到解析器。似乎很清楚,它YYLTYPE yylloc;是通过类比产生的yylval,实际上在野牛生成的解析器内部有一个名为的局部变量yyloc,其作用类似于yyval. 所以LinYYLTYPE绝对可以认为是“L ocation TYPE”的意思,first in与 first lin类似yylloc,表示前瞻记号的位置lyylval


推荐阅读