[英]Operators and methods in Ruby
大多數看起來像運算符的東西都是Ruby中的方法; 1 + 2
是1.+(2)
語法糖。
盡管+
和*
是程序可以重新定義的方法,但Ruby具有特殊的魔力來將1 + 2 * 3
評估為1.+(2.*(3))
而不是1.+(2).*(3)
。
我想知道這個特殊魔法在Ruby中的位置 - 如果它與解釋器連接起來很困難。
阿里。
在所有Ruby實現中,運算符優先級由解析器處理。 由於幾乎所有現有的Ruby實現使用相同的解析器,或者使用相同的YACC語法生成的解析器, parse.y
YARV中的parse.y
是您要查看的文件 。 (例如,在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的語法足以找到模塊,類和方法,注釋和提取方法參數列表。 它們不處理運算符優先級。
語言文檔中的“ 運算符表達式 ”提供了一個表,其中包含可以作為方法重寫的運算符。 您無法構建自己的運算符 - 運算符到其符號名稱的映射存在於解析器中。
是的,它是硬連線的,因此您無法添加新運算符或更改現有運算符的優先級。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.