class CalcFileLexer def initialize(f) @fi = File.open(f, 'r') @li = '' end def reset(f) @fi.close if @fi @fi = File.open(f, 'r') @li = '' end def cleanup @fi.close end def yylex while 1 return [-1, nil] if @fi.eof? && @li.size == 0 @li = @fi.readline unless @fi.eof? || @li.size > 0 if @li =~ /\A[\ \t]+/o @li = $' next end if @li =~ /\A\n/o @li = $' return [?\n, '\n'] end if @li =~ /\A\+/o @li = $' return [?+, '+'] end if @li =~ /\A\-/o @li = $' return [?-, '-'] end if @li =~ %r!\A\*!o @li = $' return [?*, '*'] end if @li =~ %r!\A/!o @li = $' return [?/, '/'] end if @li =~ /\A\(/o @li = $' return [?(, '('] end if @li =~ /\A\)/o @li = $' return [?), ')'] end if @li =~ /\A\^/o @li = $' return [?^, '^'] end if @li =~ /\A-?\d+(?:\.\d+)?/o @li = $' return [CalcParser::NUM, $&.to_f] end raise CalcParser::LexError end end end