From 7a5dc59929f7addabfbaf68721cbe72e03f70fad Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Wed, 30 Aug 2023 02:27:46 +0100 Subject: [PATCH] parser: WIP Signed-off-by: Alejandro Mery --- parser/lexer.go | 46 +++++++++++++++++++++++++++++++------------ parser/lexer_error.go | 4 ++++ parser/lexer_runes.go | 6 ++++++ 3 files changed, 43 insertions(+), 13 deletions(-) diff --git a/parser/lexer.go b/parser/lexer.go index 5ee901e..52730cd 100644 --- a/parser/lexer.go +++ b/parser/lexer.go @@ -30,24 +30,23 @@ func (p *Parser) lexStart() (lexer.StateFn, error) { // whitespace p.src.Discard() p.pos.Step() - default: - // token + case IsCommentStart(r): + // switch to comment lexer p.src.UnreadRune() - return p.lexToken, nil + return p.lexComment, nil + case IsSectionStart(r): + // section + p.src.Discard() + p.pos.Step() + return p.lexSectionStart, nil + default: + // entry + p.src.UnreadRune() + return p.lexEntryStart, nil } } } -func (p *Parser) lexToken() (lexer.StateFn, error) { - p.src.AcceptAll(IsNotSpace) - - s := p.src.Emit() - log.Printf("%s: %s: %q", p.pos, "token", s) - p.pos.StepN(len(s)) - - return p.lexStart, nil -} - func (p *Parser) lexNewLine(r1 rune) { // r1 is warrantied to be either \n or \r r2, _, err := p.src.ReadRune() @@ -77,3 +76,24 @@ func (p *Parser) lexNewLine(r1 rune) { panic("unreachable") } } + +func (p *Parser) lexComment() (lexer.StateFn, error) { + // until the end of the line + p.src.AcceptAll(IsNotNewLine) + + err := p.OnComment(p.pos, p.src.Emit()) + return p.lexStart, err +} + +func (*Parser) lexSectionStart() (lexer.StateFn, error) { return nil, nil } +func (*Parser) lexEntryStart() (lexer.StateFn, error) { return nil, nil } + +func (p *Parser) lexToken() (lexer.StateFn, error) { + p.src.AcceptAll(IsNotSpace) + + s := p.src.Emit() + log.Printf("%s: %s: %q", p.pos, "token", s) + p.pos.StepN(len(s)) + + return p.lexStart, nil +} diff --git a/parser/lexer_error.go b/parser/lexer_error.go index 9eaa98b..afe6fab 100644 --- a/parser/lexer_error.go +++ b/parser/lexer_error.go @@ -13,3 +13,7 @@ func (p *Parser) emitError(content string, err error) (lexer.StateFn, error) { return nil, err } } + +func (p *Parser) emitInvalidRune(r rune) (lexer.StateFn, error) { + return p.emitError(string([]rune{r}), lexer.ErrUnacceptableRune) +} diff --git a/parser/lexer_runes.go b/parser/lexer_runes.go index 25d37d6..79f3b1a 100644 --- a/parser/lexer_runes.go +++ b/parser/lexer_runes.go @@ -11,4 +11,10 @@ var ( IsNotNewLine = lexer.NewIsNot(IsNewLine) // IsNotSpace tells if a rune is anything other than whitespace IsNotSpace = lexer.NewIsNot(IsSpace) + + IsCommentStart = lexer.NewIsIn(";#") ) + +func IsSectionStart(r rune) bool { + return r == '[' +}