S/L/l 在 YYSTYPE/YYLTYPE/yylval/yylloc 中代表什么?

What S/L/l stands for in YYSTYPE/YYLTYPE/yylval/yylloc?

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

我想知道 S/L/l 代表什么?

我的猜测是:

形式为 "why is this historical name spelled X?" 的问题几乎总是无法回答,因为很难回到 30 年或更多年前找到第一个想到变量名的人并询问他们在想什么。即使他们还活着,他们现在也可能不记得他们原来的思路了。

问一个相关的问题可能是合理的,"What mnemonic device can I use to keep these strange names straight in my head?" 当然,这样的问题必然是特定于文化的,因为对母语为英语的人来说好的助记工具不一定对某些人有用例如,他的第一语言是希腊语。然而,撇开这些不谈,这里是我的想法(带有一些小的历史记录):

    据我所知,
  • yylval 从一开始就在 Yacc 中。本来是和另一个外部可见变量配对的,yyvalyylval是词法扫描器的语义值"returned",yyval是词法扫描器产生的语义值生产规则的语义动作(即 $$ 翻译成什么)。因此,yylval 是前瞻标记的(语义值),我很确定这是第一个 l 的来源。即使不是历史意义,也是合理的助记符。 (不幸的是,前瞻符号的词法类型是 yychar 而不是 yyltype,因此助记符并不完美。)

  • 我一直建议将 YYSTYPE 理解为“Semantic TYPE”,因为 bison 手册指的是 "semantic values" 由 "semantic actions" 制作。我认为这里使用的形容词 "semantic" 在其他文献中也很常见。 S 的起源可能来自 "stack"(如 "the type of the value stack"),但由于解析器有多个堆栈,这不是一个非常有用的助记符。

  • Bison 将位置信息添加到解析模型,这意味着需要有另一个具有另一种数据类型的全局变量,用于将位置信息从词法扫描器传递到解析器。很明显 YYLTYPE yylloc; 是通过类比 yylval 产生的,而且在 bison 生成的解析器内部确实有一个名为 yyloc 的局部变量,它起着类似于 [=11= 的作用].所以YYLTYPE中的L绝对可以理解为“Location TYPE”,而第一个[ yylloc中的=16=]类似于yylval中的第一个l,表明llocl先行令牌。