treerack/parse.go

75 lines
1.1 KiB
Go
Raw Normal View History

2017-07-15 21:49:08 +02:00
package treerack
2017-06-25 17:51:08 +02:00
2017-06-25 23:38:32 +02:00
import "fmt"
2017-06-25 17:51:08 +02:00
type definition interface {
nodeName() string
2017-10-28 22:54:15 +02:00
setNodeName(string)
2017-07-15 21:49:08 +02:00
nodeID() int
2017-07-29 16:25:17 +02:00
commitType() CommitType
2017-10-28 22:54:15 +02:00
setCommitType(CommitType)
2017-07-15 21:49:08 +02:00
setID(int)
2017-11-01 02:43:46 +01:00
validate(*registry) error
init(*registry)
setIncludedBy(*registry, int)
parser(*registry) parser
2017-07-29 16:25:17 +02:00
builder() builder
2017-06-25 17:51:08 +02:00
}
type parser interface {
nodeName() string
2017-07-15 21:49:08 +02:00
nodeID() int
2017-10-31 21:09:30 +01:00
parse(*context)
2017-06-25 17:51:08 +02:00
}
2017-07-17 04:23:29 +02:00
type builder interface {
nodeName() string
nodeID() int
2017-07-29 16:25:17 +02:00
build(*context) ([]*Node, bool)
2017-07-17 04:23:29 +02:00
}
2017-06-25 17:51:08 +02:00
func parserNotFound(name string) error {
return fmt.Errorf("parser not found: %s", name)
}
2017-06-25 23:38:32 +02:00
func cannotIncludeParsers(name string) error {
return fmt.Errorf("parser: %s cannot include other parsers", name)
}
2017-07-27 01:48:16 +02:00
func intsContain(is []int, i int) bool {
for _, ii := range is {
if ii == i {
return true
}
}
return false
}
2017-10-31 21:09:30 +01:00
func parse(p parser, c *context) error {
p.parse(c)
2017-06-25 17:51:08 +02:00
if c.readErr != nil {
2017-07-29 18:40:22 +02:00
return c.readErr
2017-06-25 17:51:08 +02:00
}
if !c.match {
2017-07-29 18:40:22 +02:00
return ErrInvalidInput
2017-06-25 17:51:08 +02:00
}
2017-07-29 16:25:17 +02:00
if err := c.finalize(p); err != nil {
2017-07-29 18:40:22 +02:00
return err
2017-06-25 17:51:08 +02:00
}
2017-07-29 18:40:22 +02:00
return nil
}
func build(b builder, c *context) *Node {
c.offset = 0
n, ok := b.build(c)
if !ok || len(n) != 1 {
panic("damaged parse result")
}
return n[0]
2017-06-25 17:51:08 +02:00
}