...

パッケージ 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
}

// 各宣言の位置と種類を f に表示します。
for _, decl := range f.Decls {
    // ファイルセットを介してファイル名,行,および列を取得します。
    // 相対位置と絶対位置の両方を取得します。
    // 相対位置は,最後の行指令からの相対位置です。
    // 絶対位置はソース内の正確な位置です。
    pos := decl.Pos()
    relPosition := fset.Position(pos)
    absPosition := fset.PositionFor(pos, false)

    // FuncDecl または GenDecl のいずれかです。エラーで終了するからです。
    kind := "func"
    if gen, ok := decl.(*ast.GenDecl); ok {
        kind = gen.Tok.String()
    }

    // 相対位置と絶対位置が異なる場合は,両方を表示してください。
    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) Line(p Pos) int
    func (f *File) LineCount() int
    func (f *File) LineStart(line int) Pos
    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
type FileSet
    func NewFileSet() *FileSet
    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(f 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(interface{}) error) error
    func (s *FileSet) Write(encode func(interface{}) 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

Package (RetrievePositionInfo)

パッケージファイル

position.go serialize.go token.go

定数

優先順位に基づく式解析のための一連の定数。 非演算子の優先順位が最も低く,その後に優先順位 1 から始まって単項演算子までの演算子が続きます。 最も高い優先順位は,セレクター,索引付け,およびその他の演算子および区切り記号の "キャッチオール" 優先順位として機能します。

const (
    LowestPrec  = 0 // 非演算子
    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 が "func" や "return" のような Go のキーワードかどうかを報告します。

type File

File (ファイル) は,ファイルセットに属するファイルのハンドルです。 File には,名前,サイズ,および行オフセットテーブルがあります。

type File struct {
    // エクスポートされていないフィールドがあります
}

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 は, column = 1 引数を持つ AddLineColumnInfo に似ています。 Go 1.11 より前のコードに対する後方互換性のためです。

func (*File) Base

func (f *File) Base() int

Base は, AddFile に登録されているファイル f のベースオフセットを返します。

func (*File) Line

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

Line は与えられたファイル位置 p の行番号を返します。 p はそのファイルまたは NoPos の Pos 値でなければなりません。

func (*File) LineCount

func (f *File) LineCount() int

LineCount はファイル f の行数を返します。

func (*File) LineStart 1.12

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

LineStart は,指定された行の先頭の Pos 値を返します。 AddLineColumnInfo を使用して設定された代替位置は無視されます。 1 から始まる行番号が無効な場合, LineStart はパニックを起こします。

func (*File) MergeLine 1.2

func (f *File) MergeLine(line int)

MergeLine は行を次の行とマージします。 行末の改行文字をスペースに置き換えることに似ています (残りのオフセットを変更しないため) 。 行番号を取得するには,次の URL を参照してください。 ポジションライン無効な行番号が与えられると MergeLine はパニックします。

func (*File) Name

func (f *File) Name() string

Name は, AddFile に登録されているファイル f のファイル名を返します。

func (*File) Offset

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

Offset は与えられたファイル位置 p のオフセットを返します。 p はそのファイル内の有効な Pos 値でなければなりません。 f.Offset(f.Pos(offset)) == offset.

func (*File) Pos

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

Pos は与えられたファイルオフセットの Pos 値を返します。 オフセットは <= f.Size() でなければなりません。 f.Pos(f.Offset(p)) == p.

func (*File) Position

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

Position は与えられたファイル位置 p の Position 値を返します。 f.Position(p) を呼び出すことは, f.PositionFor(p, true) を呼び出すことと同じです。

func (*File) PositionFor 1.4

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

PositionFor は与えられたファイル位置 p の Position 値を返す。 調整が設定されている場合,位置は // 行コメントを変更することで調整できます。 それ以外の場合,それらのコメントは無視されます。 p は, f または NoPos の Pos 値でなければなりません。

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 は,指定されたファイルコンテンツの行オフセットを設定します。 位置を変更する // 行コメントは無視されます。

func (*File) Size

func (f *File) Size() int

Size は, AddFile に登録されているファイル f のサイズを返します。

type FileSet

FileSet (ファイルセット) は一連のソースファイルを表します。 ファイルセットのメソッドは同期されています。 複数のゴルーチンがそれらを平行に呼び出すことができます。

type FileSet struct {
    // エクスポートされていないフィールドがあります
}

func NewFileSet

func NewFileSet() *FileSet

NewFileSet は新しいファイルセットを作成します。

func (*FileSet) AddFile

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

AddFile は,指定されたファイル名,ベースオフセット,およびファイルサイズを持つ新しいファイルをファイルセット s に追加し,そのファイルを返します。 複数のファイルに同じ名前を付けることができます。 ベースオフセットは FileSet の Base() より小さくてはいけません,そして size は負であってはいけません。 特別な場合として,負の基数が指定されている場合は,代わりに FileSet の Base() の現在値が使用されます。

ファイルを追加すると,ファイルセットの Base() 値は,次のファイルの最小ベース値として base + size + 1 に設定されます。 与えられたファイルオフセット off に対する Pos 値 p の間には,次の関係があります。

int(p) = base + offs

off は [0, size] の範囲にあり,したがって p は [base, base+size] の範囲にあります。 便宜上, File.Pos を使用してファイルオフセットからファイル固有の位置の値を作成できます。

func (*FileSet) Base

func (s *FileSet) Base() int

Base は,次のファイルを追加するときに AddFile に提供する必要がある最小ベースオフセットを返します。

func (*FileSet) File

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

File は位置 p を含むファイルを返します。 そのようなファイルが見つからない場合 (例えば p == NoPos の場合) ,結果は nil です。

func (*FileSet) Iterate

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

Iterate は,f が false を返すまで,追加された順にファイルセット内のファイルに対して f を繰り返し呼び出します。

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 値に変換します。 調整が設定されている場合,位置は // 行コメントを変更することで調整できます。 それ以外の場合,それらのコメントは無視されます。 p は, s または NoPos の Pos 値でなければなりません。

func (*FileSet) Read

func (s *FileSet) Read(decode func(interface{}) error) error

Read は,ファイルセットを s に逆シリアル化するために decode を呼び出します。 s は nil であってはいけません。

func (*FileSet) Write

func (s *FileSet) Write(encode func(interface{}) error) error

Write は,ファイルセット s を直列化するために encode を呼び出します。

type Pos

Pos はファイルセット内のソース位置をコンパクトにエンコードしたものです。 それは Position に変換することができます。

与えられたファイルの Pos 値は [base, base+size] の範囲の数です。 ここで base と size はファイルを AddFile でファイルセットに追加するときに指定されます。

特定のソースオフセット (バイト単位) の Pos 値を作成するには,まず FileSet.AddFile を使用して現在のファイルセットにそれぞれのファイルを追加してから,そのファイルの File.Pos(offset) を呼び出します。 特定のファイルセット fset の Pos 値 p が与えられると,対応する Position 値は fset.Position(p) を呼び出すことによって取得されます。

Pos 値は,通常の比較演算子と直接比較できます。 2 つの Pos 値 p と q が同じファイルにある場合, p と q を比較することは,それぞれのソースファイルのオフセットを比較することと同じです。 p と q が異なるファイルにある場合, p が示すファイルが q が示すファイルより前にそれぞれのファイルセットに追加されていれば, p < q が成り立ちます。

type Pos int

Pos のゼロ値は NoPos です。 それに関連するファイルと行の情報はなく, NoPos.IsValid() は false です。 NoPos は常に他の Pos 値よりも小さいです。 NoPos の対応する Position 値は, Position のゼロ値です。

const NoPos Pos = 0

func (Pos) IsValid

func (p Pos) IsValid() bool

IsValid は,位置が有効かどうかを報告します。

type Position

Position (位置) は,ファイル,行,列の位置など,任意のソース位置を表します。 行番号が > 0 の場合,Position は有効です。

type Position struct {
    Filename string // ファイル名,もしあれば
    Offset   int    // 0 から始まるオフセット
    Line     int    // 1 から始まる行番号
    Column   int    // 1 から始まる列番号 (バイト数)
}

func (*Position) IsValid

func (pos *Position) IsValid() bool

IsValid は,位置が有効かどうかを報告します。

func (Position) String

func (pos Position) String() string

String は,いくつかの形式のいずれかで文字列を返します。

file:line:column    ファイル名と有効な位置
file:line           ファイル名と有効な位置,ただし,列はなし (column == 0)
line:column         ファイル名なしの有効な位置
line                ファイル名と列なしの有効な位置 (column == 0)
file                無効な位置とファイル名
-                   ファイル名なしの無効な位置

type Token

Token (トークン) は Go プログラミング言語の字句トークンのセットです。

type Token int

トークンのリスト

const (
    // 特別なトークン
    ILLEGAL Token = iota
    EOF
    COMMENT

    // 識別子と基本型リテラル (これらのトークンはリテラルのクラスを表します)
    IDENT  // main
    INT    // 12345
    FLOAT  // 123.45
    IMAG   // 123.45i
    CHAR   // 'a'
    STRING // "abc"

    // 演算子とデリミタ
    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     // :

    // キーワード
    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
)

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" です) 。