示例#1
0
文件: lexer.go 项目: ibex-lang/ibex
func (l *Lexer) readNumber() {
	for util.IsDigit(l.peek()) {
		l.read()
	}
	l.emitToken(TokenNumber)
}
示例#2
0
文件: lexer.go 项目: ibex-lang/ibex
// 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
}