diff --git a/parse.go b/parse.go index 4d9619a..2c3a27c 100644 --- a/parse.go +++ b/parse.go @@ -15,9 +15,10 @@ func (e *errParse) Error() string { } type parser struct { - ast ast - l *lexer - tok token + ast ast + l *lexer + tok token + prev *token } func newParser(data []byte) *parser { @@ -29,7 +30,16 @@ func newParser(data []byte) *parser { } func (p *parser) nextToken() { - p.tok = p.l.nextToken() + if p.prev != nil { + p.tok = *p.prev + p.prev = nil + } else { + p.tok = p.l.nextToken() + } +} + +func (p *parser) backup() { + p.prev = &p.tok } func (p *parser) parse() error { @@ -49,6 +59,7 @@ func (p *parser) parse() error { return err } p.ast.addSection(sec) + p.backup() case tokenKey: prop := newProperty(p.tok.val) if err := p.parseProperty(&prop); err != nil { @@ -82,12 +93,6 @@ func (p *parser) parseSection(out *section) error { return err } out.addProperty(prop) - case tokenSection: - sec := newSection(p.tok.val) - if err := p.parseSection(&sec); err != nil { - return err - } - p.ast.addSection(sec) default: return nil } diff --git a/parse_test.go b/parse_test.go index 43b8b1b..476956b 100644 --- a/parse_test.go +++ b/parse_test.go @@ -12,7 +12,7 @@ func TestParse(t *testing.T) { want ast }{ { - input: "version=1.2.3\n\n[user]\nname=root\nshell=/bin/bash", + input: "version=1.2.3\n\n[user]\nname=root\nshell=/bin/bash\n\n[user]\nname=admin\nshell=/bin/bash", want: ast{ "": []section{ section{ @@ -39,6 +39,19 @@ func TestParse(t *testing.T) { }, }, }, + section{ + name: "user", + props: map[string]property{ + "name": property{ + key: "name", + val: []string{"admin"}, + }, + "shell": property{ + key: "shell", + val: []string{"/bin/bash"}, + }, + }, + }, }, }, },