parser

package
v1.21.10 Latest Latest
Warning

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

Go to latest
Published: Feb 7, 2024 License: MIT Imports: 3 Imported by: 0

Documentation

Overview

パッケージparserはGoのソースファイルのパーサを実装しています。入力はさまざまな形式で提供できます(Parse*関数を参照)。出力はGoソースを表す抽象構文木(AST)です。パーサはParse*関数のいずれかを経由して呼び出されます。 パーサは、Goの仕様で構文的に許可されていないより大きな言語を受け入れていますが、これは単純さと構文エラーの存在下での強靱性の向上のためです。たとえば、メソッド宣言では、レシーバは通常のパラメータリストのように扱われるため、複数のエントリが可能ですが、仕様では一つしか許可されていません。そのため、ASTの対応するフィールド(ast.FuncDecl.Recv)は一つに制限されていません。

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func ParseDir

func ParseDir(fset *token.FileSet, path string, filter func(fs.FileInfo) bool, mode Mode) (pkgs map[string]*ast.Package, first error)

ParseDirは、指定されたパスのディレクトリ内で拡張子が".go"で終わるすべてのファイルに対してParseFileを呼び出し、 見つかったすべてのパッケージ名->パッケージASTのマップを返します。

もしfilter != nilなら、フィルタを通過するfs.FileInfoエントリを持つ(かつ".go"で終わる)ファイルのみを考慮します。 モードビットはParseFileに変更なしで渡されます。 位置情報はfsetに記録されますが、これはnilであってはなりません。

ディレクトリが読み込めなかった場合、nilのマップと対応するエラーが返されます。 パースエラーが発生した場合、非nilで不完全なマップと最初に遭遇したエラーが返されます。

func ParseExpr

func ParseExpr(x string) (ast.Expr, error)

ParseExprは式xのASTを取得するための便利関数です。 ASTに記録される位置情報は未定義です。エラーメッセージで使用されるファイル名は空の文字列です。

文法エラーが見つかった場合、結果は部分的なASTです(ast.Bad*ノードがエラーの断片を表します)。複数のエラーはソース位置でソートされたscanner.ErrorListを介して返されます。

func ParseExprFrom added in v1.5.0

func ParseExprFrom(fset *token.FileSet, filename string, src any, mode Mode) (expr ast.Expr, err error)

ParseExprFromは式を解析するための便利な関数です。 引数の意味はParseFileと同じですが、ソースは有効なGo(型または値)の式である必要があります。具体的には、fsetはnilであってはなりません。

ソースが読み取れなかった場合、返されるASTはnilであり、エラーは特定の失敗を示します。ソースは読み取られたが構文エラーが見つかった場合、結果は部分的なAST(ast.Bad*ノードが誤ったソースコードの断片を表す)です。複数のエラーは、ソースの位置でソートされたscanner.ErrorListを介して返されます。

func ParseFile

func ParseFile(fset *token.FileSet, filename string, src any, mode Mode) (f *ast.File, err error)

ParseFileは単一のGoソースファイルのソースコードを解析し、対応するast.Fileノードを返します。ソースコードはソースファイルのファイル名またはsrcパラメータを介して指定できます。 src != nilの場合、ParseFileはsrcからソースを解析し、ファイル名は位置情報の記録にのみ使用されます。srcパラメータの引数のタイプはstring、[]byte、またはio.Readerである必要があります。src == nilの場合、ParseFileはfilenameで指定されたファイルを解析します。 modeパラメータはソーステキストの解析量とその他のオプションのパーサ機能を制御します。SkipObjectResolutionモードビットがセットされている場合、解析のオブジェクト解決フェーズがスキップされ、File.Scope、File.Unresolved、およびすべてのIdent.Objフィールドはnilになります。 位置情報はnilではないファイルセットfsetに記録されます。 ソースを読み取ることができなかった場合、返されるASTはnilであり、エラーには具体的な失敗が示されます。ソースが読み取られたが構文エラーが見つかった場合、結果は部分的なAST(ast.Bad*ノードがエラーソースコードのフラグメントを表す)です。複数のエラーはソース位置でソートされたscanner.ErrorListを介して返されます。

Example
package main

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

func main() {
	fset := token.NewFileSet() // positionsはfsetに対して相対的な位置にあります。

	src := `package foo

import (
	"fmt"
	"time"
)

func bar() {
	fmt.Println(time.Now())
}`

	// インポートの処理をした後にsrcをパースしますが、それ以降の処理を停止します。
	f, err := parser.ParseFile(fset, "", src, parser.ImportsOnly)
	if err != nil {
		fmt.Println(err)
		return
	}

	// ファイルのASTからインポートを出力する。
	for _, s := range f.Imports {
		fmt.Println(s.Path.Value)
	}

	// 出力:
	//
	// "fmt"
	// "time"
}
Output:

Types

type Mode

type Mode uint

モード値はフラグのセット(または0)です。 これらはソースコードの解析量やその他のオプションの パーサー機能を制御します。

const (
	PackageClauseOnly Mode = 1 << iota
	ImportsOnly
	ParseComments
	Trace
	DeclarationErrors
	SpuriousErrors
	SkipObjectResolution
	AllErrors = SpuriousErrors
)

Jump to

Keyboard shortcuts

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