<- Back to shtanton's homepage
aboutsummaryrefslogtreecommitdiff
path: root/subex/lex.go
diff options
context:
space:
mode:
authorCharlie Stanton <charlie@shtanton.xyz>2023-02-19 08:59:16 +0000
committerCharlie Stanton <charlie@shtanton.xyz>2023-02-19 08:59:16 +0000
commitfba426b3910f16c8abc6f819da3138f03e5f0b1a (patch)
tree9ce7473194a7ac4d97278cff3e95e58fd3277c72 /subex/lex.go
parent3636825c64bb6c172b0858d7a08c30acfcd68bdd (diff)
downloadstred-go-fba426b3910f16c8abc6f819da3138f03e5f0b1a.tar
Introduces subex processing
Doesn't integrate it at all yet
Diffstat (limited to 'subex/lex.go')
-rw-r--r--subex/lex.go34
1 files changed, 34 insertions, 0 deletions
diff --git a/subex/lex.go b/subex/lex.go
new file mode 100644
index 0000000..f020b23
--- /dev/null
+++ b/subex/lex.go
@@ -0,0 +1,34 @@
+package subex
+
+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
+}