これはGoの勉強として実装したシンプルなパーサコンビネータです。
パーサは*string
型のtarget
とint
型のindex
を受け取り、*Result
型とerror
型を返す関数です。
target
のindex
から始まる部分文字列に対してパーサが正常に解析できた場合は、status
がtrue
である*Result
が返却され、error
はnil
となります。正常に解析ができなかった場合は、status
がfalse
である*Result
が返却され、error
はParseError
となります。
パーサは以下のtypeで表されます。
type Parser func(target *string, index int) (*Result, error)
必ず成功し、与えたvalueを持ったResultを返すパーサ
func Succeed(value string) Parser
必ず失敗し、与えたvalueを持ったResultを返すパーサ
func Failed(expected []string) Parser
与えられた文字列にマッチするパーサ
func Str(expected string) Parser
与えられたパーサが複数回マッチするパーサ
func Many(parser Parser) Parser
与えられたいずれかのパーサがマッチするパーサ
func Alt(parsers ...Parser) Parser
与えられた2つのパーサのうち、どちらかのパーサがマッチするパーサ
func Or(left Parser, right Parser) Parser
マッチの結果に関わらず成功するパーサ
func Opt(parser Parser) Parser
与えられた順のパーサが全てマッチするパーサ
func Seq(parsers ...Parser) Parser
与えられた正規表現にマッチするパーサ
func Regexp(reg *regexp.Regexp) Parser
与えられた正規表現文字列にマッチするパーサ
func Regstr(regstr string) Parser
Resultをmapperによって変更するパーサ
func Map(mapper ResultMapper, parser Parser) Parser
SeqのResultをmapperによって変更するパーサ
func SeqMap(mapper ResultMapper, parsers ...Parser) Parser
セパレータで区切られた部分を少なくとも1回パースするパーサ
func SepBy1(parser Parser, separator Parser) Parser
セパレータで区切られた部分をパースするパーサ
func SepBy(parser Parser, separator Parser) Parser
テスト関数が真の間パースするパーサ
func TakeWhile(test func(char rune, index int) bool) Parser
パーサを加工するパーサを返す
func (parser Parser) Thru(wrapper ParserMapper) Parser {
return wrapper(parser)
}
leftとrightに囲まれた部分のResultを返すパーサを返す
func (parser Parser) Wrap(left Parser, right Parser) Parser
nextの部分のResultを返すパーサを返す
func (parser Parser) Then(next Parser) Parser
nextの部分のResultを無視するパーサを返す
func (parser Parser) Skip(next Parser) Parser
Resultに名前を付与するパーサを返す
func (parser Parser) Name(name string) Parser