token

package
v1.23.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 14, 2024 License: MIT Imports: 2 Imported by: 0

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

Examples

Constants

View Source
const (
	LowestPrec  = 0
	UnaryPrec   = 6
	HighestPrec = 7
)

優先順位ベースの式の解析のための定数のセット。 非演算子は最低の優先度を持ち、1から始まる演算子が続きます。 最高の優先度はセレクタ、インデックス、その他の演算子や区切り記号トークンのための「キャッチオール」優先度として機能します。

Variables

This section is empty.

Functions

func IsExported added in v1.13.0

func IsExported(name string) bool

IsExported は、name が大文字で始まるかどうかを報告します。

func IsIdentifier added in v1.13.0

func IsIdentifier(name string) bool

IsIdentifierは、nameがGoの識別子であるかどうかを報告します。つまり、 最初の文字が数字でない、文字、数字、アンダースコアで構成された空でない文字列です。キーワードは識別子ではありません。

func IsKeyword added in v1.13.0

func IsKeyword(name string) bool

IsKeywordは、nameがGoのキーワード("func"や"return"など)であるかどうかを報告します。

Types

type File

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

Fileは、FileSet に属するファイルのハンドルです。 Fileには名前、サイズ、行オフセット表があります。

func (*File) AddLine

func (f *File) AddLine(offset int)

AddLineは新しい行の行オフセットを追加します。 行オフセットは前の行のオフセットよりも大きく、ファイルのサイズよりも小さい必要があります。そうでない場合、行オフセットは無視されます。

func (*File) AddLineColumnInfo added in v1.11.0

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引数を持つ File.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はそのファイル内の Pos 値または NoPos でなければなりません。

func (*File) LineCount

func (f *File) LineCount() int

LineCount returns the number of lines in file f.

func (*File) LineStart added in v1.12.0

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

LineStartは指定された行の開始位置の Pos 値を返します。 File.AddLineColumnInfo を使用して設定された代替の位置は無視されます。 LineStartは、1ベースの行番号が無効な場合にパニックを引き起こします。

func (*File) Lines added in v1.21.0

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

Linesは File.SetLines で指定された形式の効果的な行オフセットの表を返します。 呼び出し元は結果を変更してはいけません。

func (*File) MergeLine added in v1.2.0

func (f *File) MergeLine(line int)

MergeLineは、次の行と行を結合します。これは、行の末尾の改行文字をスペースで置き換えることに似ています(残りのオフセットは変更されません)。行番号を取得するには、[Position.Line] などを参照してください。無効な行番号が指定された場合、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がファイルの開始位置より前(または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値を返します。

オフセットが負の場合、結果はファイルの開始位置です。 オフセットが大きすぎる場合、結果はファイルの終了位置です(go.dev/issue/57490も参照してください)。

一般的なPos値には当てはまらないが、結果pに対しては次の不変性が保持されます: f.Pos(f.Offset(p)) == p.

func (*File) Position

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

Positionは、指定されたファイル位置pに対するPosition値を返します。 pが範囲外の場合、それはFile.Offsetの動作に合わせて調整されます。 f.Position(p)を呼び出すことは、f.PositionFor(p, true)を呼び出すことと同等です。

func (*File) PositionFor added in v1.4.0

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

PositionForは、指定されたファイル位置pに対するPosition値を返します。 pが範囲外の場合、File.Offsetの動作に合わせて調整されます。 adjustedが設定されている場合、位置は位置を変更する //lineコメントによって調整される可能性があります。それ以外の場合、それらのコメントは無視されます。 pはf内のPos値、または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はAddFileで登録されたファイルfのサイズを返します。

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.BaseFileSet.AddFile の引数として使用する必要があります。

FileSetが不要な場合、 File はFileSetから削除することができます。これにより、長時間実行されるアプリケーションでメモリ使用量を削減することができます。

func NewFileSet

func NewFileSet() *FileSet

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

func (*FileSet) AddFile

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

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

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(f func(*File) bool)

ファイルセット内のファイルを追加された順にfに呼び出し、fが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 added in v1.4.0

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

PositionForは、ファイルセット内の Pos pを Position 値に変換します。 adjustedが設定されている場合、位置は位置変更を行うコメントによって調整される可能性があります。 そうでなければ、そのコメントは無視されます。 pはsまたは NoPosPos 値でなければなりません。

func (*FileSet) Read

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

Readはファイルセットをデシリアライズするためにデコードを呼び出します。sはnilであってはいけません。

func (*FileSet) RemoveFile added in v1.20.0

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

RemoveFileは、 FileSet からファイルを削除し、その後の Pos 間隔のクエリが負の結果を返すようにします。 これにより、長寿命の FileSet のメモリ使用量が減少し、無制限のファイルストリームに遭遇した場合でも処理が可能になります。

セットに属さないファイルを削除しても効果はありません。

func (*FileSet) Write

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

Writeはエンコードを呼び出してファイルセットsをシリアライズする。

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

const NoPos Pos = 0

Pos のゼロ値はNoPosであり、ファイルおよび行情報は関連付けられていません。 また、NoPos.IsValid()はfalseです。NoPosは常に他の Pos 値よりも小さくなります。 NoPosに対応する Position 値は Position のゼロ値です。

func (Pos) IsValid

func (p Pos) IsValid() bool

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

type Position

type Position struct {
	Filename string
	Offset   int
	Line     int
	Column   int
}

Positionはファイル、行、列の位置を含む任意のソース位置を表します。 Positionは行番号が> 0の場合に有効です。

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

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 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 returns the operator precedence of the binary operator op. If op is not a binary operator, the result is LowestPrecedence. Precedenceは、バイナリ演算子opの演算子の優先度を返します。opがバイナリ演算子でない場合、結果はLowestPrecedenceになります。

func (Token) String

func (tok Token) String() string

Stringはtokに対応する文字列を返します。 演算子、区切り文字、キーワードの場合、文字列は実際のトークン文字列です(たとえば、トークン ADD の場合、文字列は"+"です)。 それ以外のすべてのトークンに対して、文字列はトークンの定数名に対応します(たとえば、トークン IDENT の場合、文字列は"IDENT"です)。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL