diff options
| author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2024-05-10 20:02:16 +0900 |
|---|---|---|
| committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2024-05-21 13:52:29 +0900 |
| commit | 2d92a4afba36034f3d92ab75dfae4dbf5a445c7e (patch) | |
| tree | 7c416f5683f765bc6acc302411fed5329f5ae3dd /ext | |
| parent | 5fed63f7b09d7697a34fcc38efc2985d6e805c40 (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.rb | 16 |
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(",") })" |
