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:
Nobuyoshi Nakada 2024-05-10 20:02:16 +09:00
Родитель 5fed63f7b0
Коммит 2d92a4afba
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 3582D74E1FEE4465
2 изменённых файлов: 186 добавлений и 253 удалений

Просмотреть файл

@ -42,7 +42,15 @@ class DSL
p = p = "p"
@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)
rescue SyntaxError
$stderr.puts "error on line #{@lineno}" if @lineno
@ -77,11 +85,7 @@ class DSL
vars = []
args.each do |arg|
vars << v = new_var
if arg =~ /\A\$:#{NAME_PATTERN}\z/
@code << "#{ v }=get_value(#{arg});"
else
@code << "#{ v }=#{ arg };"
end
@code << "#{ v }=#{ arg };"
end
v = new_var
d = "dispatch#{ args.size }(#{ [event, *vars].join(",") })"

423
parse.y

Разница между файлами не показана из-за своего большого размера Загрузить разницу