即使和*是程序可以重新定义的方法,Ruby也有特殊的魔力来评估1 2 * 3为1.(2. *(3))而不是1.(2).*(3).
我想知道这个特殊魔法在Ruby中的位置 – 如果它与解释器连接起来很困难.
阿里.
解决方法
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的语法足以查找模块,类和方法,注释和提取方法参数列表.它们不处理运算符优先级.