Пакет 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
Индекс
Примеры
Файлы пакета
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/