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(grammar Grammar, start string) os.Error

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

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

Alternative型

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

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

(Alternative) Pos関数

func (x Alternative) Pos() token.Position

Expression型

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

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

Grammar型

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

type Grammar map[string]*Production

Parse関数

func Parse(filename string, src []byte) (Grammar, os.Error)

Parseは、指定されたソースsrcよりEBNF生成規則のセットを解析して結果を返します。誤った構文の場合、または生成規則が重複している場合はエラーを返します。

Group型

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

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

Name型

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

type Name struct {
    token.Position
    String string
}

Option型

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

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

Production型

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

type Production struct {
    Name *Name
    Expr Expression
}

(*Production) Pos関数

func (p *Production) Pos() token.Position

Range型

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

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

(Range) Pos関数

func (x Range) Pos() token.Position

Repetition型

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

type Repetition struct {
    token.Position
    Body Expression // {body}
}

Sequence型

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

type Sequence []Expression // x y z

(Sequence) Pos関数

func (x Sequence) Pos() token.Position

Token型

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

type Token struct {
    token.Position
    String string
}