类 DSL

用于 Ripper 代码生成的简单 DSL 实现

输入: /*% ripper: stmts_add(stmts_new, void_stmt) %*/ 输出

VALUE v1, v2;
v1 = dispatch0(stmts_new);
v2 = dispatch0(void_stmt);
$$ = dispatch2(stmts_add, v1, v2);
  • 代码必须是一行。

  • 代码本质上是 Ruby 代码,即使它看起来像 C 语言,并且结果将被视为 C 语言处理。例如,注释需要使用 Ruby 风格。

常量

NAME_PATTERN
NOT_REF_PATTERN
TAG_PATTERN

属性

events[R]

公共类方法

new(code, options) 点击切换源代码
# File ripper/tools/dsl.rb, line 21
def initialize(code, options)
  @events = {}
  @error = options.include?("error")
  @brace = options.include?("brace")
  if options.include?("final")
    @final = "p->result"
  else
    @final = (options.grep(/\A\$#{NAME_PATTERN}\z/o)[0] || "$$")
  end
  @vars = 0

  # struct parser_params *p
  p = p = "p"

  @code = ""
  code = code.gsub(%r[\G#{NOT_REF_PATTERN}\K[$@]#{TAG_PATTERN}?#{NAME_PATTERN}]o, '"\&"')
  @last_value = eval(code)
end