Пакет 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
Указатель
Примеры
Файлы пакета
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/