2010-02-13 56 views
7

大多數看起來像運算符的東西都是Ruby中的方法; 1 + 21.+(2)的語法糖。Ruby中的運算符和方法

即使+*是一個程序可以重新定義方法,Ruby有特殊的魔力,以評估1 + 2 * 3作爲1.+(2.*(3))而不是1.+(2).*(3)

我想知道這個特殊的魔法在Ruby中的生活位置 - 如果它被硬連接到解釋器。

Ari。

回答

10

在所有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解析器或使用YACC克隆生成的解析器來自YARV的parse.y,有Cardinal,tinyrb,RubyGoLightly和XRuby。

Cardinal是Parrot虛擬機的Ruby實現,由於Parrot包含Parrot語法引擎,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實現之外,還有其他Ruby解析器可用。

Ryan Davis的ruby_parser來自YARV YACC語法。它使用racc作爲解析器生成器。見lib/ruby_parser.y

Caleb Clausen的RedParse使用Caleb自己的手寫編譯器解釋器。有趣的文件是lib/redparse/babyparser.rb

這就是我所知道的所有解析器,它實際上處理操作符優先級。還有另一個內置於RDoc的解析器,並且曾經在YARD(它現在使用RedParse)中有一個解析器,但這些解析器只處理了Ruby的語法以查找模塊,類和方法,註釋和提取方法參數列表。它們不處理運營商的優先級。

+0

謝謝。你的回答非常詳細,並且有很好的指向包括行號的文件的指針。它大大超出了我的預期。 我查找了一些其他的答案,並學習了很多關於Ruby實現的知識。感謝您分享你的知識。 – iter 2010-02-14 00:16:59

+0

不客氣! – 2010-02-14 00:38:02

0

是的,它是硬連線的,所以你不能添加新的操作符或改變現有操作符的優先級。

2

Operator Expressions」在語言文檔中提供了一個可以作爲方法重寫的運算符表。你不能組成你自己的操作符 - 操作符到它們的符號名稱的映射生活在解析器中。

+0

感謝您的鏈接 - 我熟悉它,應該將它包括在問題中。我正在尋找比「大概生活在解析器中」更具體的答案。也許我可以這麼說:如果我想分支自己的Ruby版本,其中'*'的優先級低於'+',那麼我將更改哪個文件。 Ari。 – iter 2010-02-13 19:21:15