treerack/char.go

60 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
type charParser struct {
2018-01-04 18:36:59 +01:00
name string
id int
not bool
chars []rune
ranges [][]rune
}
type charBuilder struct {
name string
id int
2017-06-25 17:51:08 +02:00
}
2018-01-05 19:06:10 +01:00
func (p *charParser) nodeName() string { return p.name }
func (p *charParser) nodeID() int { return p.id }
func (p *charParser) commitType() CommitType { return Alias }
2017-06-25 17:51:08 +02:00
2017-12-31 16:14:56 +01:00
func matchChar(chars []rune, ranges [][]rune, not bool, char rune) bool {
2017-10-31 21:53:09 +01:00
for _, ci := range chars {
if ci == char {
return !not
2017-06-25 17:51:08 +02:00
}
}
2017-10-31 21:53:09 +01:00
for _, ri := range ranges {
if char >= ri[0] && char <= ri[1] {
return !not
2017-06-25 17:51:08 +02:00
}
}
2017-10-31 21:53:09 +01:00
return not
}
func (p *charParser) match(t rune) bool {
2017-12-31 16:14:56 +01:00
return matchChar(p.chars, p.ranges, p.not, t)
2017-06-25 17:51:08 +02:00
}
2017-10-31 21:09:30 +01:00
func (p *charParser) parse(c *context) {
2017-07-17 04:23:29 +02:00
if tok, ok := c.token(); !ok || !p.match(tok) {
if c.offset > c.failOffset {
c.failOffset = c.offset
c.failingParser = nil
}
2017-06-25 17:51:08 +02:00
c.fail(c.offset)
return
}
2017-07-17 04:23:29 +02:00
2017-11-01 00:19:29 +01:00
c.success(c.offset + 1)
2017-06-25 17:51:08 +02:00
}
2017-07-29 16:25:17 +02:00
2018-01-04 18:36:59 +01:00
func (b *charBuilder) nodeName() string { return b.name }
func (b *charBuilder) nodeID() int { return b.id }
func (b *charBuilder) build(c *context) ([]*Node, bool) {
return nil, false
}