Documentation
¶
Overview ¶
tokenパッケージは、Goプログラミング言語の字句トークンとトークンに対する基本的な操作(印刷、述語)を定義する定数を表します。
Example (RetrievePositionInfo) ¶
package main
import (
"github.com/shogo82148/std/fmt"
"github.com/shogo82148/std/go/ast"
"github.com/shogo82148/std/go/parser"
"github.com/shogo82148/std/go/token"
)
func main() {
fset := token.NewFileSet()
const src = `package main
import "fmt"
import "go/token"
//line :1:5
type p = token.Pos
const bad = token.NoPos
//line fake.go:42:11
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)
}
}
Output: 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
Index ¶
- Constants
- 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) 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
- type 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
- type Position
- type Token
Examples ¶
Constants ¶
const ( LowestPrec = 0 UnaryPrec = 6 HighestPrec = 7 )
優先順位ベースの式の解析のための定数のセット。 非演算子は最低の優先度を持ち、1から始まる演算子が続きます。 最高の優先度はセレクタ、インデックス、その他の演算子や区切り記号トークンのための「キャッチオール」優先度として機能します。
Variables ¶
This section is empty.
Functions ¶
func IsExported ¶ added in v1.13.0
IsExported は、name が大文字で始まるかどうかを報告します。
func IsIdentifier ¶ added in v1.13.0
IsIdentifierは、nameがGoの識別子であるかどうかを報告します。つまり、 最初の文字が数字でない、文字、数字、アンダースコアで構成された空でない文字列です。キーワードは識別子ではありません。
Types ¶
type File ¶
type File struct {
// contains filtered or unexported fields
}
FileはFileSetに属するファイルのハンドルです。 Fileには名前、サイズ、行オフセットテーブルがあります。
Fileを作成するには[FileSet.AddFile]を使用してください。 Fileは複数のFileSetに属することができます;[FileSet.AddExistingFiles]を参照してください。
func (*File) AddLine ¶
AddLineは新しい行の行オフセットを追加します。 行オフセットは前の行のオフセットよりも大きく、ファイルのサイズよりも小さい必要があります。そうでない場合、行オフセットは無視されます。
func (*File) AddLineColumnInfo ¶ added in v1.11.0
AddLineColumnInfoは、与えられたファイルオフセットに対して代替のファイル、行、および列番号の情報を追加します。オフセットは、以前に追加された代替の行情報のオフセットよりも大きく、ファイルサイズよりも小さい必要があります。それ以外の場合、情報は無視されます。 AddLineColumnInfoは通常、//line filename:line:columnなどの行ディレクティブの代替位置情報を登録するために使用されます。
func (*File) AddLineInfo ¶
AddLineInfoは、Column = 1引数を持つ File.AddLineColumnInfo と同様です。 Go 1.11より前のコードの後方互換性のためにここにあります。
func (*File) LineStart ¶ added in v1.12.0
LineStartは指定された行の開始位置の Pos 値を返します。 File.AddLineColumnInfo を使用して設定された代替の位置は無視されます。 LineStartは、1ベースの行番号が無効な場合にパニックを引き起こします。
func (*File) Lines ¶ added in v1.21.0
Linesは File.SetLines で指定された形式の効果的な行オフセットの表を返します。 呼び出し元は結果を変更してはいけません。
func (*File) MergeLine ¶ added in v1.2.0
MergeLineは、次の行と行を結合します。これは、行の末尾の改行文字をスペースで置き換えることに似ています(残りのオフセットは変更されません)。行番号を取得するには、[Position.Line] などを参照してください。無効な行番号が指定された場合、MergeLineはパニックを起こします。
func (*File) Offset ¶
Offsetは、指定されたファイル位置pのオフセットを返します。
pがファイルの開始位置より前にある場合(またはpがNoPosの場合)、 結果は0です;pがファイルの終了位置を過ぎている場合、 結果はファイルサイズです( go.dev/issue/57490 も参照してください)。
一般的なオフセット値には当てはまらないが、結果のオフセットに対しては次の不変性が保持されます: f.Offset(f.Pos(offset)) == offset
func (*File) Pos ¶
Posは、指定されたファイルオフセットのPos値を返します。
オフセットが負の場合、結果はファイルの開始位置です。 オフセットが大きすぎる場合、結果はファイルの終了位置です(go.dev/issue/57490も参照してください)。
一般的なPos値には当てはまらないが、結果pに対しては次の不変性が保持されます: f.Pos(f.Offset(p)) == p.
func (*File) Position ¶
Positionは、指定されたファイル位置pに対するPosition値を返します。 pが範囲外の場合、それはFile.Offsetの動作に合わせて調整されます。 f.Position(p)を呼び出すことは、f.PositionFor(p, true)を呼び出すことと同等です。
func (*File) PositionFor ¶ added in v1.4.0
PositionForは、指定されたファイル位置pに対するPosition値を返します。 pが範囲外の場合、File.Offsetの動作に合わせて調整されます。 adjustedが設定されている場合、位置は位置を変更する //lineコメントによって調整される可能性があります。それ以外の場合、それらのコメントは無視されます。 pはf内のPos値、またはNoPosでなければなりません。
func (*File) SetLines ¶
SetLinesはファイルの行オフセットを設定し、成功したかどうかを報告します。 行オフセットとは、各行の最初の文字のオフセットです。 たとえば、"ab\nc\n"という内容の場合、行オフセットは{0、3}です。 空のファイルは空の行オフセットテーブルを持ちます。 各行のオフセットは、前の行のオフセットよりも大きく、ファイルサイズよりも小さくなければなりません。 それ以外の場合、SetLinesは失敗し、falseを返します。 SetLinesが返された後は、与えられたスライスを変更しないでください。
func (*File) SetLinesForContent ¶
SetLinesForContentは与えられたファイルの内容に対して行のオフセットを設定します。 位置を変更する//lineコメントは無視されます。
type FileSet ¶
type FileSet struct {
// contains filtered or unexported fields
}
FileSetはソースファイルの集合を表します。 ファイルセットのメソッドは同期されており、複数のゴルーチンが同時に呼び出すことができます。
ファイルセット内の各ファイルのバイトオフセットは、異なる(整数)間隔、すなわち間隔[base、base+size]にマッピングされます。 FileSet.Base はファイルの最初のバイトを表し、sizeは対応するファイルサイズです。 Pos 値はそのような間隔内の値です。 Pos 値が属する間隔を決定することで、ファイル、そのファイルのベース、そして Pos 値が表しているバイトオフセット(位置)を計算することができます。
新しいファイルを追加する際には、ファイルベースが必要です。それはすでにファイルセット内の任意のファイルの間隔の終わりを過ぎた整数値である必要があります。便宜上、 FileSet.Base はそのような値を提供します。それは単純に最後に追加されたファイルのPos間隔の終わりの位置に+1した値です。後で間隔を拡張する必要がない場合は、 FileSet.Base を FileSet.AddFile の引数として使用する必要があります。
FileSetが不要な場合、 File はFileSetから削除することができます。これにより、長時間実行されるアプリケーションでメモリ使用量を削減することができます。
func (*FileSet) AddExistingFiles ¶ added in v1.25.0
AddExistingFilesは、指定されたファイルが既に存在していない場合に FileSetに追加します。 呼び出し元は、結果のFileSetに表示されるFileのペアが 重複しないことを保証する必要があります。
func (*FileSet) AddFile ¶
AddFileは、指定されたファイル名、ベースオフセット、ファイルサイズを持つ新しいファイルをファイルセットsに追加し、ファイルを返します。複数のファイルは同じ名前を持つことができます。ベースオフセットは、 FileSet.Base より小さくはならず、サイズは負であってはいけません。特別なケースとして、負のベースが提供された場合、 FileSet.Base の現在の値が代わりに使用されます。 ファイルを追加すると、次のファイルのための最小ベース値として、 FileSet.Base の値はbase + size + 1に設定されます。与えられたファイルオフセットoffsに対する Pos 値pの関係は次のとおりです: int(p) = base + offs ただし、offsは範囲[0、size]にあり、したがってpは範囲[base、base+size]にあります。便宜上、 File.Pos はファイル固有の位置値をファイルオフセットから作成するために使用できます。
func (*FileSet) Base ¶
Baseは、次のファイルを追加する際に FileSet.AddFile に提供する必要がある最小のベースオフセットを返します。
func (*FileSet) Position ¶
Positionはファイルセット内の Pos pをPosition値に変換します。 s.Position(p)を呼び出すことは、s.PositionFor(p, true)を呼び出すことと同じです。
func (*FileSet) PositionFor ¶ added in v1.4.0
PositionForは、ファイルセット内の Pos pを Position 値に変換します。 adjustedが設定されている場合、位置は位置変更を行うコメントによって調整される可能性があります。 そうでなければ、そのコメントは無視されます。 pはsまたは NoPos の Pos 値でなければなりません。
func (*FileSet) RemoveFile ¶ added in v1.20.0
RemoveFileは FileSet からファイルを削除し、その後の Pos 区間への問い合わせが負の結果を返すようにします。 これにより、無制限のファイルストリームに遭遇する長期間実行される FileSet のメモリ使用量を削減します。
セットに属さないファイルを削除しても効果はありません。
type Pos ¶
type Pos int
Posはファイルセット内のソース位置のコンパクトなエンコーディングです。 より便利ながらもはるかに大きい表現のために、Position に変換することができます。
与えられたファイルに対するPosの値は、[base、base+size]の範囲内の数値です。 baseとsizeは、ファイルがファイルセットに追加される際に指定されます。 Posの値と対応するファイルベースの差は、その位置(Posの値によって表される)からのバイトオフセットに対応します。 したがって、ファイルベースオフセットは、ファイル内の最初のバイトを表すPosの値です。
特定のソースオフセット(バイト単位で測定される)のPos値を作成するには、 まず FileSet.AddFile を使用して対応するファイルを現在のファイルセットに追加し、 そのファイルのために[File.Pos](offset)を呼び出します。 特定のファイルセットfsetに対するPos値pを持つ場合、対応する Position 値はfset.Position(p)を呼び出すことで得られます。
Pos値は通常の比較演算子を使って直接比較することができます: 2つのPos値pとqが同じファイルにある場合、pとqを比較することは、対応するソースファイルのオフセットを比較することと等価です。 pとqが異なるファイルにある場合、qによって指定されるファイルがpによって指定されるファイルよりも前に対応するファイルセットに追加された場合、p < qはtrueです。
type Token ¶
type Token int
TokenはGoプログラミング言語の字句トークンの集合です。
const ( // 特別なトークン ILLEGAL Token = iota EOF COMMENT // 識別子と基本型のリテラル // (これらのトークンはリテラルのクラスを表します) IDENT INT FLOAT IMAG CHAR STRING // オペレータと区切り文字 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 // 追加のトークン、特別な方法で処理される TILDE )
トークンのリスト。
func (Token) IsOperator ¶
IsOperatorはオペレーターや区切り記号に対応するトークンに対してtrueを返し、 それ以外の場合はfalseを返します。
func (Token) Precedence ¶
Precedence returns the operator precedence of the binary operator op. If op is not a binary operator, the result is LowestPrecedence. Precedenceは、バイナリ演算子opの演算子の優先度を返します。opがバイナリ演算子でない場合、結果はLowestPrecedenceになります。