Spec-Zone.ru › Go

Пакет token

  • import "go/token"
  • Обзор
  • Индекс
  • Примеры

Обзор

Пакет token определяет константы, представляющие лексические токены языка программирования Go, и базовые операции над токенами (вывод, предикаты).

Пример (RetrievePositionInfo)

Код:

fset := token.NewFileSet()

const src = `package main

import "fmt"

import "go/token"


type p = token.Pos

const bad = token.NoPos


func ok(pos p) bool {
    return pos != bad
}

/*line :7:9*/func main() {
    fmt.Println(ok(bad) == bad.IsValid())
}
`

f, err := parser.ParseFile(fset, "main.go", src, 0)
if err != nil {
    fmt.Println(err)
    return
}

// Print the location and kind of each declaration in f.
for _, decl := range f.Decls {
    // Get the filename, line, and column back via the file set.
    // We get both the relative and absolute position.
    // The relative position is relative to the last line directive.
    // The absolute position is the exact position in the source.
    pos := decl.Pos()
    relPosition := fset.Position(pos)
    absPosition := fset.PositionFor(pos, false)

    // Either a FuncDecl or GenDecl, since we exit on error.
    kind := "func"
    if gen, ok := decl.(*ast.GenDecl); ok {
        kind = gen.Tok.String()
    }

    // If the relative and absolute positions differ, show both.
    fmtPosition := relPosition.String()
    if relPosition != absPosition {
        fmtPosition += "[" + absPosition.String() + "]"
    }

    fmt.Printf("%s: %s\n", fmtPosition, kind)
}

Вывод:

main.go:3:1: import
main.go:5:1: import
main.go:1:5[main.go:8:1]: type
main.go:3:1[main.go:10:1]: const
fake.go:42:11[main.go:13:1]: func
fake.go:7:9[main.go:17:14]: func

Индекс

  • Константы
  • функция IsExported(name string) bool
  • функция IsIdentifier(name string) bool
  • функция IsKeyword(name string) bool
  • тип File
  • функция (f *File) AddLine(offset int)
  • функция (f *File) AddLineColumnInfo(offset int, filename string, line, column int)
  • функция (f *File) AddLineInfo(offset int, filename string, line int)
  • функция (f *File) Base() int
  • функция (f *File) Line(p Pos) int
  • функция (f *File) LineCount() int
  • функция (f *File) LineStart(line int) Pos
  • функция (f *File) Lines() []int
  • функция (f *File) MergeLine(line int)
  • функция (f *File) Name() string
  • функция (f *File) Offset(p Pos) int
  • функция (f *File) Pos(offset int) Pos
  • функция (f *File) Position(p Pos) (pos Position)
  • функция (f *File) PositionFor(p Pos, adjusted bool) (pos Position)
  • функция (f *File) SetLines(lines []int) bool
  • функция (f *File) SetLinesForContent(content []byte)
  • функция (f *File) Size() int
  • тип FileSet
  • функция NewFileSet() *FileSet
  • функция (s *FileSet) AddFile(filename string, base, size int) *File
  • функция (s *FileSet) Base() int
  • функция (s *FileSet) File(p Pos) (f *File)
  • функция (s *FileSet) Iterate(f func(*File) bool)
  • функция (s *FileSet) Position(p Pos) (pos Position)
  • функция (s *FileSet) PositionFor(p Pos, adjusted bool) (pos Position)
  • функция (s *FileSet) Read(decode func(any) error) error
  • функция (s *FileSet) RemoveFile(file *File)
  • функция (s *FileSet) Write(encode func(any) error) error
  • тип Pos
  • функция (p Pos) IsValid() bool
  • тип Position
  • функция (pos *Position) IsValid() bool
  • функция (pos Position) String() string
  • тип Token
  • функция Lookup(ident string) Token
  • функция (tok Token) IsKeyword() bool
  • функция (tok Token) IsLiteral() bool
  • функция (tok Token) IsOperator() bool
  • функция (op Token) Precedence() int
  • функция (tok Token) String() string

Примеры

