> rule string > '"' char* '"' { def obj > eval( > # This should be handled in the "char" rule. > text_value.gsub(/\\u..../) { |unicode| > eval("0x"+unicode[2..-1]).chr > } > ) > end > } > end I was slightly surprised to find this in a full-blown parser. I think this shortcut is a really bad choice here since it makes the parse execute code on input like ["#{`ls -r /`}"]. This should definitely be handled in the char rule. Justin Ethier's solution suffers from the same problem but he included a comment on this problem in his code. Here are some random test cases to check this: assert_raise(RuntimeError) { @parser.parse(%{p "Busted"}) } assert_raise(RuntimeError) { @parser.parse(%{[], p "Busted"}) } assert_raise(RuntimeError) { @parser.parse(%{[p "Busted"]}) } assert_raise(RuntimeError) { @parser.parse(%{{1 => STDOUT.puts("Busted")}}) } assert_raise(RuntimeError) { @parser.parse(%{"\u0022; p 123; \u0022Busted"}) } assert_raise(RuntimeError) { @parser.parse(%{"" p 123; ""}) } assert_equal("\u0022; p 123; \u0022Busted", @parser.parse(%{"\\u0022; p 123; \\u0022Busted"})) assert_equal('#{p 123}', @parser.parse(%q{"#{p 123}"})) assert_equal('["#{`ls -r`}"]', @parser.parse(%q{["#{`ls -r`}"]})) assert_equal('#{p 123}', @parser.parse(%q{"\\u0023{p 123}"})) assert_equal('#{p 123}', @parser.parse(%q{"\u0023{p 123}"})) Regards, Thomas.