Был код:
def parse_string start_line_no = line_no result = '' while nil != ( n = @lexer.next ) case n when '"' return [ result, :tok_string ] when '\\' char, tok = parse_escape_seq result << char else result << n end end raise UnclosedStringEx.new( stream_name, line_no, "unclosed string started at: #{stream_name}:#{start_line_no}" ) end |
Просто в цикле из лексера доставался очередной символ и анализировался. Если двойная кавычка, то разбор завершается. Если escape-последовательность, то она анализируется отдельно, если что-то другое, то просто добавляется в результирующий буфер.
Работал код под Ruby 1.8.* и под Ruby 1.9.1. Под Ruby 1.9.2-p136 работать перестал. По двойной кавычке не выходил из функции. Вместо этого кавычка добавлялась к result. Т.е. в case ветка when ‘”’ просто престала работать.
Заработало только когда я переписал код так:
def parse_string start_line_no = line_no result = '' while nil != ( n = @lexer.next ) if '"' == n return [ result, :tok_string ] elsif '\\' == n char, tok = parse_escape_seq result << char else result << n end end raise UnclosedStringEx.new( stream_name, line_no, "unclosed string started at: #{stream_name}:#{start_line_no}" ) end |
Что это было – понять не могу. Как и не могу понять, каким образом со старым вариантом кода под Ruby-1.9.2-p136 успешно проходили все unit-тесты (более сотни test cases).
Но еще больше я не понимаю другого – внося изменения я вместо elsif написал elseif (лишняя буковка). Но при запуске unit-тестов не получил от Ruby-1.9.1-p430/Ruby-1.9.2-p136 ни одной синтаксической ошибки. Вместо этого просто unit-тест обломился из-за несовпадения результатов в одном из test cases. Как так? Может просто rake перехватывает сообщения об ошибках в исходниках? Загадка, однако.
Комментариев нет:
Отправить комментарий