前缀yy
在lexer中的意义是什么?
我看到方法/字段,如yyline
、yycolumn
、yytext
、e.t.c
前缀yy
在词汇器的世界中是否有一些历史意义?
PS:我对编译器完全陌生
yy
前缀命名约定实际上来自解析器生成器Yacc。Lex最初是为使用Yacc构建的解析器进行词法分析而编写的,因此它为生成的扫描程序选择了名称yylex
,因为这正是Yacc期望调用的扫描程序。
为了简化代码生成,Yacc和Lex都使用全局变量来传递大多数信息,包括词元的语义值及其物理位置。同样,动力来自Yacc,它希望在全局变量yylval
中找到每个标记的语义值(你可以认为这意味着yy
-词位值(。
从那时起,只需要scanner和解析器生成器的用户就可以方便地避免所有名称以yy
开头的带有外部链接的符号,而将它们留给生成的代码。这并不是一个很大的限制,因为程序员使用名称以yy
开头的变量是非常罕见的。即使是现在,这似乎也不太可能——我不记得在SO上看到过一个问题,该问题与Lex/Yacc生成的代码中以yy
开头的变量与内部变量冲突。
除了作为一个不寻常的名称前缀之外,yy
旨在与";y";在";Yacc";。碰巧的是,Yacc被命名为";另一编译器编译器";,这是一篇自嘲和讽刺的评论,基于20世纪70年代初构建自动化解析器生成器的尝试次数。由于各种原因,Yacc在这个拥挤的领域成为了赢家,因此,无论好坏,它的界面决策都成为了未来产品的一种非正式标准。