yy在扫描仪/词法分析器如jflex中的意义

问题描述

在词法分析器中,前缀<http://w3.org/ns/temp#pdp> <http://w3.org/ns/temp#hasLegalBasis> <http://w3.org/ns/temp#c> ; <http://w3.org/ns/temp#isLawful> true . 的含义是什么?

我看到诸如yyyylineyycolumn等e / t.c的方法/字段

在词法分析器领域中,前缀yytext有历史意义吗?

PS:我是编译器的新手

解决方法

yy前缀命名约定实际上来自解析器生成器Yacc。最初是为对使用Yacc构建的解析器进行词法分析而编写的Lex,因此为生成的扫描程序选择了名称yylex,因为这正是Yacc希望调用该扫描程序的原因。

为简化代码生成,Yacc和Lex都使用全局变量来传达大多数信息,包括词素的语义值及其物理位置。同样,推动力来自Yacc,它希望在全局变量yylval中找到每个标记的语义值(您可以将其视为yy-lexeme-value)。

从那里开始,仅要求扫描仪和解析器生成器的用户避免使用名称以yy开头的具有外部链接的所有符号,将它们保留下来即可。并没有太大的限制,因为对于程序员来说,使用以yy开头的变量并不常见。即使到了现在,这似乎也不大可能-我不记得曾经有一个关于SO的问题,该问题与以yy开头的名称与Lex / Yacc生成的代码中的内部变量冲突。

yy除了是不寻常的名称前缀外,还旨在与“ Yacc”中的“ y”相关。碰巧的是,Yacc的名字是“ Yet Another Compiler Compiler”的缩写,这是一个自嘲和讽刺的评论,它是基于1970年代初期尝试构建自动解析器生成器的次数而得出的。由于种种原因,Yacc在这个拥挤的领域中脱颖而出,因此,无论是好是坏,其接口决策都成为未来产品的非正式标准。