Я работаю над разбиением исходного файла на токены, в частности, проверкой идентификаторов.Однако существует требование, чтобы идентификаторы были длиной не более 30 символов.Когда идентификатор достигает этой длины, я выдаю исключение с сообщением: 'Identifiers can only be 30 characters long, truncating..'
.
Так и должно быть, но, когда я поднимаю это исключение, я выскакиваю из своего метода, который сканирует идентификаторы, прежде чем я смог сохранить его.Мне нужно как-то вызвать исключение И сохранить идентификатор, который я собрал до сих пор.Есть идеи, как это можно сделать?
# classify each character, and call approriate scan methods
def tokenize()
@infile.each_char do |c|
begin
case c
when /[a-zA-Z\$]/
scan_identifier(c)
when /\s/
#ignore spaces
else
#do nothing
end
rescue TokenizerError => te
puts "#{te.class}: #{te.message}"
end
end
end
# Reads an identifier from the source program
def scan_identifier(id)
this_id = id #initialize this identifier with the character read above
@infile.each_char do |c|
if c =~ /[a-zA-Z0-9_]/
this_id += c
# raising this exception leaves this function before collecting the
# truncated identifier
raise TokenizerError, 'Identifiers can only be 30 characters long, truncating..' if this_id.length == 30
else
puts "#{this_id}"
break # not part of the identifier, or an error
end
end
end