func (l *Lexer) readNumber() { for util.IsDigit(l.peek()) { l.read() } l.emitToken(TokenNumber) }
// ret = success? func (l *Lexer) getToken() bool { switch chr := l.read(); chr { case '+': l.emitToken(TokenAdd) case '-': if l.accept('>') { l.emitToken(TokenArrow) } else { l.emitToken(TokenSub) } case '/': l.emitToken(TokenDiv) case '*': l.emitToken(TokenMul) case '%': l.emitToken(TokenMod) case '!': if l.accept('=') { l.emitToken(TokenNE) } else { l.emitToken(TokenBang) } case '|': l.emitToken(TokenPipe) case '.': l.emitToken(TokenDot) case ',': l.emitToken(TokenComma) case ':': if l.accept(':') { l.emitToken(TokenModSep) } else { l.emitToken(TokenColon) } case '>': if l.accept('=') { l.emitToken(TokenGTE) } else { l.emitToken(TokenGT) } case '<': if l.accept('=') { l.emitToken(TokenLTE) } else { l.emitToken(TokenLT) } case '=': if l.accept('=') { l.emitToken(TokenEQ) } else { l.emitToken(TokenAssign) } case '[': l.emitToken(TokenLBracket) case ']': l.emitToken(TokenRBracket) case '(': l.emitToken(TokenLParen) case ')': l.emitToken(TokenRParen) case '"': l.readString() case ' ', '\n', '\r', '\t': l.start++ break default: if util.IsIdentStart(chr) { l.readIdent() } else if util.IsDigit(chr) { l.readNumber() } else { err := fmt.Sprintf("Unexpected character: '%c'", chr) l.emitError(err) return false } } return true }