gpt4 book ai didi

ruby - Ruby 中的运算符和方法

转载 作者:数据小太阳 更新时间:2023-10-29 06:58:05 27 4
gpt4 key购买 nike

大多数看起来像运算符的东西都是 Ruby 中的方法; 1 + 21.+(2) 的语法糖。

尽管 +* 是程序可以重新定义的方法,但 Ruby 有特殊的魔力来计算 1 + 2 * 31.+(2.*(3)) 而不是 1.+(2).*(3)

我想知道这种特殊的魔法在 Ruby 中存在于何处——它是否硬连接到解释器中。

阿里。

最佳答案

在所有 Ruby 实现中,运算符优先级由解析器处理。由于几乎所有现有的 Ruby 实现都使用相同的解析器,或者从相同的 YACC 语法生成的解析器,parse.y in YARV is the file you want to look at . (例如,在 JRuby 中,该文件本质上是相同的:src/org/jruby/parser/Ruby19Parser.y。对于 IronRuby 也是如此:Merlin/Main/Languages/Ruby/Ruby/Compiler/Parser/Parser.y。)

仅有的四个 Ruby 实现要么直接使用 YARV 解析器,要么使用 YARV 的 parse.y 的 YACC 克隆生成的解析器,它们是 Cardinal、tinyrb、RubyGoLightly和 XRuby。

Cardinal 是 Parrot 虚拟机的 Ruby 实现,由于 Parrot 包含 Parrot 语法引擎,Cardinal 自然会使用它。有趣的文件是 src/parser/grammar.pg . PGE 是一种混合递归下降解析器/运算符优先级解析器,这意味着运算符优先级在语法文件中表现得非常好。

Tinyrb 使用 PEG 解析器,该解析器利用了 Ian Piumarta 的腿库。作为典型的 PEG 解析器,没有运算符优先级表,优先级隐含在语法的层次结构中。参见 vm/grammar.leg了解详情。 RubyGoLightly是从tinyrb派生出来的,只不过它使用Go而不是C作为实现语言,但是使用了相同的PEG语法。

XRuby 使用 ANTLR 作为其解析器。在这里,有趣的文件是 src/com/xruby/compiler/parser/ruby.g .

Rubinius 使用Melbourne 解析器,本质上是YARV 的解析器封装为C 扩展。 MagLev 使用 ruby_parser(见下文)。

除了 Ruby 实现之外,还有其他可用的 Ruby 解析器。

Ryan Davis 的 ruby​​_parser 源自 YARV YACC 语法。它使用 racc 作为解析器生成器。参见 lib/ruby_parser.y .

Caleb Clausen 的 RedParse 使用 Caleb 自己的手写编译器-解释器。有趣的文件是 lib/redparse/babyparser.rb .

这就是我所知道的所有实际处理运算符优先级的解析器。 RDoc 中内置了另一个解析器,YARD 中也曾经有一个(现在使用 RedParse),但这些解析器仅处理足够的 Ruby 语法来查找模块、类和方法、注释和提取方法参数列表。它们不处理运算符优先级。

关于ruby - Ruby 中的运算符和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2258673/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com