import "ebnf"

EBNF文法のライブラリです。入力テキスト([]byte)は次の文法を満たします。(これ自身がEBNF文法)

Production  = name "=" Expression "." .
Expression  = Alternative { "|" Alternative } .
Alternative = Term { Term } .
Term        = name | token [ "..." token ] | Group | Option | Repetition .
Group       = "(" Expression ")" .
Option      = "[" Expression "]" .
Repetition  = "{" Expression "}" .

nameはGo識別子、tokenはGo文字列、コメントとホワイトスペースはGo言語と同じルールに従います。

パッケージファイル

ebnf.go parser.go

Verify関数

func Verify(fset *token.FileSet, grammar Grammar, start string) os.Error

Verifyは、以下をチェックします。

  • 使われている全ての名前が定義されているか
  • 使用されている全ての名前が使い始めるときに定義されているか
  • 生成規則が自分以外の名前だけを参照しているか

位置情報は、ファイルセットfsetからの相対として解釈されます。

Alternative型

Alternativeノードは、空ではない選択式のリストを表します。

type Alternative []Expression // x | y | z

(Alternative) Pos関数

func (x Alternative) Pos() token.Pos

Expression型

Expressionノードは、生成規則式を表します。

type Expression interface {
    // 構文構成子の先頭文字位置です。
    Pos() token.Pos
}

Grammar型

Grammarは、EBNF 生成規則のセットです。生成規則名でインデックス化されたマップです。

type Grammar map[string]*Production

Parse関数

func Parse(fset *token.FileSet, filename string, src []byte) (Grammar, os.Error)

Parseは、指定されたソースsrcよりEBNF生成規則のセットを解析して結果を返します。誤った構文の場合、または生成規則が重複している場合はエラーを返します。位置情報は、ファイルセットfsetからの相対として記録されます。

Group型

Groupノードは、グループ化された式を表します。

type Group struct {
    Lparen token.Pos
    Body   Expression // (body)
}

(*Group) Pos関数

func (x *Group) Pos() token.Pos

Name型

Nameノードは、生成規則名を表します。

type Name struct {
    StringPos token.Pos
    String    string
}

(*Name) Pos関数

func (x *Name) Pos() token.Pos

Option型

Optionノードは、オプション式を表します。

type Option struct {
    Lbrack token.Pos
    Body   Expression // [body]
}

(*Option) Pos関数

func (x *Option) Pos() token.Pos

Production型

Productionノードは、EBNF生成規則を表します。

type Production struct {
    Name *Name
    Expr Expression
}

(*Production) Pos関数

func (x *Production) Pos() token.Pos

Range型

Rangeノードは、文字の範囲を表します。

type Range struct {
    Begin, End *Token // begin ... end
}

(*Range) Pos関数

func (x *Range) Pos() token.Pos

Repetition型

Repetitionノードは、繰返し式を表します。

type Repetition struct {
    Lbrace token.Pos
    Body   Expression // {body}
}

(*Repetition) Pos関数

func (x *Repetition) Pos() token.Pos

Sequence型

Sequenceノードは、空ではないシーケンシャル式のリストを表します。

type Sequence []Expression // x y z

(Sequence) Pos関数

func (x Sequence) Pos() token.Pos

Token型

Tokenノードは、リテラルを表します。

type Token struct {
    StringPos token.Pos
    String    string
}

(*Token) Pos関数

func (x *Token) Pos() token.Pos