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


syntax highlighted by Code2HTML, v. 0.9.1