在柔性/野牛,有两种数据类型和对应的静态变量:
我想知道S/L/l
代表什么?
我的猜测是:
S
代表symbol
(即,符号的语义数据类型)L
代表location
,和l
代表“词法分析器”(意为一个变量与词法分析器共享)。形式的问题,“为什么是拼X这个历史的名字吗?”几乎都是无法回答的,因为它是很难回到过去30年或更长时间找到谁首先想到了变量名,并要求他们什么,他们在想什么。即使他们还活着,他们现在可能不记得他们原以为链。
这可能是合理的问一个相关的问题,“什么记忆装置,我可以用它来保持这些奇怪的名字,直在我的头上?”当然,这样的问题必然是文化特有的,因为为第一语言是英语的好记忆装置不一定很好的人的第一语言是希腊语,例如。然而,留下一旁,这里是我的想法(有一些小的历史笔记):
yylval
一直在Yacc的,据我所知。最初,它与其他外部可见的变量配对,yyval
:yylval
是语义值“返回”词法扫描仪,yyval
是由产生式规则的语义动作产生的语义值(即,什么$$
翻译成)。因此,yylval
是超前记号的(语义值),我敢肯定这就是第一l
从何而来。即使它不是历史意义,这是一个合理的记忆。 (遗憾的是,词法型先行符号是yychar
而非yyltype
,所以记忆是不完美的。)YYSTYPE
的意思是“语义类型”的思想,因为野牛手册是指由“语义动作”产生的“语义值”。我觉得用形容词“语义”这里也是其它文学常见。这有可能是S
的起源来自“堆栈”(如“值堆的类型”),但因为解析器有几个栈,这不是一个非常有用的记忆。YYLTYPE yylloc;
通过与yylval
类比产生的,确实是野牛生成的解析器里面有一个局部变量叫yyloc
起着类似于yyval
的作用。因此,在L
的YYLTYPE
绝对可以被认为是意为“位置类型”,而在l
第一yylloc
类似于l
第一yylval
,表明超前记号的位置。