...

パッケージ parser

import "go/parser"
概要
目次

概要 ▾

parser パッケージは,Go ソースファイルのパーサを実装します。 入力は様々な形で与えられます。(様々な Parse* 関数参照)。 出力は Go ソースを表す抽象構文木 (AST) です。 パーサは Parse* 関数を通して呼び出されます。

単純化のため,および構文エラーがある場合の堅牢性の向上のために,パーサーは Go 仕様で構文的に許可されているものよりも大きい言語を受け入れます。 たとえば,メソッド宣言では,レシーバは通常のパラメータリストのように扱われるため, spec で 1 つだけ許可されている場合は複数のエントリを含めることができます。 したがって, AST (ast.FuncDecl.Recv) フィールド内の対応するフィールドは, 1 つのエントリーに制限されていません。

func ParseDir

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

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

filter != nil の場合, os.FileInfo エントリで filter を通過し, ".go" で終わるファイルだけが考慮されます。 モードビットは変更されずに ParseFile に渡されます。 位置情報は fset に記録されます。 fset は nil であってはいけません。

ディレクトリを読み込めなかった場合は, nil マップとそれぞれのエラーが返されます。 解析エラーが発生した場合, nil 以外の不完全なマップと最初に発生したエラーが返されます。

func ParseExpr

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

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

func ParseExprFrom 1.5

func ParseExprFrom(fset *token.FileSet, filename string, src interface{}, mode Mode) (ast.Expr, error)

ParseExprFrom は式を解析するための便利な関数です。 引数は ParseFile と同じ意味ですが,ソースは有効な Go (型または値) 式でなければなりません。 具体的には, fset を nil にしないでください。

func ParseFile

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

ParseFile は 1 つの Go ソースファイルのソースコードを解析し,対応する ast.File ノードを返します。 ソースコードは,ソースファイルのファイル名,または src パラメータを介して渡されます。

src != nil の場合, ParseFile は src からのソースを解析し,ファイル名は位置情報を記録するときにのみ使用されます。 src パラメータの引数の型は, string, []byte ,または io.Reader である必要があります。 src == nil の場合, ParseFile はファイル name で指定されたファイルを解析します。

mode パラメータは,解析されるソーステキストの量とその他のオプションのパーサ機能を制御します。 位置情報はファイルセット fset に記録されます。 これは nil であってはいけません。

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

コード:

fset := token.NewFileSet() // 位置は 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"

type Mode

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

type Mode uint
const (
    PackageClauseOnly Mode             = 1 << iota // パッケージ句の後で解析を停止する
    ImportsOnly                                    // インポート宣言の後に構文解析を停止する
    ParseComments                                  // コメントを解析して AST に追加する
    Trace                                          // パースされたもののトレースを表示する
    DeclarationErrors                              // 宣言エラーを報告する
    SpuriousErrors                                 // AllErrors と同じ (後方互換性のため)
    AllErrors         = SpuriousErrors             // すべてのエラーを報告する (異なる行の最初の 10 個だけではない)
)