• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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