Пакет (RetrievePositionInfo)

Файлы пакета

position.go serialize.go token.go

Константы

Набор констант для парсинга выражений на основе приоритетов. Неоператоры имеют наименьший приоритет, за ними следуют операторы, начиная с приоритета 1 до унарных операторов. Самый высокий приоритет используется как «универсальный» приоритет для селекторов, индексирования и других операторов и разделителей токенов.

const (
    LowestPrec  = 0 // non-operators
    UnaryPrec   = 6
    HighestPrec = 7
)

функция IsExported 1.13

func IsExported(name string) bool

IsExported сообщает, начинается ли имя с заглавной буквы.

функция IsIdentifier 1.13

func IsIdentifier(name string) bool

IsIdentifier сообщает, является ли имя идентификатором Go, то есть непустой строкой, состоящей из букв, цифр и подчеркиваний, где первый символ не является цифрой. Ключевые слова не являются идентификаторами.

функция IsKeyword 1.13

func IsKeyword(name string) bool

IsKeyword сообщает, является ли имя ключевым словом Go, таким как «func» или «return».

тип File

File — это дескриптор файла, принадлежащего FileSet. У File есть имя, размер и таблица смещений строк.

type File struct {
    // contains filtered or unexported fields
}

функция (*File) AddLine

func (f *File) AddLine(offset int)

AddLine добавляет смещение строки для новой строки. Смещение строки должно быть больше смещения предыдущей строки и меньше размера файла; в противном случае смещение строки игнорируется.

функция (*File) AddLineColumnInfo 1.11

func (f *File) AddLineColumnInfo(offset int, filename string, line, column int)

AddLineColumnInfo добавляет альтернативную информацию о файле, строке и номере столбца для заданного смещения в файле. Смещение должно быть больше смещения предыдущей альтернативной информации о строке и меньше размера файла; в противном случае информация игнорируется.

AddLineColumnInfo обычно используется для регистрации альтернативной информации о позиции для директив строк, таких как //line filename:line:column.

функция (*File) AddLineInfo

func (f *File) AddLineInfo(offset int, filename string, line int)

AddLineInfo похожа на File.AddLineColumnInfo с аргументом column = 1. Она предназначена для обратной совместимости с кодом до Go 1.11.

функция (*File) Base

func (f *File) Base() int

Base возвращает базовое смещение файла f, зарегистрированное с помощью AddFile.

функция (*File) Line

func (f *File) Line(p Pos) int

Line возвращает номер строки для заданной позиции файла p; p должен быть значением Pos в этом файле или NoPos.

функция (*File) LineCount

func (f *File) LineCount() int

LineCount возвращает количество строк в файле f.

функция (*File) LineStart 1.12

func (f *File) LineStart(line int) Pos

LineStart возвращает значение Pos начала указанной строки. Она игнорирует любые альтернативные позиции, установленные с помощью File.AddLineColumnInfo. LineStart вызывает панику, если номер строки (с 1) является недопустимым.

функция (*File) Lines 1.21

func (f *File) Lines() []int

Lines возвращает эффективную таблицу смещений строк в формате, описанном в File.SetLines. Вызывающие стороны не должны изменять результат.

функция (*File) MergeLine 1.2

func (f *File) MergeLine(line int)

MergeLine объединяет строку со следующей строкой. Это похоже на замену символа новой строки в конце строки пробелом (чтобы не изменить оставшиеся смещения). Чтобы получить номер строки, см., например, [Position.Line]. MergeLine вызовет панику, если ей будет передан недопустимый номер строки.

функция (*File) Name

func (f *File) Name() string

Name возвращает имя файла файла f, зарегистрированное с помощью AddFile.

функция (*File) Offset

func (f *File) Offset(p Pos) int

Offset возвращает смещение для заданной позиции файла p.

Если p находится перед началом файла (или если p равно NoPos), результат равен 0; если p находится после конца файла, то результат равен размеру файла (см. также go.dev/issue/57490).

