import "ebnf"

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言語の同一ルールに従います。生成規則名は非終端記号を意味するUnicode文字(大文字)で始まっています(トークンの間にコメントとホワイトスペースは可)。

パッケージファイル

ebnf.go parser.go

Verify関数

func Verify(grammar Grammar, start string) os.Error

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

・使われている全ての生成規則が定義されているか

・定義されている全ての生成規則が指定されたstartで開始されているか

・生成規則が他の生成規則にて参照されているか

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生成規則のセットです。mapは生成規則名よりインデックス化されたマップです。

type Grammar map[string]*Production

Parse関数

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

Parseは指定されたソースより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
}