📌
[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]]
Discussion