import "go/token"

このパッケージは、Goプログラミング言語の字句要素、および基本演算子を表すトークンを定義しています。

パッケージファイル

position.go token.go

定数

式を解析するための優先順位に基づいた定数セットです。非演算子は最も低い優先順位を持ち、そこから優先順位1の演算子が始まり、単項演算子まで続きます。最も高い優先順位は、常に最優先されるセレクタ、インデックス指定、その他の演算子、デリミタトークンです。

const (
    LowestPrec  = 0 // 非演算子
    UnaryPrec   = 7
    HighestPrec = 8
)

File型

Fileは、FileSetに属しているファイル用のハンドルです。Fileは、名前、サイズ、行オフセットのテーブルを持っています。

type File struct {
    // contains unexported fields
}

(*File) AddLine関数

func (f *File) AddLine(offset int)

AddLineは、新しい行のために行オフセットを追加します。この行オフセットは、その前の行のオフセットより大きくなければならず、かつファイルサイズを超えてはいけません。これらの範囲外のときは、行オフセットは無視されます。

(*File) AddLineInfo関数

func (f *File) AddLineInfo(offset int, filename string, line int)

AddLineInfoは、指定したファイルオフセットに、代替のファイル名と行番号情報を追加します。このオフセットは、前に加えた代替行情報のオフセットより大きくなければならず、かつファイルサイズを超えてはいけません。これらの範囲外のときは、この情報は無視されます。

AddLineInfoは、一般的にソースファイル内の「//line ファイル名:行」コメントのために、代替位置情報を登録するとき使用されます。

(*File) Base関数

func (f *File) Base() int

Baseは、AddFileで登録された、ファイルfのベースオフセットを返します。

(*File) Line関数

func (f *File) Line(p Pos) int

Lineは、指定したファイル位置pの行番号を返します。pは、このファイル内のPos型の値、またはNoPosでなければなりません。

(*File) LineCount関数

func (f *File) LineCount() int

LineCountは、ファイルfの行数を返します。

(*File) Name関数

func (f *File) Name() string

Nameは、AddFileで登録された、ファイルfのファイル名を返します。

(*File) Offset関数

func (f *File) Offset(p Pos) int

Offsetは、指定したファイル位置pのオフセットを返します。pは、file. f.Offset(f.Pos(offset)) == offsetとなる有効なPos型の値でなければなりません。

(*File) Pos関数

func (f *File) Pos(offset int) Pos

Posは、指定したファイルオフセットであるPos型の値を返します。offset <= f.Size()でなければなりません。常に、f.Pos(f.Offset(p)) == pが成り立ちます。

(*File) Position関数

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

Positionは、指定したファイル位置pのPosition型の値を返します。pは、このファイル内のPos型の値、またはNoPosでなければなりません。

(*File) SetLines関数

func (f *File) SetLines(lines []int) bool

SetLinesは、すべての行オフセットを設定し、成功したときにtrueを返します。各行オフセットは、ひとつ前の行オフセットより大きくなければならず、かつファイルサイズを超えてはいけません。これらの範囲外のときは、SetLinesは失敗し、falseを返します。

(*File) Size関数

func (f *File) Size() int

Sizeは、AddFileで登録された、ファイルfのサイズを返します。

FileSet型

FileSetは、ソースファイル群を表します。

type FileSet struct {
    // contains unexported fields
}

NewFileSet関数

func NewFileSet() *FileSet

NewFileSetは、新しいファイル群を作成します。

(*FileSet) AddFile関数

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

AddFileは、指定されたファイル名、ベースオフセット、ファイルサイズで、ファイル群に新しいファイルを追加し、追加したファイルを返します。複数のファイルが同じ名前を持つこともできます。
このベースオフセットは、FileSetのBase()より小さくてはならず、またサイズにマイナス値は指定できません。

ファイルの追加により、このファイル群のBase()の値が、base + size + 1に設定され、次のファイルの最小のベース値となります。Pos型の値pと指定したファイルオフセットoffsには、下の関係が成り立ちます。

int(p) = base + offs

