scanner

package
v1.26.2 Latest Latest
Warning

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

Go to latest
Published: May 16, 2026 License: MIT Imports: 2 Imported by: 0

Documentation

Overview

scannerパッケージはGo言語のソーステキストのためのスキャナを実装します。 ソースとして[]byteを受け取り、Scanメソッドへの繰り返し呼び出しを通じてトークン化します。

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func PrintError

func PrintError(w io.Writer, err error)

PrintErrorは、errパラメータが ErrorList の場合、エラーリストを1行ごとにwに出力します。それ以外の場合は、err文字列を出力します。

Types

type Error

type Error struct {
	Pos token.Position
	Msg string
}

ErrorList では、エラーは*Errorで表されます。 Posは、有効な場合は問題のあるトークンの先頭を指し、エラーの状況はMsgで説明されます。

func (Error) Error

func (e Error) Error() string

Errorはerrorインターフェースを実装します。

type ErrorHandler

type ErrorHandler func(pos token.Position, msg string)

ErrorHandlerは Scanner.Init に提供することができます。構文エラーが発生し、ハンドラがインストールされている場合、ハンドラは位置とエラーメッセージとともに呼び出されます。位置は問題のあるトークンの始まりを指します。

type ErrorList

type ErrorList []*Error

ErrorListは*Errorsのリストです。 ErrorListのゼロ値は使用する準備ができた空のErrorListです。

func (*ErrorList) Add

func (p *ErrorList) Add(pos token.Position, msg string)

Addは、指定された位置とエラーメッセージを持つ ErrorErrorList に追加します。

func (ErrorList) Err

func (p ErrorList) Err() error

Errはこのエラーリストに相当するエラーを返します。 リストが空の場合、Errはnilを返します。

func (ErrorList) Error

func (p ErrorList) Error() string

ErrorList はerrorインターフェースを実装しています。

func (ErrorList) Len

func (p ErrorList) Len() int

ErrorList はsort Interfaceを実装します。

func (ErrorList) Less

func (p ErrorList) Less(i, j int) bool

func (*ErrorList) RemoveMultiples

func (p *ErrorList) RemoveMultiples()

RemoveMultiplesは ErrorList をソートし、1行ごとに最初のエラー以外を削除します。

func (*ErrorList) Reset

func (p *ErrorList) Reset()

Resetは ErrorList のエラーをリセットします。

func (ErrorList) Sort

func (p ErrorList) Sort()

Sort関数は、ErrorList をソートします。*Error のエントリは位置で、他のエラーはエラーメッセージでソートされ、*Error のエントリの前に配置されます。

func (ErrorList) Swap

func (p ErrorList) Swap(i, j int)

type Mode

type Mode uint

Mode値はフラグのセット(または0)です。 これらはスキャナの動作を制御します。

const (
	ScanComments Mode = 1 << iota
)

type Scanner

type Scanner struct {

	// 公開される状態 - 変更しても問題ありません
	ErrorCount int
	// contains filtered or unexported fields
}

スキャナは、指定されたテキストを処理する間、スキャンの内部状態を保持します。それは他のデータ構造の一部として割り当てられることもできますが、使用前に Scanner.Init によって初期化される必要があります。

func (*Scanner) Init

func (s *Scanner) Init(file *token.File, src []byte, err ErrorHandler, mode Mode)

Init関数は、スキャナsを準備してテキストsrcをトークンに分割することができるように、 スキャナをsrcの先頭に位置付けします。スキャナは位置情報のためにファイルセットファイルを使用し、 各行に対して行情報を追加します。同じファイルを再スキャンする際には、既に存在する行情報は無視されるため、 同じファイルを再使用しても問題ありません。もしファイルのサイズがsrcのサイズと一致しない場合は、 Initはパニックを引き起こします。

Scanner.Scan の呼び出しは、構文エラーが発生した場合にエラーハンドラerrを呼び出し、errがnilでない場合にはエラーハンドラerrを呼び出します。 また、エラーが発生する毎に Scanner のErrorCountフィールドが1増加します。モードパラメーターはコメントの扱い方を決定します。

Initはファイルの最初の文字にエラーがある場合、errを呼び出す場合があります。

func (*Scanner) Scan

func (s *Scanner) Scan() (pos token.Pos, tok token.Token, lit string)

Scanは次のトークンをスキャンして、トークンの位置、トークン、およびリテラル文字列(適用可能な場合)を返します。ソースの終了は token.EOF で示されます。 返されるトークンがリテラル(token.IDENTtoken.INTtoken.FLOATtoken.IMAGtoken.CHARtoken.STRING)または token.COMMENT である場合、リテラル文字列は対応する値を持ちます。 返されるトークンがキーワードの場合、リテラル文字列はキーワードです。 返されるトークンが token.SEMICOLON の場合、対応するリテラル文字列は、ソースにセミコロンが存在する場合は";"であり、改行またはEOFの場合は"\n"です。 返されるトークンが token.ILLEGAL の場合、リテラル文字列は違反している文字です。 その他の場合、Scanは空のリテラル文字列を返します。 より許容度の高い解析のために、構文エラーが発生した場合でも、可能な限り有効なトークンを返します。したがって、結果のトークンのシーケンスに違法なトークンが含まれていない場合でも、クライアントはエラーが発生したとは推測できません。代わりに、スキャナーのErrorCountまたはエラーハンドラーの呼び出し回数を確認する必要があります(インストールされている場合)。 ScanはInitでファイルセットに追加されたファイルに行情報を追加します。トークンの位置はそのファイルとファイルセットに対して相対的です。

Example
package main

import (
	"github.com/shogo82148/std/fmt"
	"github.com/shogo82148/std/go/scanner"
	"github.com/shogo82148/std/go/token"
)

func main() {
	// src はトークン化したい入力です。
	src := []byte("cos(x) + 1i*sin(x) // Euler")

	// スキャナーを初期化する。
	var s scanner.Scanner
	fset := token.NewFileSet()                      // positionsはfsetに対して相対的です。
	file := fset.AddFile("", fset.Base(), len(src)) // "file"という入力を登録する
	s.Init(file, src, nil /* エラーハンドラーなし */, scanner.ScanComments)

	// Scanの繰り返し呼び出しは、入力で見つかったトークンのシーケンスを返します。
	for {
		pos, tok, lit := s.Scan()
		if tok == token.EOF {
			break
		}
		fmt.Printf("%s\t%s\t%q\n", fset.Position(pos), tok, lit)
	}

}
Output:
1:1	IDENT	"cos"
1:4	(	""
1:5	IDENT	"x"
1:6	)	""
1:8	+	""
1:10	IMAG	"1i"
1:12	*	""
1:13	IDENT	"sin"
1:16	(	""
1:17	IDENT	"x"
1:18	)	""
1:20	COMMENT	"// Euler"
1:28	;	"\n"

Jump to

Keyboard shortcuts

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