func (l *lexer) next() bool {
	var val []rune
	var comment, quoted, btQuoted, escaped bool
	makeToken := func() bool {
		l.token.Text = string(val)
		return true
	}
	for {
		ch, _, err := l.reader.ReadRune()
		if err != nil {
			if len(val) > 0 {
				return makeToken()
			}
			if err == io.EOF {
				return false
			}
			panic(err)
		}
		if !escaped && !btQuoted && ch == '\\' {
			escaped = true
			continue
		}
		if quoted || btQuoted {
			if quoted && escaped {
				if ch != '"' {
					val = append(val, '\\')
				}
				escaped = false
			} else {
				if quoted && ch == '"' {
					return makeToken()
				}
				if btQuoted && ch == '`' {
					return makeToken()
				}
			}
			if ch == '\n' {
				l.line += 1 + l.skippedLines
				l.skippedLines = 0
			}
			val = append(val, ch)
			continue
		}
		if unicode.IsSpace(ch) {
			if ch == '\r' {
				continue
			}
			if ch == '\n' {
				if escaped {
					l.skippedLines++
					escaped = false
				} else {
					l.line += 1 + l.skippedLines
					l.skippedLines = 0
				}
				comment = false
			}
			if len(val) > 0 {
				return makeToken()
			}
			continue
		}
		if ch == '#' && len(val) == 0 {
			comment = true
		}
		if comment {
			continue
		}
		if len(val) == 0 {
			l.token = Token{Line: l.line}
			if ch == '"' {
				quoted = true
				continue
			}
			if ch == '`' {
				btQuoted = true
				continue
			}
		}
		if escaped {
			val = append(val, '\\')
			escaped = false
		}
		val = append(val, ch)
	}
}
next loads the next token into the lexer.
A token is delimited by whitespace, unless
the token starts with a quotes character (")
in which case the token goes until the closing
quotes (the enclosing quotes are not included).
Inside quoted strings, quotes may be escaped
with a preceding \ character. No other chars
may be escaped. The rest of the line is skipped
if a "#" character is read in. Returns true if
a token was loaded; false otherwise.
package caddyfile
import (
	"bufio"
	"bytes"
	"io"
	"unicode"
)
type (
	lexer struct {
		reader       *bufio.Reader
		token        Token
		line         int
		skippedLines int
	}
	Token struct {
		File        string
		Line        int
		Text        string
		inSnippet   bool
		snippetName string
	}
)
func (l *lexer) load(input io.Reader) error {
	l.reader = bufio.NewReader(input)
	l.line = 1
	firstCh, _, err := l.reader.ReadRune()
	if err != nil {
		return err
	}
	if firstCh != 0xFEFF {
		err := l.reader.UnreadRune()
		if err != nil {
			return err
		}
	}
	return nil
}