github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/asm/lex/stack.go (about) 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 5 package lex 6 7 import ( 8 "text/scanner" 9 10 "github.com/go-asm/go/cmd/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. 15 type Stack struct { 16 tr []TokenReader 17 } 18 19 // Push adds tr to the top (end) of the input stack. (Popping happens automatically.) 20 func (s *Stack) Push(tr TokenReader) { 21 s.tr = append(s.tr, tr) 22 } 23 24 func (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 36 func (s *Stack) Text() string { 37 return s.tr[len(s.tr)-1].Text() 38 } 39 40 func (s *Stack) File() string { 41 return s.Base().Filename() 42 } 43 44 func (s *Stack) Base() *src.PosBase { 45 return s.tr[len(s.tr)-1].Base() 46 } 47 48 func (s *Stack) SetBase(base *src.PosBase) { 49 s.tr[len(s.tr)-1].SetBase(base) 50 } 51 52 func (s *Stack) Line() int { 53 return s.tr[len(s.tr)-1].Line() 54 } 55 56 func (s *Stack) Col() int { 57 return s.tr[len(s.tr)-1].Col() 58 } 59 60 func (s *Stack) Close() { // Unused. 61 }