📌

[Bug #21849] Ripper.lex に "x#$%" を渡した時のバグ報告

に公開

[Bug #21849] Ripper.lex emits two tstring_content for single string in edge-case

  • 文字列リテラル内で #$a のような記述をすると『グローバル変数 $a の値』が文字列の中に展開される
$a = 42

# "x#{$a}" と同じ結果になる
p "x#$a"
# => "x42"
  • また『不正な名前のグローバル変数名』の場合はそのままの文字として定義される
# $% は不正なグローバル変数名なので特に何もしない
p "x#$%"
# => "x\#$%"
  • このような『 # + 不正なグローバル変数名』の文字列を Ripper.lex に渡すと意図せず tstring_content が別れてしまうというバグ報告
require "ripper"

pp Ripper.lex('"x#$%"')
# => [[[1, 0], :on_tstring_beg, "\"", BEG],
#     [[1, 1], :on_tstring_content, "x", BEG],
#     [[1, 2], :on_tstring_content, "\#$%", BEG],
#     [[1, 5], :on_tstring_end, "\"", END]]
  • 本来であれば次のように1つの tstring_content として扱われるべき、みたいですね
[[[1, 0], :on_tstring_beg, "\"", BEG],
 [[1, 1], :on_tstring_content, "x\#@%", BEG],
 [[1, 5], :on_tstring_end, "\"", END]]
GitHubで編集を提案

Discussion