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