diff options
| -rw-r--r-- | parser.go | 26 |
1 files changed, 20 insertions, 6 deletions
@@ -66,10 +66,21 @@ func (p *Parser) Warning(msg string) { log.Printf("%s:%d:%d warning: %s", p.fname, p.lineno, p.colno, msg) } +func (p *Parser) readUnsafe() rune { + ch, _, _ := p.ReadRune() + if ch == '\n' { + p.lineno += 1 + p.colno = 0 + } + p.colno += 1 + p.lastread = ch + return ch +} + func (p *Parser) read() rune { ch, _, err := p.ReadRune() if err == io.EOF { - return eof + panic(err) } if ch == '\n' { p.lineno += 1 @@ -400,9 +411,14 @@ func (p *Parser) readDeclaration() error { } func (p *Parser) Parse(strict bool) error { - var ch rune - for { - ch = p.read() + + defer func() { + if r := recover(); r != nil { + p.Warning("Reached end of file while parsing.") + } + }() + + for ch := p.readUnsafe(); ch != eof; ch = p.readUnsafe() { if ch == '@' { p.eatSpace() err := p.readDeclaration() @@ -418,8 +434,6 @@ func (p *Parser) Parse(strict bool) error { return err } } - } else if ch == eof { - break } } return nil |
