func (l *GutsLex) last() (r rune) {
	_, w := utf8.DecodeRuneInString(l.Input[l.Pos-l.width:])
	r, _ = utf8.DecodeRuneInString(l.Input[l.Pos-l.width-w:])
	return r
}
get the last rune in the input
package gutscript
import (
	"fmt"
	"strings"
	"unicode/utf8"
)
type stateFn func(*GutsLex) stateFn
type GutsLex struct {
	Input       string
	Line        int
	Start       int
	Pos         int
	IndentLevel int
	state       stateFn
	rollbackPos int
	space     int
	lastSpace int
	lastTokenType TokenType
	width int
	Items chan *GutsSymType
}
type TokenType int
const eof = -1
const lexError = -99
func (l *GutsLex) remember() int {
	l.rollbackPos = l.Pos
	return l.Pos
}
func (l *GutsLex) rollback() {
	l.Pos = l.rollbackPos
}
func (l *GutsLex) error(msg string) {
	fmt.Println("Syntax Error", msg)
	fmt.Println("Line", l.Line)
	fmt.Println("Pos", l.Pos)
	fmt.Println("Input", l.Input)
}
func (l *GutsLex) emit(t TokenType) {
	l.lastTokenType = t
	l.Items <- &GutsSymType{
		typ:  t,
		val:  l.Input[l.Start:l.Pos],
		pos:  l.Start,
		line: l.Line,
	}
	l.Start = l.Pos
}
func (l *GutsLex) peek() (r rune) {
	r = l.next()
	l.backup()
	return r
}
func (l *GutsLex) peekMore(p int) (r rune) {
	var w = 0
	for i := p; i > 0; i-- {
		r = l.next()
		w += l.width
	}
	l.Pos -= w
	return r
}
func (l *GutsLex) ignore() {
	l.Start = l.Pos
}
func (l *GutsLex) accept(valid string) bool {
	if strings.IndexRune(valid, l.next()) >= 0 {
		return true
	}
	l.backup()
	return false
}
func (l *GutsLex) backup() {
	l.Pos -= l.width
}
func (l *GutsLex) next() (r rune) {
	if l.Pos >= len(l.Input) {
		l.width = 0
		return eof
	}
	r, l.width = utf8.DecodeRuneInString(l.Input[l.Pos:])
	l.Pos += l.width
	return r
}