Ruby中的运算符和方法

前端之家收集整理的这篇文章主要介绍了Ruby中的运算符和方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
大多数看起来像运算符的东西都是 Ruby中的方法; 1 2是1的语法糖(2).

即使和*是程序可以重新定义的方法,Ruby也有特殊的魔力来评估1 2 * 3为1.(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.)

没有直接使用YARV解析器或使用YARV的parse.y中的YACC克隆生成解析器的唯一四个Ruby实现是Cardinal,tinyrb,RubyGoLightly和XRuby.

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

Tinyrb使用了一个使用Ian Piumarta腿部库的PEG解析器.正如PEG解析器的典型情况一样,没有运算符优先级表,而优先级隐含在语法的层次结构中.有关详细信息,请参阅vm/grammar.leg. RubyGoLightly源自tinyrb,除了它使用Go而不是C作为实现语言,但它使用相同的PEG语法.

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

Rubinius使用墨尔本解析器,它本质上是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相关文章