2011-01-26 2 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 в рубиновый код?Совместим ли Ruby2Ruby с ParseTree?

Я начал писать код, который бы сделал этот перевод, но я хочу знать, существует ли это уже. Еще одна проблема заключается в том, что Ruby2Ruby ставит много ненужных круглых скобок в арифметических операциях (например, 4+3-2+-2**4 - (((4 + 3) - 2) + -(2 ** 4)), оба работают одинаково). Есть ли способ удалить их?

+0

Разработка минимального набора символов, необходимых для однозначного представления кода, сложна. – delnan

+0

Возможно, вам больше не нужно использовать Sexps. Вы просто пытаетесь добраться до исходного кода? –

ответ

2

Я не уверен, если это работает для вас, потому что вы, кажется, хотят, чтобы разобрать код рубиновый из строк, но если вы на самом деле хотите источник работает код, вы можете сделать:

$ 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'; sexp = Unifier.new.process (sexp) 'после вызова Ruby2Ruby. Спасибо вам за подсказку. –

1

Я думаю, что они должны быть совместимы, поскольку они написаны by the same person, но иногда ошибки ползут (как видно из this question, в котором указаны несовместимости между двумя драгоценными камнями того же автора).

Смежные вопросы