class Ripper::Filter
此类仅处理扫描器事件,这些事件以“正确”的顺序(与输入相同)分派。
公共类方法
源码
# File ext/ripper/lib/ripper/filter.rb, line 24 def initialize(src, filename = '-', lineno = 1) @__lexer = Lexer.new(src, filename, lineno) @__line = nil @__col = nil @__state = nil end
创建一个新的 Ripper::Filter
实例,将参数 src
、filename
和 lineno
传递给 Ripper::Lexer.new
词法分析器仅供内部使用。
公共实例方法
源码
# File ext/ripper/lib/ripper/filter.rb, line 46 def column @__col end
当前 token 的列号。此值从 0 开始。此方法仅在事件处理程序中有效。
源码
# File ext/ripper/lib/ripper/filter.rb, line 32 def filename @__lexer.filename end
输入的文件的名称。
源码
# File ext/ripper/lib/ripper/filter.rb, line 39 def lineno @__line end
当前 token 的行号。此值从 1 开始。此方法仅在事件处理程序中有效。
源码
# File ext/ripper/lib/ripper/filter.rb, line 59 def parse(init = nil) data = init @__lexer.lex.each do |pos, event, tok, state| @__line, @__col = *pos @__state = state data = if respond_to?(event, true) then __send__(event, tok, data) else on_default(event, tok, data) end end data end
启动解析器。init
是一个数据累加器,并传递给下一个事件处理程序(类似于 Enumerable#inject
)。
源码
# File ext/ripper/lib/ripper/filter.rb, line 52 def state @__state end
当前 token 的扫描器状态。此值是零个或多个 Ripper::EXPR_*
常量的按位或运算的结果。
私有实例方法
源码
# File ext/ripper/lib/ripper/filter.rb, line 80 def on_default(event, token, data) data end
当某些事件处理程序未定义时,会调用此方法。event
为 :on_XXX,token
为扫描的 token,data
为数据累加器。
此方法的返回值将传递给下一个事件处理程序(类似于 Enumerable#inject
)。