Следующее свойство, хотя и не верно для смещений в общем случае, выполняется для результата смещения: f.Offset(f.Pos(offset)) == offset

функция (*File) Pos

func (f *File) Pos(offset int) Pos

Pos возвращает значение Pos для заданного смещения в файле.

Если смещение отрицательное, результат — начальная позиция файла; если смещение слишком большое, результат — конечная позиция файла (см. также go.dev/issue/57490).

Следующее свойство, хотя и не верно для значений Pos в общем случае, выполняется для результата p: f.Pos(f.Offset(p)) == p.

функция (*File) Position

func (f *File) Position(p Pos) (pos Position)

Position возвращает значение Position для заданной позиции файла p. Если p выходит за пределы, она корректируется в соответствии с поведением File.Offset. Вызов f.Position(p) эквивалентен вызову f.PositionFor(p, true).

функция (*File) PositionFor 1.4

func (f *File) PositionFor(p Pos, adjusted bool) (pos Position)

PositionFor возвращает значение Position для заданной позиции файла p. Если p выходит за пределы, она корректируется в соответствии с поведением File.Offset. Если adjusted установлено, позиция может быть скорректирована с помощью комментариев //line для изменения позиции; в противном случае эти комментарии игнорируются. p должно быть значением Pos в f или NoPos.

функция (*File) SetLines

func (f *File) SetLines(lines []int) bool

SetLines устанавливает смещения строк для файла и сообщает, удалось ли это. Смещения строк — это смещения первого символа каждой строки; например, для содержимого "ab\nc\n" смещения строк равны {0, 3}. Пустой файл имеет пустую таблицу смещений строк. Каждое смещение строки должно быть больше смещения предыдущей строки и меньше размера файла; в противном случае SetLines завершается неудачно и возвращает false. Вызывающие стороны не должны изменять предоставленный срез после возвращения SetLines.

функция (*File) SetLinesForContent

func (f *File) SetLinesForContent(content []byte)

SetLinesForContent устанавливает смещения строк для заданного содержимого файла. Она игнорирует комментарии //line для изменения позиции.

функция (*File) Size

func (f *File) Size() int

Size возвращает размер файла f, зарегистрированный с помощью AddFile.

тип FileSet

FileSet представляет собой набор файлов исходного кода. Методы наборов файлов синхронизированы; несколько горутин могут их вызывать одновременно.

Смещения байтов для каждого файла в наборе файлов отображаются в отдельные (целые) интервалы, один интервал [base, base+size] на файл. FileSet.Base представляет собой первый байт в файле, а size — соответствующий размер файла. Значение Pos — это значение в таком интервале. Определив интервал, к которому принадлежит значение Pos, можно вычислить файл, его базовое смещение и, следовательно, смещение байтов (позицию), которое представляет значение Pos.

При добавлении нового файла, необходимо указать базовый смещение файла. Это может быть любое целое значение, которое находится за пределами любого интервала любого уже имеющегося в наборе файлов. Для удобства, FileSet.Base предоставляет такое значение, которое представляет собой конец интервала Pos последнего добавленного файла, плюс единица. Если нет необходимости расширять интервал позднее, следует использовать FileSet.Base в качестве аргумента для FileSet.AddFile.

Файл File может быть удалён из набора файлов FileSet, когда он больше не нужен. Это может уменьшить использование памяти в приложении с длительным выполнением.

type FileSet struct {
    // contains filtered or unexported fields
}

функция NewFileSet

func NewFileSet() *FileSet

NewFileSet создаёт новый набор файлов.

функция (*FileSet) AddFile

func (s *FileSet) AddFile(filename string, base, size int) *File

AddFile добавляет новый файл с заданным именем файла, базовым смещением и размером файла в набор файлов s и возвращает файл. Несколько файлов могут иметь одинаковое имя. Базовое смещение не должно быть меньше FileSet.Base, а размер не должен быть отрицательным. В качестве особого случая, если предоставлено отрицательное базовое смещение, используется текущее значение FileSet.Base.

