Remove error handling for rune

This commit is contained in:
Thomas Pelletier
2021-02-01 20:25:31 -05:00
parent 2ab0f8c733
commit 7b4d82a939
+21 -55
View File
@@ -136,40 +136,24 @@ func (p *parser) expect(expected rune) error {
return nil return nil
} }
func (p *parser) peekRune() (rune, error) { func (p *parser) peekRune() rune {
if p.lookahead.empty() { if p.lookahead.empty() {
p.lookahead.r, p.lookahead.size = utf8.DecodeRune(p.data[p.end:]) p.lookahead.r, p.lookahead.size = utf8.DecodeRune(p.data[p.end:])
if p.lookahead.r == utf8.RuneError { if p.lookahead.r == utf8.RuneError && p.lookahead.size == 0 {
switch p.lookahead.size {
case 0:
p.lookahead.r = eof p.lookahead.r = eof
case 1:
p.lookahead.r = utf8.RuneError
return utf8.RuneError, &InvalidUnicodeError{r: p.lookahead.r}
default:
panic("unhandled rune error case")
} }
} }
} return p.lookahead.r
return p.lookahead.r, nil
} }
func (p *parser) nextRune() (rune, error) { func (p *parser) nextRune() rune {
r, err := p.peekRune() r := p.peekRune()
if err == nil { if r != eof {
p.end += p.lookahead.size p.end += p.lookahead.size
p.lookahead.r = 0 p.lookahead.r = 0
p.lookahead.size = 0 p.lookahead.size = 0
} }
return r, err return r
}
func (p *parser) sureNextRune() {
_, err := p.nextRune()
if err != nil {
panic(err)
}
} }
func (p *parser) ignore() { func (p *parser) ignore() {
@@ -189,10 +173,7 @@ func (p *parser) accept() []byte {
} }
func (p *parser) expectRune(expected rune) error { func (p *parser) expectRune(expected rune) error {
r, err := p.nextRune() r := p.nextRune()
if err != nil {
return err
}
if r != expected { if r != expected {
return &UnexpectedCharacter{ return &UnexpectedCharacter{
r: r, r: r,
@@ -520,20 +501,17 @@ func (p *parser) parseLiteralString() error {
p.ignore() p.ignore()
for { for {
r, err := p.peekRune() r := p.peekRune()
if err != nil {
return err
}
if r == '\'' { if r == '\'' {
p.builder.LiteralString(p.accept()) p.builder.LiteralString(p.accept())
p.sureNextRune() p.nextRune()
p.ignore() p.ignore()
return nil return nil
} }
if !isLiteralChar(r) { if !isLiteralChar(r) {
return &InvalidCharacter{r: r} return &InvalidCharacter{r: r}
} }
p.sureNextRune() p.nextRune()
} }
} }
@@ -573,36 +551,27 @@ func (p *parser) parseBasicString() error {
p.ignore() p.ignore()
for { for {
r, err := p.peekRune() r := p.peekRune()
if err != nil {
return err
}
if r == '"' { if r == '"' {
p.builder.BasicString(p.accept()) p.builder.BasicString(p.accept())
p.sureNextRune() p.nextRune()
p.ignore() p.ignore()
return nil return nil
} }
if r == '\\' { if r == '\\' {
p.sureNextRune() p.nextRune()
r, err := p.peekRune() r := p.peekRune()
if err != nil {
return err
}
if isEscapeChar(r) { if isEscapeChar(r) {
p.sureNextRune() p.nextRune()
continue continue
} }
if r == 'u' { if r == 'u' {
p.sureNextRune() p.nextRune()
for i := 0; i < 4; i++ { for i := 0; i < 4; i++ {
r, err := p.nextRune() r := p.nextRune()
if err != nil {
return err
}
if !isHex(r) { if !isHex(r) {
return &InvalidCharacter{r: r} return &InvalidCharacter{r: r}
} }
@@ -611,12 +580,9 @@ func (p *parser) parseBasicString() error {
} }
if r == 'U' { if r == 'U' {
p.sureNextRune() p.nextRune()
for i := 0; i < 8; i++ { for i := 0; i < 8; i++ {
r, err := p.nextRune() r := p.nextRune()
if err != nil {
return err
}
if !isHex(r) { if !isHex(r) {
return &InvalidCharacter{r: r} return &InvalidCharacter{r: r}
} }
@@ -628,7 +594,7 @@ func (p *parser) parseBasicString() error {
} }
if isBasicStringChar(r) { if isBasicStringChar(r) {
p.sureNextRune() p.nextRune()
continue continue
} }
} }