def to_scalar(str)
case str
when nil ; val = nil
when /\A-?\d+\.\d+\z/ ; val = str.to_f
when /\A-?\d+\z/ ; val = str.to_i
when /\A(true|yes)\z/ ; val = true
when /\A(false|no)\z/ ; val = false
when /\A(null|~)\z/ ; val = nil
when /\A"(.*)"\z/ ; val = $1
when /\A'(.*)'\z/ ; val = $1
when /\A:(\w+)\z/ ; val = $1.intern
when /\A(\d\d\d\d)-(\d\d)-(\d\d)(?: (\d\d):(\d\d):(\d\d))?\z/
year, month, day, hour, min, sec = $1, $2, $3, $4, $5, $6
if hour
val = Time.mktime(year, month, day, hour, min, sec)
else
val = Date.new(year.to_i, month.to_i, day.to_i)
end
else
val = str.empty? ? nil : str
end
skip_spaces_and_comments()
return val
end