offsの範囲は[0, size]、かつ、pの範囲が[base, base+size]のとき。都合上、ファイルオフセットからファイルに対するPosition値を作成するときに、File.Posが使われることがあります。

(*FileSet) Base関数

func (s *FileSet) Base() int

Baseは、次のファイルを追加するときにAddFileに提供されるべき最小のベースオフセットを返します。

(*FileSet) Position関数

func (s *FileSet) Position(p Pos) (pos Position)

Positionは、ファイル群内のPosを、通常のPositionに変換します。

Pos型

Posは、ファイル群内のソース位置をコンパクトに符号化したものです。これは、より使いやすいのですが、少々大きすぎるPosition型に変換できます。

ファイルのPosの値はの範囲は、[base, base+size]です。このbaseとsizeは、AddFileでファイル群にファイルを追加したときに指定した値です。

ソースのオフセット用として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が真になります。

type Pos int

Posのゼロ値がNoPosです。NoPosには、それに関連づけられたファイルおよび行情報はなく、NoPos().IsValid()はfalseとなります。また、NoPosは、常にどのPos型の値より小さいです。NoPosと対応するPosition型の値は、Position型のゼロ値です。

const NoPos Pos = 0

(Pos) IsValid関数

func (p Pos) IsValid() bool

IsValidは、この位置情報が有効であるときに、trueを返します。

Position型

Positionは、個別のソース内の位置を表現し、これはファイル、行、カラムの位置を指し示しています。行番号が>0のとき、Positionは有効です。

type Position struct {
    Filename string // ファイル名(あれば)
    Offset   int    // オフセット。0から開始。
    Line     int    // 行番号。1から開始。
    Column   int    // カラム番号(文字数)。1から開始。
}

(*Position) IsValid関数

func (pos *Position) IsValid() bool

IsValidは、このPositionが有効のときにtrueを返します。

(*Position) Pos関数

func (pos *Position) Pos() Position

Posは、匿名のPositionフィールドへのアクセッサメソッドです。このメソッドはレシーバを返します。

(Position) String関数

func (pos Position) String() string

Stringは、下のいずれかの形式の文字列を返します。

     file:line:column    有効なPositionで、ファイル名あり
     line:column         有効なPositionで、ファイル名なし
     file                無効なPositionで、ファイル名あり
     -                   無効なPositionで、ファイル名なし

Token型

Tokenは、Goプログラミング言語における字句要素のセットです。

type Token int

トークンの一覧です。

const (
    // 特殊なトークン
    ILLEGAL Token = iota
    EOF
    COMMENT

    // 識別子と基本型のリテラル
    // (これらのトークンは、リテラルの種類を表します)
    IDENT  // main
    INT    // 12345
    FLOAT  // 123.45
    IMAG   // 123.45i
    CHAR   // 'a'
    STRING // "abc"

    // 演算子とデリミタ
    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
)

Lookup関数

func Lookup(ident []byte) Token

Lookupは、識別子をそのキーワードのトークンにマッピングします。キーワードでないときはIDENTを返します。

(Token) IsKeyword関数

func (tok Token) IsKeyword() bool

IsKeywordは、トークンがキーワードであるときにtrueを返します。そうでないときはfalseを返します。

(Token) IsLiteral関数

func (tok Token) IsLiteral() bool

IsLiteralは、トークンが基本型のリテラルの識別子であるときにtrueを返します。そうでないときはfalseを返します。

(Token) IsOperator関数

func (tok Token) IsOperator() bool

IsOperatorは、トークンが演算子かデリミタであるときにtrueを返します。そうでないときはfalseを返します。

(Token) Precedence関数

func (op Token) Precedence() int

Precedenceは、二項演算子opの優先順位を返します。opが二項演算子でないときの戻り値はLowestPrecedenceです。

(Token) String関数

func (tok Token) String() string

Stringは、トークンtokに一致する文字列を返します。演算子、デリミタ、キーワードのときに返される文字列は、トークンの実際の文字シーケンスです。(例えば、トークンAddのときに、返される文字列は「+」です) それ以外のトークンのときに返される文字列は、トークンの定数の名前です。(例えば、トークンIDENTのときに、返される文字列は「IDENT」です)