2011-01-26 40 views
2
require 'ruby2ruby' 
require 'parsetree' 

code = "puts(var)" 
sexp = SexpProcessor.new.process(ParseTree.translate(code)) 
# => s(:fcall, :puts, s(:array, s(:vcall, :var))) 
code = Ruby2Ruby.new.process(sexp) 
# => UnknownNodeError: Bug! Unknown node-type :fcall to Ruby2Ruby 

有沒有辦法將Sexps從ParseTree轉換回ruby代碼?Ruby2Ruby與ParseTree兼容嗎?

我開始寫一些代碼來做這個翻譯,但是我想知道它是否已經存在。另一個問題是Ruby2Ruby在算術運算中放置了很多不需要的括號(如4+3-2+-2**4(((4 + 3) - 2) + -(2 ** 4)),兩者都是等價的)。有什麼方法可以刪除它們嗎?

+0

確定代碼的明確表示所需的最小的一組parens是很難的。 – delnan 2011-01-26 19:40:35

+0

也許你根本不需要使用Sexps。你只是試圖獲得運行代碼的來源? – 2011-01-26 23:25:07

回答

2

我不知道這是否適用於你,因爲你似乎想解析Ruby代碼串出來的,但如果你真正想要的運行代碼的源代碼,你可以這樣做:

$ irb 
?> require 'rubygems' 
=> true 
?> require 'parse_tree' 
=> true 
?> require 'parse_tree_extensions' 
=> true 
?> require 'ruby2ruby' 
=> true 
?> def calc; 4+3-2+-2**4; end 
=> nil 
?> puts method(:calc).to_ruby 
def calc 
    (((4 + 3) - 2) + -(2 ** 4)) 
end 

雖然這增加了你不想要的間距。

1

我認爲它們應該是兼容的,因爲它們被寫入by the same person,但有時候會出現錯誤(如this question所示,其中兩個gem在同一作者之間不兼容)。