2011-02-02 11 views
6

रिपर एक पार्सिंग लाइब्रेरी है जो रुबी 1.9 के साथ जहाजों है। यह एक एएसटी में रूबी कोड बदल देती है, इसलिए जैसे:मैं रिपर के एएसटी को रूबी कोड पर वापस कैसे पुन: संकलित करूं?

pp Ripper.sexp("def foo; yield :a; return 1 end") 

#=> 

[:program, 
[[:def, 
    [:@ident, "foo", [1, 4]], 
    [:params, nil, nil, nil, nil, nil], 
    [:bodystmt, 
    [[:yield, 
     [:args_add_block, 
     [[:symbol_literal, [:symbol, [:@ident, "a", [1, 16]]]]], 
     false]], 
    [:return, [:args_add_block, [[:@int, "1", [1, 26]]], false]]], 
    nil, 
    nil, 
    nil]]]] 

इस एएसटी लेने के लिए और इसे वापस बदलने रूबी कोड में करने के लिए एक पुस्तकालय है?

ruby_parser and ruby2ruby ऐसा करने के लिए उपयोग किया जाता था, लेकिन मैं रिपर का उपयोग अपने पार्सर के रूप में करना चाहता हूं। (रूबी 1.9 भी ऐसी लाइब्रेरी के साथ जहाज भेज सकता है, लेकिन मैं खुद ही रिपर पर दस्तावेज ढूंढने के लिए संघर्ष कर रहा हूं)

+0

मैंने https://github.com/svenfuchs/ripper2ruby के साथ खेला http://www.artweb-design.de/2009/7/5/ripper2ruby-modify-and-recompile-your-ruby-code , लेकिन यह NoMethodError के साथ मृत्यु हो गई: # <रूबी :: नोड :: समग्र :: ऐरे: 0x9aa7540> के लिए अपरिभाषित विधि 'to_ruby '। यकीन नहीं है कि वहां से कहाँ जाना है। –

+0

मैंने पाया कि कुछ बिंदु पर, लेकिन यह विश्वसनीय नहीं लग रहा था। इसके साथ अपने अनुभव की पेशकश के लिए धन्यवाद। –

उत्तर

4

"Sorcerer" देखें। यह अच्छी तरह से काम करता है लेकिन पार्सिंग विधियों के दौरान मुझे एक बग मिला। यदि आप "lib/sorcerer/resource.rb" फ़ाइल के पंक्ति 301 के नीचे src.emit("; ") जोड़ते हैं, तो यह तय किया जाएगा। लेकिन अगर आप इसका इस्तेमाल करने का फैसला करते हैं तो आप और अधिक पा सकते हैं। सौभाग्य।

+0

धन्यवाद - यह इस समय सबसे अच्छी चीज की तरह दिखता है! –

संबंधित मुद्दे