私はソースファイルをトークンに分割して、特に識別子をスキャンしています。しかし、識別子は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
例外は「例外的」な場合にのみ使用してください。プログラムフローを作成しようとしないでください。メソッドからトークンを返すだけです。 –
プログラムフローの問題ではありませんでした。私は、識別子が長すぎて切り捨てられているプログラムを使用している人には警告を発する必要があります。私は例外がそれを行うための論理的方法であると考えました。良い選択肢は何でしょうか? –
これを答えにしてみましょう。 –