# File lib/puppet/parser/lexer.rb, line 440
440:   def scan
441:     #Puppet.debug("entering scan")
442:     lex_error "Invalid or empty string" unless @scanner
443: 
444:     # Skip any initial whitespace.
445:     skip
446: 
447:     until token_queue.empty? and @scanner.eos? do
448:       yielded = false
449:       matched_token, value = find_token
450: 
451:       # error out if we didn't match anything at all
452:       lex_error "Could not match #{@scanner.rest[/^(\S+|\s+|.*)/]}" unless matched_token
453: 
454:       newline = matched_token.name == :RETURN
455: 
456:       # this matches a blank line; eat the previously accumulated comments
457:       getcomment if lexing_context[:start_of_line] and newline
458:       lexing_context[:start_of_line] = newline
459: 
460:       final_token, token_value = munge_token(matched_token, value)
461: 
462:       unless final_token
463:         skip
464:         next
465:       end
466: 
467:       lexing_context[:after]         = final_token.name unless newline
468:       lexing_context[:string_interpolation_depth] += 1 if final_token.name == :DQPRE
469:       lexing_context[:string_interpolation_depth] -= 1 if final_token.name == :DQPOST
470: 
471:       value = token_value[:value]
472: 
473:       if match = @@pairs[value] and final_token.name != :DQUOTE and final_token.name != :SQUOTE
474:         @expected << match
475:       elsif exp = @expected[-1] and exp == value and final_token.name != :DQUOTE and final_token.name != :SQUOTE
476:         @expected.pop
477:       end
478: 
479:       if final_token.name == :LBRACE
480:         commentpush
481:       end
482: 
483:       yield [final_token.name, token_value]
484: 
485:       if @previous_token
486:         namestack(value) if @previous_token.name == :CLASS and value != '{'
487: 
488:         if @previous_token.name == :DEFINE
489:           if indefine?
490:             msg = "Cannot nest definition #{value} inside #{@indefine}"
491:             self.indefine = false
492:             raise Puppet::ParseError, msg
493:           end
494: 
495:           @indefine = value
496:         end
497:       end
498:       @previous_token = final_token
499:       skip
500:     end
501:     @scanner = nil
502: 
503:     # This indicates that we're done parsing.
504:     yield [false,false]
505:   end