440: def scan
441:
442: lex_error "Invalid or empty string" unless @scanner
443:
444:
445: skip
446:
447: until token_queue.empty? and @scanner.eos? do
448: yielded = false
449: matched_token, value = find_token
450:
451:
452: lex_error "Could not match #{@scanner.rest[/^(\S+|\s+|.*)/]}" unless matched_token
453:
454: newline = matched_token.name == :RETURN
455:
456:
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:
504: yield [false,false]
505: end