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, parser.SkipObjectResolution)
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

Указатель

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

Примеры

Пакет (RetrievePositionInfo)

Файлы пакета

position.go serialize.go token.go tree.go

Константы

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

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

func IsExported 1.13

func IsExported(name string) bool

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

func IsIdentifier 1.13

func IsIdentifier(name string) bool

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

func IsKeyword 1.13

func IsKeyword(name string) bool

IsKeyword сообщает, является ли name ключевым словом Go, например "func" или "return".

type File

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

Для создания File используйте FileSet.AddFile. File может принадлежать нескольким FileSet; см. FileSet.AddExistingFiles.

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

func (*File) AddLine

func (f *File) AddLine(offset int)

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

func (*File) AddLineColumnInfo 1.11

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

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

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

func (*File) AddLineInfo

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

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

func (*File) Base

func (f *File) Base() int

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

func (*File) End 1.26

func (f *File) End() Pos

End возвращает конечную позицию файла f, зарегистрированную с помощью AddFile.

func (*File) Line

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

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

func (*File) LineCount

func (f *File) LineCount() int

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

func (*File) LineStart 1.12

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

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

func (*File) Lines 1.21

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

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

func (*File) MergeLine 1.2

func (f *File) MergeLine(line int)

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

func (*File) Name

func (f *File) Name() string

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

func (*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

func (*File) Pos

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

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

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

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

func (*File) Position

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

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

func (*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.

func (*File) SetLines

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

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

func (*File) SetLinesForContent

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

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

func (*File) Size

func (f *File) Size() int

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

func (*File) String 1.27

func (f *File) String() string

String возвращает краткое описание File.

type FileSet

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

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

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

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

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

func NewFileSet

func NewFileSet() *FileSet

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

func (*FileSet) AddExistingFiles 1.25

func (s *FileSet) AddExistingFiles(files ...*File)

AddExistingFiles добавляет указанные файлы в FileSet, если их там еще нет. Вызывающая сторона должна гарантировать, что в результирующем FileSet не будет пары пересекающихся файлов.

func (*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, чтобы создать значения позиции, относящиеся к конкретному файлу, на основе смещения в файле.

func (*FileSet) Base

func (s *FileSet) Base() int

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

func (*FileSet) File

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

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

func (*FileSet) Iterate

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

Iterate вызывает yield для файлов в наборе в порядке возрастания Base, пока yield не вернет false.

func (*FileSet) Position

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

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

func (*FileSet) PositionFor 1.4

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

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

func (*FileSet) Read

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

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

func (*FileSet) RemoveFile 1.20

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

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

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

func (*FileSet) Write

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

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

type 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() возвращает false. NoPos всегда меньше любого другого значения Pos. Соответствующее Position значение для NoPos — это нулевое значение Position.

const NoPos Pos = 0

func (Pos) IsValid

func (p Pos) IsValid() bool

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

type 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)
}

func (*Position) IsValid

func (pos *Position) IsValid() bool

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

func (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

type 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
)

func Lookup

func Lookup(ident string) Token

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

func (Token) IsKeyword

func (tok Token) IsKeyword() bool

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

func (Token) IsLiteral

func (tok Token) IsLiteral() bool

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

func (Token) IsOperator

func (tok Token) IsOperator() bool

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

func (Token) Precedence

func (op Token) Precedence() int

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

func (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