在flex / bison中,有两种数据类型和相应的静态变量:
我想知道S/L/l
代表什么?
我的猜测是:
S
代表symbol
(即符号的语义数据类型)L
代表location
,并且l
代表“ lexer”(意味着与lexer共享的变量)。答案 0 :(得分:1)
以下形式的问题:“为什么这个历史名称拼写为X?”几乎总是无法回答,因为很难回到30年前或更长的时间来找到谁首先想到了变量名并询问他们在想什么。即使他们还活着,他们现在可能仍不记得他们最初的思想链。
提出一个相关的问题可能是合理的:“我可以使用哪种助记符设备将这些奇怪的名字直接记住?”当然,这样的问题必然是针对特定文化的,例如,对于母语为英语的人来说,良好的助记符设备不一定对母语为希腊语的人有用。但是,撇开这些,我是我的想法(带有一些历史性的小注释):
yylval
自开始以来一直在Yacc。最初,它与另一个外部可见变量yyval
配对:yylval
是词法扫描程序“返回”的语义值,而yyval
是生产规则的生成的语义值语义动作(即$$
所翻译的内容)。因此,yylval
是超前标记的(语义值),我很确定这就是第一个l
的来源。即使这不是历史意义,也是合理的助记符。 (不幸的是,前瞻符号的词法类型是yychar
而不是yyltype
,因此助记符并不完美。)
我一直建议将YYSTYPE
理解为“ S 语义 TYPE ”,因为野牛手册中提到的是“语义值”由“语义动作”产生。我认为在其他文学作品中也常使用形容词“语义”。 S
的来源可能来自“堆栈”(如“值堆栈的类型”中的内容),但是由于解析器有多个堆栈,因此这不是一个非常有用的助记符。
Bison将位置信息添加到了解析模型,这意味着需要另一个全局变量和另一个用于将位置信息从词法扫描器传递到解析器的数据类型。显然,YYLTYPE yylloc;
是类似于yylval
产生的,确实在野牛生成的解析器中有一个名为yyloc
的局部变量,其作用类似于{{1} }。因此,yyval
中的L
绝对可以被认为是“ L 位置 TYPE ”,而{ {1}}与YYLTYPE
中的第一个l
类似,表示 l 超级标记的 loc 位置。