Documentation
¶
Overview ¶
scannerパッケージはGo言語のソーステキストのためのスキャナを実装します。 ソースとして[]byteを受け取り、Scanメソッドへの繰り返し呼び出しを通じてトークン化します。
Index ¶
- func PrintError(w io.Writer, err error)
- type Error
- type ErrorHandler
- type ErrorList
- func (p *ErrorList) Add(pos token.Position, msg string)
- func (p ErrorList) Err() error
- func (p ErrorList) Error() string
- func (p ErrorList) Len() int
- func (p ErrorList) Less(i, j int) bool
- func (p *ErrorList) RemoveMultiples()
- func (p *ErrorList) Reset()
- func (p ErrorList) Sort()
- func (p ErrorList) Swap(i, j int)
- type Mode
- type Scanner
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
Types ¶
type ErrorHandler ¶
ErrorHandlerは Scanner.Init に提供することができます。構文エラーが発生し、ハンドラがインストールされている場合、ハンドラは位置とエラーメッセージとともに呼び出されます。位置は問題のあるトークンの始まりを指します。
type ErrorList ¶
type ErrorList []*Error
ErrorListは*Errorsのリストです。 ErrorListのゼロ値は使用する準備ができた空のErrorListです。
func (*ErrorList) RemoveMultiples ¶
func (p *ErrorList) RemoveMultiples()
RemoveMultiplesは ErrorList をソートし、1行ごとに最初のエラー以外を削除します。
type Scanner ¶
type Scanner struct {
// 公開される状態 - 変更しても問題ありません
ErrorCount int
// contains filtered or unexported fields
}
スキャナは、指定されたテキストを処理する間、スキャンの内部状態を保持します。それは他のデータ構造の一部として割り当てられることもできますが、使用前に Scanner.Init によって初期化される必要があります。
func (*Scanner) Init ¶
Init関数は、スキャナsを準備してテキストsrcをトークンに分割することができるように、 スキャナをsrcの先頭に位置付けします。スキャナは位置情報のためにファイルセットファイルを使用し、 各行に対して行情報を追加します。同じファイルを再スキャンする際には、既に存在する行情報は無視されるため、 同じファイルを再使用しても問題ありません。もしファイルのサイズがsrcのサイズと一致しない場合は、 Initはパニックを引き起こします。
Scanner.Scan の呼び出しは、構文エラーが発生した場合にエラーハンドラerrを呼び出し、errがnilでない場合にはエラーハンドラerrを呼び出します。 また、エラーが発生する毎に Scanner のErrorCountフィールドが1増加します。モードパラメーターはコメントの扱い方を決定します。
Initはファイルの最初の文字にエラーがある場合、errを呼び出す場合があります。
func (*Scanner) Scan ¶
Scanは次のトークンをスキャンして、トークンの位置、トークン、およびリテラル文字列(適用可能な場合)を返します。ソースの終了は token.EOF で示されます。 返されるトークンがリテラル(token.IDENT、token.INT、token.FLOAT、token.IMAG、token.CHAR、token.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"