parser.Parser: refactor using TextParser

Signed-off-by: Alejandro Mery <amery@jpi.io>
This commit is contained in:
2023-09-03 16:42:10 +00:00
parent e34e8eda0a
commit 01cd4139bd
2 changed files with 33 additions and 73 deletions
+16 -27
View File
@@ -1,4 +1,4 @@
// Package parser parses dosini-style files
// Package parser parses ini-style files
package parser
import (
@@ -8,10 +8,9 @@ import (
"asciigoat.org/core/lexer"
)
// Parser parses a dosini-style document
// Parser parses a ini-style document
type Parser struct {
src *lexer.Reader
pos lexer.Position
p TextParser
// OnToken is called for each identified token. if it returns an error
// parsing is interrupted.
@@ -51,15 +50,13 @@ func (p *Parser) setDefaults() {
}
func (p *Parser) emitString(typ TokenType) error {
s := p.src.Emit()
err := p.OnToken(p.pos, typ, s)
p.pos.StepN(len(s))
return err
pos, s := p.p.Emit()
return p.OnToken(pos, typ, s)
}
func (p *Parser) emitError(content string, err error) (lexer.StateFn, error) {
err2 := p.OnError(p.pos, content, err)
pos := p.p.Position()
err2 := p.OnError(pos, content, err)
switch {
case err2 != nil:
// return wrapped error
@@ -77,33 +74,25 @@ func (p *Parser) emitInvalidRune(r rune) (lexer.StateFn, error) {
// stepLine discards the data and moves the position
// to the next line.
func (p *Parser) stepLine() {
p.src.Discard()
p.pos.StepLine()
}
// stepRune discards the data and moves the position
// one rune forward on the same line.
func (p *Parser) stepRune() {
p.src.Discard()
p.pos.Step()
p.p.StepLine()
}
// stepString discards the data and moves the position
// forward on the same line the length of the discarded
// content.
func (p *Parser) stepString() {
s := p.src.Emit()
p.pos.StepN(len(s))
p.p.Step()
}
// NewParser creates a dosini-style parser using
// NewParser creates a ini-style parser using
// an [io.Reader] as source
func NewParser(r io.Reader) *Parser {
if r == nil {
return nil
var p *Parser
if r != nil {
p = new(Parser)
p.p.Init(r)
}
return &Parser{
src: lexer.NewReader(r),
}
return p
}