seared

package module
v0.0.0-...-b9014b6 Latest Latest
Warning

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

Go to latest
Published: Mar 21, 2017 License: BSD-2-Clause Imports: 8 Imported by: 0

README

Seared

Seared is a Go library targeted at allowing easy implementation of text parsers based on powerful Parsing Expression Grammars without the hassle of parser generation steps, while trying to be easy to use, lightweight and appropriate for high-performance parsing needs.

So, how does a grammar definition look in practice? The well-known example "calculator" grammar can be defined like this:

func Number(r *seared.Rules) seared.Rule {
    return r.Rule(func() seared.Rule {
        return r.OneOrMore(r.Range('0', '9'))
    })
}

func Factor(r *seared.Rules) seared.Rule {
    return r.Rule(func() seared.Rule {
        return r.Choice(Number(r), r.Sequence(r.Rune('('), Sum(r), r.Rune(')')))
    })
}

func Term(r *seared.Rules) seared.Rule {
    return r.Rule(func() seared.Rule {
        return r.Sequence(Factor(r), r.ZeroOrMore(r.Any("*/"), Factor(r)))
    })
}

func Sum(r *seared.Rules) seared.Rule {
    return r.Rule(func() seared.Rule {
        return r.Sequence(Term(r), r.ZeroOrMore(r.Any("+-"), Term(r)))
    })
}

func Operation(r *seared.Rules) seared.Rule {
    return r.Rule(func() seared.Rule {
        return r.Sequence(Sum(r), r.End())
    })
}

func Calculator() *seared.Parser {
    return seared.NewParser(Operation)
}

And this is how that parser could be directly used for syntax recognizing:

parser := Calculator()
success := parser.Recognize("2+1*3+4*(2-1)")

License

Seared is released under the Simplified BSD License which can be found at the root of this project.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ResultsNodes

func ResultsNodes(results []*Result) []*node.Node

Types

type Builder

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

func (*Builder) Any

func (b *Builder) Any() (this Expression)

func (*Builder) AnyOf

func (b *Builder) AnyOf(runes string) (this Expression)

func (*Builder) Choice

func (b *Builder) Choice(expressions ...Expression) (this Expression)

func (*Builder) DropNode

func (b *Builder) DropNode() RuleOption

func (*Builder) Empty

func (b *Builder) Empty() (this Expression)

func (*Builder) End

func (b *Builder) End() (this Expression)

func (*Builder) Literal

func (b *Builder) Literal(literal string) (this Expression)

func (*Builder) OmitNode

func (b *Builder) OmitNode() RuleOption

func (*Builder) OneOrMore

func (b *Builder) OneOrMore(expressions ...Expression) (this Expression)

func (*Builder) Optional

func (b *Builder) Optional(expressions ...Expression) (this Expression)

func (*Builder) Range

func (b *Builder) Range(first, last rune) (this Expression)

func (*Builder) Rule

func (b *Builder) Rule(rule func() Expression, options ...RuleOption) Expression

func (*Builder) Rune

func (b *Builder) Rune(r rune) (this Expression)

func (*Builder) Sequence

func (b *Builder) Sequence(expressions ...Expression) (this Expression)

func (*Builder) Test

func (b *Builder) Test(expressions ...Expression) (this Expression)

func (*Builder) TestNot

func (b *Builder) TestNot(expressions ...Expression) (this Expression)

func (*Builder) ZeroOrMore

func (b *Builder) ZeroOrMore(expressions ...Expression) (this Expression)

type Expression

type Expression interface {
	Name() string
	Apply(input buffer.Buffer, position int) (result *Result)
	Expectation() string
}

Expression is a PEG parsing expression

type Log

type Log interface {
	Debugf(format string, args ...interface{})
}

func StandardLog

func StandardLog() Log

func TestingLog

func TestingLog(t *testing.T) Log

type Matcher

type Matcher func(input buffer.Buffer, start int) (result *Result)

type Parser

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

func NewParser

func NewParser(main func(*Builder) Expression) *Parser

func (*Parser) Name

func (p *Parser) Name() string

func (*Parser) ParseBuffer

func (p *Parser) ParseBuffer(input buffer.Buffer) *Result

func (*Parser) ParseString

func (p *Parser) ParseString(input string) *Result

func (*Parser) SetDebug

func (p *Parser) SetDebug(debug bool)

func (*Parser) SetLog

func (p *Parser) SetLog(log Log)

type Result

type Result struct {
	Expression Expression
	Success    bool
	Input      buffer.Buffer
	Start      int
	End        int
	// Parent is the parent PEG expression Result
	Parent *Result
	// Results are the children PEG expressions Results
	Results []*Result
	// Nodes are the parse trees produced
	Nodes []*node.Node
}

func Failure

func Failure(expression Expression, input buffer.Buffer, start, end int) *Result

func Success

func Success(expression Expression, input buffer.Buffer, start, end int) *Result

func (*Result) BetterError

func (r *Result) BetterError() string

func (*Result) ChildlessResults

func (r *Result) ChildlessResults() []*Result

func (*Result) DeepestFailedResult

func (r *Result) DeepestFailedResult() (result *Result)

func (*Result) Depth

func (r *Result) Depth() int

func (*Result) Error

func (r *Result) Error() string

func (*Result) FailedChildlessResults

func (r *Result) FailedChildlessResults() []*Result

func (*Result) FarthestFailedResult

func (r *Result) FarthestFailedResult() (result *Result)

func (*Result) FirstRuleAncestor

func (r *Result) FirstRuleAncestor() *Result

func (*Result) FormatNodeTree

func (r *Result) FormatNodeTree() string

func (*Result) FormatResultTree

func (r *Result) FormatResultTree() string

func (*Result) HasChildren

func (r *Result) HasChildren() bool

func (*Result) Length

func (r *Result) Length() int

func (*Result) Match

func (r *Result) Match() string

func (*Result) WithNodes

func (r *Result) WithNodes(nodes ...*node.Node) *Result

func (*Result) WithResults

func (r *Result) WithResults(results ...*Result) *Result

type Rule

type Rule interface {
	Expression
	SetExpression(expression Expression)
	SetDropNode(b bool)
	SetOmitNode(b bool)
}

Rule is a PEG rule

type RuleOption

type RuleOption func(Rule)

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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