Ruby on rails 解析ruby代码

Ruby on rails 解析ruby代码,ruby-on-rails,parsing,ruby-ripper,Ruby On Rails,Parsing,Ruby Ripper,我在一个问题上需要帮助。我有一个包含一些ruby代码的列的表,比如:self.org\u premium=self.volume/12*0.1492 self.billing\u premium=self.subscriber\u premium+self.org\u premium或employment\u level='P'或vol\u life.save。 现在我想在这些字符串中查找方法,但是一些Rails方法,比如save或nil?必须被忽略。 我使用了Ripper,但他的方法slice

我在一个问题上需要帮助。我有一个包含一些ruby代码的列的表,比如:
self.org\u premium=self.volume/12*0.1492 self.billing\u premium=self.subscriber\u premium+self.org\u premium
employment\u level='P'
vol\u life.save
。 现在我想在这些字符串中查找方法,但是一些Rails方法,比如
save
nil?
必须被忽略。 我使用了Ripper,但他的方法
slice
只返回1个参数。 也许您对此有所了解?

当您使用切片时,例如:

$ irb
2.0.0p247 :001 > p Ripper.slice('def m(a) nil end', 'ident')
要查看哪些事件可用,只需计算文档中引用的常量:事件,这些事件进一步细分为解析器事件和扫描程序事件

$ irb
2.0.0p247 :001 > require 'ripper'
2.0.0p247 :002 > Ripper::EVENTS
 => [:BEGIN, :END, :alias, :alias_error, :aref, :aref_field, :arg_ambiguous, :arg_paren, :args_add, :args_add_block, :args_add_star, :args_new, :array, :assign, :assign_error, :assoc_new, :assoc_splat, :assoclist_from_args, :bare_assoc_hash, :begin, :binary, :block_var, :block_var_add_block, :block_var_add_star, :blockarg, :bodystmt, :brace_block, :break, :call, :case, :class, :class_name_error, :command, :command_call, :const_path_field, :const_path_ref, :const_ref, :def, :defined, :defs, :do_block, :dot2, :dot3, :dyna_symbol, :else, :elsif, :ensure, :excessed_comma, :fcall, :field, :for, :hash, :if, :if_mod, :ifop, :lambda, :magic_comment, :massign, :method_add_arg, :method_add_block, :mlhs_add, :mlhs_add_star, :mlhs_new, :mlhs_paren, :module, :mrhs_add, :mrhs_add_star, :mrhs_new, :mrhs_new_from_args, :next, :opassign, :operator_ambiguous, :param_error, :params, :paren, :parse_error, :program, :qsymbols_add, :qsymbols_new, :qwords_add, :qwords_new, :redo, :regexp_add, :regexp_literal, :regexp_new, :rescue, :rescue_mod, :rest_param, :retry, :return, :return0, :sclass, :stmts_add, :stmts_new, :string_add, :string_concat, :string_content, :string_dvar, :string_embexpr, :string_literal, :super, :symbol, :symbol_literal, :symbols_add, :symbols_new, :top_const_field, :top_const_ref, :unary, :undef, :unless, :unless_mod, :until, :until_mod, :var_alias, :var_field, :var_ref, :vcall, :void_stmt, :when, :while, :while_mod, :word_add, :word_new, :words_add, :words_new, :xstring_add, :xstring_literal, :xstring_new, :yield, :yield0, :zsuper, :CHAR, :__end__, :backref, :backtick, :comma, :comment, :const, :cvar, :embdoc, :embdoc_beg, :embdoc_end, :embexpr_beg, :embexpr_end, :embvar, :float, :gvar, :heredoc_beg, :heredoc_end, :ident, :ignored_nl, :int, :ivar, :kw, :label, :lbrace, :lbracket, :lparen, :nl, :op, :period, :qsymbols_beg, :qwords_beg, :rbrace, :rbracket, :regexp_beg, :regexp_end, :rparen, :semicolon, :sp, :symbeg, :symbols_beg, :tlambda, :tlambeg, :tstring_beg, :tstring_content, :tstring_end, :words_beg, :words_sep]
2.0.0p247 :009 > Ripper::PARSER_EVENTS
 => [:BEGIN, :END, :alias, :alias_error, :aref, :aref_field, :arg_ambiguous, :arg_paren, :args_add, :args_add_block, :args_add_star, :args_new, :array, :assign, :assign_error, :assoc_new, :assoc_splat, :assoclist_from_args, :bare_assoc_hash, :begin, :binary, :block_var, :block_var_add_block, :block_var_add_star, :blockarg, :bodystmt, :brace_block, :break, :call, :case, :class, :class_name_error, :command, :command_call, :const_path_field, :const_path_ref, :const_ref, :def, :defined, :defs, :do_block, :dot2, :dot3, :dyna_symbol, :else, :elsif, :ensure, :excessed_comma, :fcall, :field, :for, :hash, :if, :if_mod, :ifop, :lambda, :magic_comment, :massign, :method_add_arg, :method_add_block, :mlhs_add, :mlhs_add_star, :mlhs_new, :mlhs_paren, :module, :mrhs_add, :mrhs_add_star, :mrhs_new, :mrhs_new_from_args, :next, :opassign, :operator_ambiguous, :param_error, :params, :paren, :parse_error, :program, :qsymbols_add, :qsymbols_new, :qwords_add, :qwords_new, :redo, :regexp_add, :regexp_literal, :regexp_new, :rescue, :rescue_mod, :rest_param, :retry, :return, :return0, :sclass, :stmts_add, :stmts_new, :string_add, :string_concat, :string_content, :string_dvar, :string_embexpr, :string_literal, :super, :symbol, :symbol_literal, :symbols_add, :symbols_new, :top_const_field, :top_const_ref, :unary, :undef, :unless, :unless_mod, :until, :until_mod, :var_alias, :var_field, :var_ref, :vcall, :void_stmt, :when, :while, :while_mod, :word_add, :word_new, :words_add, :words_new, :xstring_add, :xstring_literal, :xstring_new, :yield, :yield0, :zsuper] 
2.0.0p247 :010 > Ripper::SCANNER_EVENTS
 => [:CHAR, :__end__, :backref, :backtick, :comma, :comment, :const, :cvar, :embdoc, :embdoc_beg, :embdoc_end, :embexpr_beg, :embexpr_end, :embvar, :float, :gvar, :heredoc_beg, :heredoc_end, :ident, :ignored_nl, :int, :ivar, :kw, :label, :lbrace, :lbracket, :lparen, :nl, :op, :period, :qsymbols_beg, :qwords_beg, :rbrace, :rbracket, :regexp_beg, :regexp_end, :rparen, :semicolon, :sp, :symbeg, :symbols_beg, :tlambda, :tlambeg, :tstring_beg, :tstring_content, :tstring_end, :words_beg, :words_sep] 
在本例中,“ident”是方法名定义的事件,该事件实际上并不等同于代码中调用的方法

我不确定Ripper是否是解析所用方法名的最简单方法。此外,Ruby处理
method\u missing
处理的调用的能力确实让我们很难看到可以解释什么

正如我在评论中所说的,还有其他几种方法可以解析您可能会研究的方法

您甚至可以通过字符串操作/检查可用方法来实现类似的功能,例如

class A
  IGNORE = %w{save nil?}

  def find_possible_methods(s)
    s.split(/[\-\ ,\.\(\)\{\}\[\]]/).reject{|c| c =~ /[0-9\*\-\/\+\%\=\~].*/ || c.empty? || IGNORE.include?(c)}
  end

  def find_implemented_methods(s)
    (s.split(/[\-\ ,\.\(\)\{\}\[\]]/) & (methods + private_methods).collect(&:to_s)).reject{|c| IGNORE.include?(c)}
  end
end
用法:

a = A.new
 => #<A:0x007facb9a94be8> 
a.find_possible_methods 'self.org_premium = self.volume / 12 * 0.1492 self.billing_premium = self.subscriber_premium + self.org_premium'
 => ["self", "org_premium", "self", "volume", "self", "billing_premium", "self", "subscriber_premium", "self", "org_premium"]
a=a.new
=> # 
a、 查找可能的方法“self.org\u premium=self.volume/12*0.1492 self.billing\u premium=self.subscriber\u premium+self.org\u premium”
=>[“自我”、“组织溢价”、“自我”、“数量”、“自我”、“计费溢价”、“自我”、“订户溢价”、“自我”、“组织溢价”]

谢谢,但此解决方案对我没有帮助。我需要这样的解决方案:。原始方法从开始搜索到一个匹配项,但我希望找到所有匹配项。作者希望只提取注释,而这个gem不适用于方法。也许你知道如何做到这一点?请在问题中明确说明你在寻找什么。可以查看以下内容,但并非所有内容都是最新的:,,还有一些方法可以确定在运行时执行的方法,如:和。如果您想查看执行的代码行。但是,我不认为你在寻找那个?补充了一点关于裂土器的更多信息。基本上,
slice
方法就像一个快捷方式,可以解析和收集解析过程中发生的事件,并使用Ripper的常量获取这些可用事件的列表;2) 并创建一个方法,该方法将使用具有指定模式的切片,并使用ruby代码将其从字符串中删除。但是我找不到关于为这种方法创建模式的文档。t寻求帮助。有些相关的问题: