package main import ( "unicode/utf8" ) const eof rune = -1 type RuneReader struct { input string pos, width int } func (l *RuneReader) next() rune { if l.pos >= len(l.input) { l.width = 0 return eof } var r rune r, l.width = utf8.DecodeRuneInString(l.input[l.pos:]) l.pos += l.width return r } func (l *RuneReader) accept(chars string) bool { r := l.next() for _, char := range chars { if char == r { return true } } l.rewind() return false } func (l *RuneReader) rewind() { l.pos -= l.width }