summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2024-05-10 20:02:16 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2024-05-21 13:52:29 +0900
commit2d92a4afba36034f3d92ab75dfae4dbf5a445c7e (patch)
tree7c416f5683f765bc6acc302411fed5329f5ae3dd /ext
parent5fed63f7b09d7697a34fcc38efc2985d6e805c40 (diff)
ripper: Make `$:n` to refer each grammar values
Ripper DSL uses these values for callbacks, but does not need indexes.
Diffstat (limited to 'ext')
-rw-r--r--ext/ripper/tools/dsl.rb16
1 files changed, 10 insertions, 6 deletions
diff --git a/ext/ripper/tools/dsl.rb b/ext/ripper/tools/dsl.rb
index d0002d1ec3..d090b15c0b 100644
--- a/ext/ripper/tools/dsl.rb
+++ b/ext/ripper/tools/dsl.rb
@@ -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(",") })"