|  | // Copyright 2015 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package lex | 
|  |  | 
|  | import ( | 
|  | "text/scanner" | 
|  |  | 
|  | "cmd/internal/src" | 
|  | ) | 
|  |  | 
|  | // A Stack is a stack of TokenReaders. As the top TokenReader hits EOF, | 
|  | // it resumes reading the next one down. | 
|  | type Stack struct { | 
|  | tr []TokenReader | 
|  | } | 
|  |  | 
|  | // Push adds tr to the top (end) of the input stack. (Popping happens automatically.) | 
|  | func (s *Stack) Push(tr TokenReader) { | 
|  | s.tr = append(s.tr, tr) | 
|  | } | 
|  |  | 
|  | func (s *Stack) Next() ScanToken { | 
|  | tos := s.tr[len(s.tr)-1] | 
|  | tok := tos.Next() | 
|  | for tok == scanner.EOF && len(s.tr) > 1 { | 
|  | tos.Close() | 
|  | // Pop the topmost item from the stack and resume with the next one down. | 
|  | s.tr = s.tr[:len(s.tr)-1] | 
|  | tok = s.Next() | 
|  | } | 
|  | return tok | 
|  | } | 
|  |  | 
|  | func (s *Stack) Text() string { | 
|  | return s.tr[len(s.tr)-1].Text() | 
|  | } | 
|  |  | 
|  | func (s *Stack) File() string { | 
|  | return s.Base().Filename() | 
|  | } | 
|  |  | 
|  | func (s *Stack) Base() *src.PosBase { | 
|  | return s.tr[len(s.tr)-1].Base() | 
|  | } | 
|  |  | 
|  | func (s *Stack) SetBase(base *src.PosBase) { | 
|  | s.tr[len(s.tr)-1].SetBase(base) | 
|  | } | 
|  |  | 
|  | func (s *Stack) Line() int { | 
|  | return s.tr[len(s.tr)-1].Line() | 
|  | } | 
|  |  | 
|  | func (s *Stack) Col() int { | 
|  | return s.tr[len(s.tr)-1].Col() | 
|  | } | 
|  |  | 
|  | func (s *Stack) Close() { // Unused. | 
|  | } |