Добавление файла установит значение FileSet.Base набора файлов до base + size + 1 в качестве минимального базового значения для следующего файла. Существует следующее соотношение между значением Pos p для заданного смещения файла offs:

int(p) = base + offs

при offs в диапазоне [0, size] и, следовательно, p в диапазоне [base, base+size]. Для удобства, File.Pos может использоваться для создания позиционных значений, специфичных для файла, из смещения файла.

функция (*FileSet) Base

func (s *FileSet) Base() int

Base возвращает минимальное базовое смещение, которое необходимо предоставить FileSet.AddFile при добавлении следующего файла.

функция (*FileSet) File

func (s *FileSet) File(p Pos) (f *File)

File возвращает файл, содержащий позицию p. Если такой файл не найден (например, для p == NoPos), результат равен nil.

функция (*FileSet) Iterate

func (s *FileSet) Iterate(f func(*File) bool)

Iterate вызывает f для файлов в наборе файлов в порядке их добавления до тех пор, пока f не вернёт false.

функция (*FileSet) Position

func (s *FileSet) Position(p Pos) (pos Position)

Position преобразует Pos p в наборе файлов в значение Position. Вызов s.Position(p) эквивалентен вызову s.PositionFor(p, true).

функция (*FileSet) PositionFor 1.4

func (s *FileSet) PositionFor(p Pos, adjusted bool) (pos Position)

PositionFor преобразует Pos p в наборе файлов в значение Position. Если adjusted установлен, позиция может быть скорректирована с помощью //line комментариев, изменяющих позицию; в противном случае эти комментарии игнорируются. p должен быть значением Pos в s или NoPos.

функция (*FileSet) Read

func (s *FileSet) Read(decode func(any) error) error

Read вызывает decode для десериализации набора файлов в s; s не должен быть nil.

функция (*FileSet) RemoveFile 1.20

func (s *FileSet) RemoveFile(file *File)

RemoveFile удаляет файл из FileSet, так что последующие запросы его интервала Pos возвращают отрицательный результат. Это уменьшает использование памяти долгоживущего FileSet, который сталкивается с неограниченным потоком файлов.

Удаление файла, который не принадлежит набору, не оказывает никакого эффекта.

функция (*FileSet) Write

func (s *FileSet) Write(encode func(any) error) error

Write вызывает encode для сериализации набора файлов s.

тип Pos

Pos — компактное кодирование позиции источника внутри набора файлов. Его можно преобразовать в Position для более удобного, но значительно большего представления.

Значение Pos для данного файла — это число в диапазоне [base, base+size], где base и size задаются при добавлении файла в набор файлов. Разница между значением Pos и соответствующим базовым смещением файла соответствует смещению байта этой позиции (представленной значением Pos) от начала файла. Таким образом, смещение базового файла — это значение Pos, представляющее первый байт в файле.

Для создания значения Pos для определённого смещения источника (измеряемого в байтах), сначала добавьте соответствующий файл в текущий набор файлов с помощью FileSet.AddFile, а затем вызовите File.Pos(offset) для этого файла. Учитывая значение Pos p для конкретного набора файлов fset, соответствующее значение Position получается путём вызова fset.Position(p).

Значения Pos можно сравнивать напрямую с помощью обычных операторов сравнения: Если два значения Pos p и q находятся в одном файле, сравнение p и q эквивалентно сравнению соответствующих смещений файла источника. Если p и q находятся в разных файлах, p < q истинно, если файл, подразумеваемый p, был добавлен в соответствующий набор файлов до файла, подразумеваемого q.

type Pos int

Нулевое значение для Pos — NoPos; нет информации о файле и строке, связанной с ним, и NoPos.IsValid() — ложно. NoPos всегда меньше любого другого значения Pos. Соответствующее значение Position для NoPos — нулевое значение для Position.

const NoPos Pos = 0

функция (Pos) IsValid

func (p Pos) IsValid() bool

IsValid сообщает, является ли позиция допустимой.

тип Position

Position описывает произвольную позицию источника, включая расположение файла, строки и столбца. Position допустима, если номер строки больше 0.

