github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/asm/lex/slice.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 Slice reads from a slice of Tokens.
    14  type Slice struct {
    15  	tokens []Token
    16  	base   *src.PosBase
    17  	line   int
    18  	pos    int
    19  }
    20  
    21  func NewSlice(base *src.PosBase, line int, tokens []Token) *Slice {
    22  	return &Slice{
    23  		tokens: tokens,
    24  		base:   base,
    25  		line:   line,
    26  		pos:    -1, // Next will advance to zero.
    27  	}
    28  }
    29  
    30  func (s *Slice) Next() ScanToken {
    31  	s.pos++
    32  	if s.pos >= len(s.tokens) {
    33  		return scanner.EOF
    34  	}
    35  	return s.tokens[s.pos].ScanToken
    36  }
    37  
    38  func (s *Slice) Text() string {
    39  	return s.tokens[s.pos].text
    40  }
    41  
    42  func (s *Slice) File() string {
    43  	return s.base.Filename()
    44  }
    45  
    46  func (s *Slice) Base() *src.PosBase {
    47  	return s.base
    48  }
    49  
    50  func (s *Slice) SetBase(base *src.PosBase) {
    51  	// Cannot happen because we only have slices of already-scanned text,
    52  	// but be prepared.
    53  	s.base = base
    54  }
    55  
    56  func (s *Slice) Line() int {
    57  	return s.line
    58  }
    59  
    60  func (s *Slice) Col() int {
    61  	// TODO: Col is only called when defining a macro and all it cares about is increasing
    62  	// position to discover whether there is a blank before the parenthesis.
    63  	// We only get here if defining a macro inside a macro.
    64  	// This imperfect implementation means we cannot tell the difference between
    65  	//	#define A #define B(x) x
    66  	// and
    67  	//	#define A #define B (x) x
    68  	// The first definition of B has an argument, the second doesn't. Because we let
    69  	// text/scanner strip the blanks for us, this is extremely rare, hard to fix, and not worth it.
    70  	return s.pos
    71  }
    72  
    73  func (s *Slice) Close() {
    74  }