1 package parser 2 3 import ( 4 "io" 5 "unicode/utf8" 6 ) 7 8 type runeSourceParser struct { 9 source io.RuneReader 10 buf []rune 11 pos int 12 stateNum int 13 } 14 15 func (r *runeSourceParser) next() rune { 16 if r.pos < len(r.buf) { 17 ru := r.buf[r.pos] 18 r.pos++ 19 20 return ru 21 } 22 23 ru, _, err := r.source.ReadRune() 24 if err != nil { 25 ru = -1 26 } 27 28 r.buf = append(r.buf, ru) 29 r.pos++ 30 31 return ru 32 } 33 34 func (r *runeSourceParser) backup() { 35 if r.pos > 0 { 36 r.pos-- 37 } 38 } 39 40 func (r *runeSourceParser) get() string { 41 s := string(r.buf[:r.pos]) 42 r.buf = r.buf[r.pos:] 43 r.pos = 0 44 r.stateNum++ 45 46 return s 47 } 48 49 func (r *runeSourceParser) length() int { 50 var l int 51 52 for _, r := range r.buf[:r.pos] { 53 if r != -1 { 54 l += utf8.RuneLen(r) 55 } 56 } 57 58 return l 59 } 60 61 func (r *runeSourceParser) reset() { 62 r.pos = 0 63 } 64 65 func (r *runeSourceParser) sub() tokeniser { 66 return &sub{ 67 tokeniser: r, 68 tState: r.stateNum, 69 start: r.pos, 70 } 71 } 72 73 func (r *runeSourceParser) slice(state, start int) (string, int) { 74 if r.stateNum != state || start > r.pos { 75 return "", -1 76 } 77 78 return string(r.buf[start:r.pos]), r.pos 79 } 80 81 type runeState struct { 82 r *runeSourceParser 83 stateNum int 84 pos int 85 } 86 87 func (r *runeSourceParser) state() State { 88 return &runeState{ 89 r: r, 90 stateNum: r.stateNum, 91 pos: r.pos, 92 } 93 } 94 95 func (r *runeState) Reset() bool { 96 if r.r.stateNum != r.stateNum { 97 return false 98 } 99 100 r.r.pos = r.pos 101 102 return true 103 } 104