我该在哪里找到系统中的Ruby解析器parse.y文件?

3
我正在了解Ruby的解析和编译,想看一下使用的parse.y文件。但我在我的系统(OS X)上没能找到它。我已经尝试过find / -name parse.y,但没有结果。
运行ruby -y myfile.rb会显示使用的parse.y中的行号,这让我觉得它确实存在于某个地方,只是我不知道在哪里。我看过在线的parse.y,但我想看本地副本。
例如,给定:
# myfile.rb
puts 'hi'

当我运行ruby -y myfile.rb时,我看到:
Starting parse
Entering state 0
Reducing stack by rule 1 (line 859):
...

我一直认为像上面的859行是指parse.y中的行。这不是这种情况吗?


1
为什么你认为有一个本地副本?当执行Ruby文件时,Ruby不会引用自己的源代码。Ruby是一个已编译的二进制文件。 - user229044
如果是这样,那么当我运行 ruby -y myfile.rb 时,行号从哪里来?@meagar - ivan
1
行号的存在并不一定意味着 Ruby 在某种程度上正在从磁盘读取 parse.y。没有人会为此目的将源代码与二进制文件一起发布,源代码只是通过谨慎使用 __LINE__ 进行编译。 - user229044
@meagar 啊,那样就更有意义了。谢谢。如果你想把这个作为答案,我会接受的。 - ivan
2个回答

5

parse.y 属于 Ruby 源代码。当您在计算机上安装 Ruby 时,源代码会被编译为 Ruby 解释器,因此除非保留了编译产物,否则您无法访问单个 parse.y 文件。

此外,parse.y 文件与您特定的 Ruby 版本在编译时使用的文件完全相同。您可以在官方 Ruby 存储库中搜索您的版本并从那里阅读该文件。


2
您没有说明使用的是哪个Ruby实现。并非所有Ruby实现都使用Bison生成解析器。并非所有Ruby实现甚至都能执行C代码,而这正是Bison生成的内容。例如,XRuby使用ANTLR。JRuby使用手工从parse.c翻译成Java的解析器,即由Bison从parse.y生成的C代码。
对于那些确实使用Bison的Ruby实现,没有一个会提供parse.y。毕竟它是源代码,不是二进制文件的一部分。事实上,在编译过程中,parse.y首先被编译为C,然后与实现的其他部分一起编译成二进制文件,并且该二进制文件就是发布的文件。
如果您想知道用于编译您的Ruby可执行文件的确切parse.y文件,您将不得不询问编译Ruby可执行文件的人员。前提是您使用的Ruby实现实际上使用parse.y。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接