S/L/l 在 YYSTYPE/YYLTYPE/yylval/yylloc 中代表什么?
What S/L/l stands for in YYSTYPE/YYLTYPE/yylval/yylloc?
在flex/bison中有两种数据类型和对应的静态变量:
- YYSTYPE/yylval
- YYLTYPE/yylloc
我想知道 S/L/l
代表什么?
我的猜测是:
S
代表symbol
(即符号的语义数据类型)
L
代表location
,而
l
代表'lexer'(意思是要与词法分析器共享的变量)。
形式为 "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 中。本来是和另一个外部可见变量配对的,yyval
:yylval
是词法扫描器的语义值"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
,表明lloc化l先行令牌。
在flex/bison中有两种数据类型和对应的静态变量:
- YYSTYPE/yylval
- YYLTYPE/yylloc
我想知道 S/L/l
代表什么?
我的猜测是:
S
代表symbol
(即符号的语义数据类型)L
代表location
,而l
代表'lexer'(意思是要与词法分析器共享的变量)。
形式为 "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 中。本来是和另一个外部可见变量配对的,yyval
:yylval
是词法扫描器的语义值"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
,表明lloc化l先行令牌。