60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
package treerack
|
|
|
|
type charParser struct {
|
|
name string
|
|
id int
|
|
not bool
|
|
chars []rune
|
|
ranges [][]rune
|
|
}
|
|
|
|
type charBuilder struct {
|
|
name string
|
|
id int
|
|
}
|
|
|
|
func (p *charParser) nodeName() string { return p.name }
|
|
func (p *charParser) nodeID() int { return p.id }
|
|
func (p *charParser) commitType() CommitType { return Alias }
|
|
|
|
func matchChar(chars []rune, ranges [][]rune, not bool, char rune) bool {
|
|
for _, ci := range chars {
|
|
if ci == char {
|
|
return !not
|
|
}
|
|
}
|
|
|
|
for _, ri := range ranges {
|
|
if char >= ri[0] && char <= ri[1] {
|
|
return !not
|
|
}
|
|
}
|
|
|
|
return not
|
|
}
|
|
|
|
func (p *charParser) match(t rune) bool {
|
|
return matchChar(p.chars, p.ranges, p.not, t)
|
|
}
|
|
|
|
func (p *charParser) parse(c *context) {
|
|
if tok, ok := c.token(); !ok || !p.match(tok) {
|
|
if c.offset > c.failOffset {
|
|
c.failOffset = c.offset
|
|
c.failingParser = nil
|
|
}
|
|
|
|
c.fail(c.offset)
|
|
return
|
|
}
|
|
|
|
c.success(c.offset + 1)
|
|
}
|
|
|
|
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
|
|
}
|