2011-01-26 16 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と互換性がありますか?

私はこの翻訳を行うコードを書いていましたが、それがすでに存在するかどうかを知りたいと思います。もう1つの問題は、Ruby2Rubyが算術演算に不要な括弧をたくさん置くことです(4+3-2+-2**4(((4 + 3) - 2) + -(2 ** 4))など)。それらを削除する方法はありますか?

+0

コードの明確な表現に必要な最小限の括弧を設定するのは難しいです。 – delnan

+0

多分あなたはSexpsをまったく使用する必要はありません。実行しているコードのソースを取得しようとしていますか? –

答えて

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 

それはあなたが望まない間隔を追加しますが。

+0

"parse_tree_extensions.rb"というファイルを調べる "Unifier"というクラスが見つかりました。これは、sexpをRuby2Rubyに読み込み可能に変換します。私のコードは 'require 'unified_ruby'を追加すると動作します。 Ruby2Rubyを呼び出した後、sexp = Unifier.new.process(sexp) 'を実行します。ヒントありがとうございます。 –

1

は、私は、彼らがby the same personを書かれているように、互換性であるべきだと思うが、時々バグが(同じ著者による2つの宝石の間の非互換性を特色にthis questionに見られるように)でクリープ。

関連する問題