type Position struct {
    Filename string // filename, if any
    Offset   int    // offset, starting at 0
    Line     int    // line number, starting at 1
    Column   int    // column number, starting at 1 (byte count)
}

функция (*Position) IsValid

func (pos *Position) IsValid() bool

IsValid сообщает, является ли позиция допустимой.

функция (Position) String

func (pos Position) String() string

String возвращает строку в одном из нескольких форматов:

file:line:column    valid position with file name
file:line           valid position with file name but no column (column == 0)
line:column         valid position without file name
line                valid position without file name and no column (column == 0)
file                invalid position with file name
-                   invalid position without file name

тип Token

Token — набор лексических токенов языка программирования Go.

type Token int

Список токенов.

const (
    // Special tokens
    ILLEGAL Token = iota
    EOF
    COMMENT

    // Identifiers and basic type literals
    // (these tokens stand for classes of literals)
    IDENT  // main
    INT    // 12345
    FLOAT  // 123.45
    IMAG   // 123.45i
    CHAR   // 'a'
    STRING // "abc"

    // Operators and delimiters
    ADD // +
    SUB // -
    MUL // *
    QUO // /
    REM // %

    AND     // &
    OR      // |
    XOR     // ^
    SHL     // <<
    SHR     // >>
    AND_NOT // &^

    ADD_ASSIGN // +=
    SUB_ASSIGN // -=
    MUL_ASSIGN // *=
    QUO_ASSIGN // /=
    REM_ASSIGN // %=

    AND_ASSIGN     // &=
    OR_ASSIGN      // |=
    XOR_ASSIGN     // ^=
    SHL_ASSIGN     // <<=
    SHR_ASSIGN     // >>=
    AND_NOT_ASSIGN // &^=

    LAND  // &&
    LOR   // ||
    ARROW // <-
    INC   // ++
    DEC   // --

    EQL    // ==
    LSS    // <
    GTR    // >
    ASSIGN // =
    NOT    // !

    NEQ      // !=
    LEQ      // <=
    GEQ      // >=
    DEFINE   // :=
    ELLIPSIS // ...

    LPAREN // (
    LBRACK // [
    LBRACE // {
    COMMA  // ,
    PERIOD // .

    RPAREN    // )
    RBRACK    // ]
    RBRACE    // }
    SEMICOLON // ;
    COLON     // :

    // Keywords
    BREAK
    CASE
    CHAN
    CONST
    CONTINUE

    DEFAULT
    DEFER
    ELSE
    FALLTHROUGH
    FOR

    FUNC
    GO
    GOTO
    IF
    IMPORT

    INTERFACE
    MAP
    PACKAGE
    RANGE
    RETURN

    SELECT
    STRUCT
    SWITCH
    TYPE
    VAR

    // additional tokens, handled in an ad-hoc manner
    TILDE
)

функция Lookup

func Lookup(ident string) Token

Lookup отображает идентификатор на его токен ключевого слова или IDENT (если это не ключевое слово).

функция (Token) IsKeyword

func (tok Token) IsKeyword() bool

IsKeyword возвращает true для токенов, соответствующих ключевым словам; в противном случае возвращает false.

функция (Token) IsLiteral

func (tok Token) IsLiteral() bool

IsLiteral возвращает true для токенов, соответствующих идентификаторам и литералам базовых типов; в противном случае возвращает false.

функция (Token) IsOperator

func (tok Token) IsOperator() bool

IsOperator возвращает true для токенов, соответствующих операторам и разделителям; в противном случае возвращает false.

функция (Token) Precedence

func (op Token) Precedence() int

Precedence возвращает приоритет оператора бинарного оператора op. Если op не является бинарным оператором, результат — LowestPrecedence.

функция (Token) String

func (tok Token) String() string

String возвращает строку, соответствующую токену tok. Для операторов, разделителей и ключевых слов строка — это фактическая последовательность символов токена (например, для токена ADD строка — "+"). Для всех остальных токенов строка соответствует имени константы токена (например, для токена IDENT строка — "IDENT").

© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/go/token/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API