Obawiam się, że wyrażenia regularne nie zajdą Ci daleko. Rozważmy na przykład następujące wyrażenia (które są również ważne Ruby)
"(foo.bar.size.split('.')).last"
"(foo.bar.size.split '.').last"
"(foo.bar.size.split '(.) . .(). .').last"
Problemem jest to, że lista połączeń jest rzeczywiście drzewo połączeń. Najprostszym rozwiązaniem w zasięgu wzroku jest prawdopodobnie użyć parsera Ruby i przekształcenia drzewo składniowy w zależności od potrzeb (w tym przykładzie są rekurencyjnie zstępującej do drzewa połączeń, gromadzenie połączenia do listy):
# gem install ruby_parser
# gem install awesome_print
require 'ruby_parser'
require 'ap'
def calls_as_list code
tree = RubyParser.new.parse(code)
t = tree
calls = []
while t
# gather arguments if present
args = nil
if t[3][0] == :arglist
args = t[3][1..-1].to_a
end
# append all information to our list
calls << [t[2].to_s, args]
# descend to next call
t = t[1]
end
calls.reverse
end
p calls_as_list "foo.bar.size.split('.').last"
#=> [["foo", []], ["bar", []], ["size", []], ["split", [[:str, "."]]], ["last", []]]
p calls_as_list "puts 3, 4"
#=> [["puts", [[:lit, 3], [:lit, 4]]]]
I pokazać drzewo parsującej jakiegokolwiek wejścia:
ap RubyParser.new.parse("puts 3, 4")
To nie jest tak proste, jak myślisz. – sawa
@sawa: zamknąłeś pytanie, ponieważ uważasz, że to zbyt trudne? – iconoclast
@iconoclast Nie pamiętam, ale nie z powodu twojego powodu. – sawa