2011-02-02 6 views
6

리퍼는 Ruby 1.9와 함께 제공되는 파싱 라이브러리입니다. 이 AST를 가지고 루비 코드로 다시 변환 할 수있는 라이브러리가 있습니까리퍼의 AST를 어떻게 Ruby 코드로 재 컴파일하나요?

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이 작업에 사용되었지만 리퍼를 파서로 사용하고 싶습니다. (Ruby 1.9는 그러한 라이브러리와 함께 제공 될 수도 있지만 리퍼 자체에서도 문서를 찾기 위해 고심 중입니다)

+0

https://github.com/svenfuchs/ripper2ruby와 함께 놀았습니다. http://www.artweb-design.de/2009/7/5/ripper2ruby-modify-and-recompile-your-ruby-code 그러나 NoMethodError : # 에 대해 정의되지 않은 메소드 'to_ruby'로 인해 사망했습니다. 거기에서 어디로 가야할지 모르겠다. –

+0

나는 어떤 점에서 그것을 발견했다. 그러나 그것은 단지 믿을 만하게 보이지 않았다. 그것으로 당신의 경험을 제공 해주셔서 감사합니다. –

답변

4

"Sorcerer"을 참조하십시오. 이 잘 작동하지만 메서드를 구문 분석 할 때 버그를 발견했습니다. "lib/sorcerer/resource.rb"파일의 301 행 아래에 src.emit("; ")을 추가하면이 문제가 해결됩니다. 그러나 이것을 사용하기로 결정하면 더 많이 찾을 수 있습니다. 행운을 빕니다.

+0

감사합니다 -이 순간 최고의 물건처럼 보입니다! –

관련 문제