private void itsString() { while (peek() != '"' && !isAtEnd()) { if (peek() == '\n') { line++; } advance(); } if (isAtEnd()) { Slan.error(line, "Unterminated string."); return; } advance(); String value = source.Substring(start + 1, (current - start) - 1); addToken(TokenType.STRING, value); }
private void scanToken() { char c = advance(); switch (c) { case '(': addToken(TokenType.LEFT_PAREN); break; case ')': addToken(TokenType.RIGHT_PAREN); break; case '{': addToken(TokenType.LEFT_BRACE); break; case '}': addToken(TokenType.RIGHT_BRACE); break; case ',': addToken(TokenType.COMMA); break; case '.': addToken(TokenType.DOT); break; case '-': addToken(TokenType.MINUS); break; case '+': addToken(TokenType.PLUS); break; case ';': addToken(TokenType.SEMICOLON); break; case '*': addToken(TokenType.STAR); break; case '!': addToken(match('=') ? TokenType.BANG_EQUAL : TokenType.BANG); break; case '=': addToken(match('=') ? TokenType.EQUAL_EQUAL : TokenType.EQUAL); break; case '<': addToken(match('=') ? TokenType.LESS_EQUAL : TokenType.LESS); break; case '>': addToken(match('=') ? TokenType.GREATER_EQUAL : TokenType.GREATER); break; case '/': if (match('/')) { while (peek() != '\n' && !isAtEnd()) { advance(); } } else { addToken(TokenType.SLASH); } break; case ' ': case '\r': case '\t': break; case '\n': line++; break; case '"': itsString(); break; case 'o': if (peek() == 'r') { addToken(TokenType.OR); } break; default: if (isDigit(c)) { number(); } else if (isAlpha(c)) { identifier(); } else { Slan.error(line, "Unexpected character."); } break; } }