зеркало из https://github.com/github/ruby.git
ripper: Make `$:n` to refer each grammar values
Ripper DSL uses these values for callbacks, but does not need indexes.
This commit is contained in:
Родитель
5fed63f7b0
Коммит
2d92a4afba
|
@ -42,7 +42,15 @@ class DSL
|
||||||
p = p = "p"
|
p = p = "p"
|
||||||
|
|
||||||
@code = +""
|
@code = +""
|
||||||
code = code.gsub(%r[\G#{NOT_REF_PATTERN}\K(\$|\$:|@)#{TAG_PATTERN}?#{NAME_PATTERN}]o, '"\&"')
|
code = code.gsub(%r[\G#{NOT_REF_PATTERN}\K(\$|\$:|@)#{TAG_PATTERN}?#{NAME_PATTERN}]o) {
|
||||||
|
if (arg = $&) == "$:$"
|
||||||
|
'"p->s_lvalue"'
|
||||||
|
elsif arg.start_with?("$:")
|
||||||
|
%["get_value(#{arg})"]
|
||||||
|
else
|
||||||
|
arg.dump
|
||||||
|
end
|
||||||
|
}
|
||||||
@last_value = eval(code)
|
@last_value = eval(code)
|
||||||
rescue SyntaxError
|
rescue SyntaxError
|
||||||
$stderr.puts "error on line #{@lineno}" if @lineno
|
$stderr.puts "error on line #{@lineno}" if @lineno
|
||||||
|
@ -77,11 +85,7 @@ class DSL
|
||||||
vars = []
|
vars = []
|
||||||
args.each do |arg|
|
args.each do |arg|
|
||||||
vars << v = new_var
|
vars << v = new_var
|
||||||
if arg =~ /\A\$:#{NAME_PATTERN}\z/
|
@code << "#{ v }=#{ arg };"
|
||||||
@code << "#{ v }=get_value(#{arg});"
|
|
||||||
else
|
|
||||||
@code << "#{ v }=#{ arg };"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
v = new_var
|
v = new_var
|
||||||
d = "dispatch#{ args.size }(#{ [event, *vars].join(",") })"
|
d = "dispatch#{ args.size }(#{ [event, *vars].join(",") })"
|
||||||
|
|
423
parse.y
423
parse.y
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Загрузка…
Ссылка в новой задаче