def params
params = []
sign = 1
value = 0
state = :START
while have_more_input
ch = next_char
case state
when :START
case ch
when ?'
state = :CHAR
when ?V, ?v
params << Parameters::Argument.new(@pos)
state = :DONE
when ?#
params << Parameters::ArgumentCount.new(@pos)
state = :DONE
when ?,
params << Parameters::Default.new(@pos)
state = :START
when ?+, ?-, ?0, ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9
sign = (ch == ?-) ? -1 : 1
value = (ch == ?+ or ch == ?-) ? 0 : (ch - ?0)
state = :INTEGER
else
unget_char
state = :DONE
end
when :INTEGER
if (?0..?9).to_a.include? ch
value = value * 10 + (ch - ?0)
else
unget_char
value *= sign
params << Parameters::Integer.new(@pos, value)
state = :DONE
end
when :CHAR
params << Parameters::Character.new(@pos, ch)
state = :DONE
when :DONE
if ch == ?,
state = :START
else
unget_char
break
end
end
end
unless state == :DONE
raise @@errorstates[state][0].new(@pos), @@errorstates[state][1]
end
return params
end