5.1 KiB
module textscanner
Contents
new
fn new(input string) TextScanner
new returns a stack allocated instance of TextScanner.
TextScanner
struct TextScanner {
pub:
input string
ilen int
pub mut:
pos int // current position; pos is *always* kept in [0,ilen]
}
TextScanner simplifies writing small scanners/parsers. It helps by providing safe methods to scan texts character by character, peek for the next characters, go back, etc.
free
fn (mut ss TextScanner) free()
free frees all allocated resources.
remaining
fn (ss &TextScanner) remaining() int
remaining returns how many characters remain from current position.
next
fn (mut ss TextScanner) next() int
next returns the next character code from the input text. next returns -1 if it can't reach the next character. next advances the scanner position.
skip
fn (mut ss TextScanner) skip()
skip skips one character ahead; skip() is slightly faster than .next(). skip() does not return a result.
skip_n
fn (mut ss TextScanner) skip_n(n int)
skip_n skips ahead n characters, stopping at the end of the input.
peek
fn (ss &TextScanner) peek() int
peek returns the next character code from the input text. peek returns -1 if it can't peek the next character. unlike next(), peek() does not change the state of the scanner.
peek_u8
fn (ss &TextScanner) peek_u8() u8
peek_u8 returns the next character code from the input text, as a byte/u8. unlike next(), peek_u8() does not change the state of the scanner.
Note: peek_u8 returns 0, if it can't peek the next character.
Note: use peek(), instead of peek_u8(), if your input itself can legitimately contain bytes with value 0.
peek_n
fn (ss &TextScanner) peek_n(n int) int
peek_n returns the character code from the input text at position + n. peek_n returns -1 if it can't peek n characters ahead. ts.peek_n(0) == ts.current() . ts.peek_n(1) == ts.peek() .
peek_n_u8
fn (ss &TextScanner) peek_n_u8(n int) u8
peek_n_u8 returns the character code from the input text, at position + n, as a byte/u8.
Note: peek_n_u8 returns 0, if it can't peek the next character.
Note: use peek_n(), instead of peek_n_u8(), if your input itself can legitimately contain bytes with value 0.
back
fn (mut ss TextScanner) back()
back goes back one character from the current scanner position.
back_n
fn (mut ss TextScanner) back_n(n int)
back_n goes back n characters from the current scanner position.
peek_back
fn (ss &TextScanner) peek_back() int
peek_back returns the previous character code from the input text. peek_back returns -1 if it can't peek the previous character. unlike back(), peek_back() does not change the state of the scanner.
peek_back_n
fn (ss &TextScanner) peek_back_n(n int) int
peek_back_n returns the character code from the input text at position - n. peek_back_n returns -1 if it can't peek n characters back. ts.peek_back_n(0) == ts.current() ts.peek_back_n(1) == ts.peek_back()
current
fn (mut ss TextScanner) current() int
current returns the current character code from the input text. current returns -1 at the start of the input text.
Note: after c := ts.next(), ts.current() will also return c.
reset
fn (mut ss TextScanner) reset()
reset resets the internal state of the scanner. After calling .reset(), .next() will start reading again from the start of the input text.
goto_end
fn (mut ss TextScanner) goto_end()
goto_end has the same effect as for ts.next() != -1 {}. i.e. after calling .goto_end(), the scanner will be at the end of the input text. Further .next() calls will return -1, unless you go back.
skip_whitespace
fn (mut ss TextScanner) skip_whitespace()
skip_whitespace advances the scanner pass any space characters in the input.