1// Copyright 2015 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package lex 6 7import ( 8 "text/scanner" 9 10 "cmd/internal/src" 11) 12 13// A Stack is a stack of TokenReaders. As the top TokenReader hits EOF, 14// it resumes reading the next one down. 15type Stack struct { 16 tr []TokenReader 17} 18 19// Push adds tr to the top (end) of the input stack. (Popping happens automatically.) 20func (s *Stack) Push(tr TokenReader) { 21 s.tr = append(s.tr, tr) 22} 23 24func (s *Stack) Next() ScanToken { 25 tos := s.tr[len(s.tr)-1] 26 tok := tos.Next() 27 for tok == scanner.EOF && len(s.tr) > 1 { 28 tos.Close() 29 // Pop the topmost item from the stack and resume with the next one down. 30 s.tr = s.tr[:len(s.tr)-1] 31 tok = s.Next() 32 } 33 return tok 34} 35 36func (s *Stack) Text() string { 37 return s.tr[len(s.tr)-1].Text() 38} 39 40func (s *Stack) File() string { 41 return s.Base().Filename() 42} 43 44func (s *Stack) Base() *src.PosBase { 45 return s.tr[len(s.tr)-1].Base() 46} 47 48func (s *Stack) SetBase(base *src.PosBase) { 49 s.tr[len(s.tr)-1].SetBase(base) 50} 51 52func (s *Stack) Line() int { 53 return s.tr[len(s.tr)-1].Line() 54} 55 56func (s *Stack) Col() int { 57 return s.tr[len(s.tr)-1].Col() 58} 59 60func (s *Stack) Close() { // Unused. 61} 62