| // 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. | |
| } | |