parsex

package
v0.0.0-...-6e7bffa Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 4, 2015 License: MIT Imports: 8 Imported by: 3

Documentation

Overview

parsec 的部分代码实现参考了 https://github.com/sanyaade-buildtools/goparsechttps://github.com/prataprc/goparsec 但是我需要一个面向 unicode 的简洁实现,所以只好重写了自己的版本。

parsex state 包参考了 golang 的内置包定义,部分代码模仿或来自 text/scanner ,其中有向 https://github.com/sanyaade-buildtools/goparsec 学习一部分设计思路

Index

Constants

This section is empty.

Variables

View Source
var Digit = RuneChecker(func(pos int, x interface{}) (interface{}, error) {
	if unicode.IsDigit(x.(rune)) {
		return x, nil
	} else {
		message := fmt.Sprintf("expect space but got %v", x)
		return x, errors.New(message)
	}
}, "digit")
View Source
var Float = Either(UnsignedFloat,
	Bind_(Rune('-'), func(st ParsexState) (interface{}, error) {
		value, err := UnsignedFloat(st)
		if err == nil {
			return ExtractString(append([]interface{}{'-'},
				value.([]interface{})...)), nil
		} else {
			return nil, err
		}
	}))
View Source
var NewLine = OneOf(NewLineRunes)
View Source
var NewLineRunes = []interface{}{"\r", "\n"}
View Source
var Space = RuneChecker(func(pos int, x interface{}) (interface{}, error) {
	if unicode.IsSpace(x.(rune)) {
		return x, nil
	} else {
		message := fmt.Sprintf("expect space but got %v", x)
		return x, errors.New(message)
	}
}, "space")
View Source
var Spaces = Skip(Space)
View Source
var UnsignedFloat = Bind(Many(Digit), func(input interface{}) Parser {
	return func(st ParsexState) (interface{}, error) {
		value, err := Bind_(Rune('.'), Many1(Digit))(st)
		if err != nil {
			return nil, err
		}
		ret := []interface{}{}
		ret = append(ret, input.([]interface{})...)
		ret = append(ret, '.')
		ret = append(ret, value.([]interface{})...)
		return ExtractString(ret), nil
	}
})

Functions

func Always

func Always(pos int, x interface{}) (interface{}, error)

func AnyFloat64

func AnyFloat64(st ParsexState) (interface{}, error)

func AnyInt

func AnyInt(st ParsexState) (interface{}, error)

func AnyOne

func AnyOne(st ParsexState) (interface{}, error)

match anyone else a eof or panic

func AnyRune

func AnyRune(st ParsexState) (interface{}, error)

func AnyTime

func AnyTime(st ParsexState) (interface{}, error)

FIXME: string 类型是一个坑,好大的坑,目前没有更好的办法?

不同 format 类型的坑

func Eof

func Eof(st ParsexState) (interface{}, error)

func ExtractString

func ExtractString(input interface{}) string

func ExtraString 将 interface{} 转成 string,如果输入数据与前面提到的规范不符,会 panic

func Float64Val

func Float64Val(st ParsexState) (interface{}, error)

func Int

func Int(st ParsexState) (interface{}, error)

func IntVal

func IntVal(st ParsexState) (interface{}, error)

func Nil

func Nil(st ParsexState) (interface{}, error)

func StringVal

func StringVal(st ParsexState) (interface{}, error)

func TimeVal

func TimeVal(st ParsexState) (interface{}, error)

Types

type NotEqual

type NotEqual struct {
	Value interface{}
	Pos   int
	// contains filtered or unexported fields
}

func (NotEqual) Error

func (this NotEqual) Error() string

type Parser

type Parser func(ParsexState) (interface{}, error)

func Between

func Between(start, end, p Parser) Parser

func Bind

func Bind(parser Parser, fun func(interface{}) Parser) Parser

func Bind_

func Bind_(parserx, parsery Parser) Parser

func Binds

func Binds(first Parser, then ...func(interface{}) Parser) Parser

Binds 相当于用 Bind 对一个 func(interface{})Parser 链做左折叠,起始参数为 first

func Binds_

func Binds_(parsers ...Parser) Parser

Binds_ 逐个尝试每一个 Parser,直至发生错误或者到达最后,如果到达最后一个 Parser, 返回其结果

func Choice

func Choice(parsers ...Parser) Parser

Choice 是如下逻辑的迭代版本

func Choice(parsers ...Parser) Parser {
	switch len(parsers) {
	case 0:
		panic(errors.New("empty choice chain"))
	case 1:
		return parsers[0]
	case 2:
		return Either(Try(parsers[0]), Try(parsers[1]))
	default:
		return Either(Try(parsers[0]), Choice(parsers[1:]))
	}
}

func Either

func Either(parserx, parsery Parser) Parser

try one parser, if it fails (without consuming input) try the next

func Fail

func Fail(message string) Parser

func Many

func Many(parser Parser) Parser

func Many1

func Many1(parser Parser) Parser

func ManyTil

func ManyTil(p, end Parser) Parser

func Maybe

func Maybe(p Parser) Parser

func NoneOf

func NoneOf(data []interface{}) Parser

func OneOf

func OneOf(data ...interface{}) Parser

func Option

func Option(v interface{}, parser Parser) Parser

func Return

func Return(v interface{}) Parser

func ReturnString

func ReturnString(input interface{}) Parser

func ReturnString 用 Return 包装 ExtraString,使其适用于 Bind 这样的组合子。

func Rune

func Rune(r rune) Parser

func RuneChecker

func RuneChecker(checker func(int, interface{}) (interface{}, error), expected string) Parser

func SepBy

func SepBy(p, sep Parser) Parser

func SepBy1

func SepBy1(p, sep Parser) Parser

func Skip

func Skip(p Parser) Parser

func Str

func Str(s string) Parser

Str 用于解析一个 rune 流是否匹配 s 的内容。

func String

func String(s string) Parser

parsex 的 String 尝试匹配 State 的下一个 Token,这与 parsec 不同

func TheOne

func TheOne(one interface{}) Parser

func Try

func Try(parser Parser) Parser

func Union

func Union(parsers ...Parser) Parser

func UnionAll

func UnionAll(parsers ...Parser) Parser

type ParsexError

type ParsexError struct {
	Pos     int
	Message string
}

func (ParsexError) Error

func (err ParsexError) Error() string

type ParsexState

type ParsexState interface {
	Next(pred func(int, interface{}) (interface{}, error)) (x interface{}, err error)
	Pos() int
	SeekTo(int)
	Trap(message string, args ...interface{}) error
}

type StateInMemory

type StateInMemory struct {
	// contains filtered or unexported fields
}

func NewStateInMemory

func NewStateInMemory(buffer []interface{}) *StateInMemory

func (*StateInMemory) Next

func (this *StateInMemory) Next(pred func(int, interface{}) (interface{}, error)) (x interface{}, err error)

func (*StateInMemory) Pos

func (this *StateInMemory) Pos() int

func (*StateInMemory) SeekTo

func (this *StateInMemory) SeekTo(pos int)

func (*StateInMemory) Trap

func (this *StateInMemory) Trap(message string, args ...interface{}) error

type TypeError

type TypeError struct {
	Type  string
	Value interface{}
	Pos   int
}

func (TypeError) Error

func (this TypeError) Error() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL