簡體   English   中英

Ruby中的運算符和方法

[英]Operators and methods in Ruby

大多數看起來像運算符的東西都是Ruby中的方法; 1 + 21.+(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM