Handle more operators
This commit is contained in:
		@@ -33,6 +33,38 @@ void Scanner::scan_token() {
 | 
				
			|||||||
    case '+': add_token(TokenType::PLUS); break;
 | 
					    case '+': add_token(TokenType::PLUS); break;
 | 
				
			||||||
    case ';': add_token(TokenType::SEMICOLON); break;
 | 
					    case ';': add_token(TokenType::SEMICOLON); break;
 | 
				
			||||||
    case '*': add_token(TokenType::STAR); break;
 | 
					    case '*': add_token(TokenType::STAR); break;
 | 
				
			||||||
 | 
					    case '!':
 | 
				
			||||||
 | 
					      add_token(match('=') ? TokenType::BANG_EQUAL : TokenType::BANG);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case '=':
 | 
				
			||||||
 | 
					      add_token(match('=') ? TokenType::EQUAL_EQUAL : TokenType::EQUAL);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case '<':
 | 
				
			||||||
 | 
					      add_token(match('=') ? TokenType::LESS_EQUAL : TokenType::LESS);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case '>':
 | 
				
			||||||
 | 
					      add_token(match('=') ? TokenType::GREATER_EQUAL : TokenType::GREATER);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case '/':
 | 
				
			||||||
 | 
					      if (match('/')) {
 | 
				
			||||||
 | 
					        while (peek() != '\n' && !is_at_end()) {
 | 
				
			||||||
 | 
					          advance();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        add_token(TokenType::SLASH);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case ' ':
 | 
				
			||||||
 | 
					    case '\r':
 | 
				
			||||||
 | 
					    case '\t':
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case '\n':
 | 
				
			||||||
 | 
					      ++line;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case '"':
 | 
				
			||||||
 | 
					      string();
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
      error_handler.error(line, "Unexpected character.");
 | 
					      error_handler.error(line, "Unexpected character.");
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
@@ -43,6 +75,23 @@ char Scanner::advance() {
 | 
				
			|||||||
  return code.at(current++);
 | 
					  return code.at(current++);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Scanner::match(char expected) {
 | 
				
			||||||
 | 
					  if (is_at_end() || peek() != expected) {
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  current++;
 | 
				
			||||||
 | 
					  return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char Scanner::peek() {
 | 
				
			||||||
 | 
					  if (is_at_end()) {
 | 
				
			||||||
 | 
					    return '\0';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return code.at(current);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Scanner::add_token(TokenType type) {
 | 
					void Scanner::add_token(TokenType type) {
 | 
				
			||||||
  add_token(type, Object{});
 | 
					  add_token(type, Object{});
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -51,3 +100,22 @@ void Scanner::add_token(TokenType type, Object literal) {
 | 
				
			|||||||
  std::string text = code.substr(start, current - start);
 | 
					  std::string text = code.substr(start, current - start);
 | 
				
			||||||
  tokens.push_back(Token(type, text, literal, line));
 | 
					  tokens.push_back(Token(type, text, literal, line));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Scanner::string() {
 | 
				
			||||||
 | 
					  while (peek() != '"' && !is_at_end()) {
 | 
				
			||||||
 | 
					    if (peek() == '\n') line++;
 | 
				
			||||||
 | 
					    advance();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (is_at_end()) {
 | 
				
			||||||
 | 
					    error_handler.error(line, "Unterminated string.");
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // The closing ".
 | 
				
			||||||
 | 
					  advance();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Trim the surrounding quotes.
 | 
				
			||||||
 | 
					  std::string value = code.substr(start + 1, current - 1);
 | 
				
			||||||
 | 
					  add_token(TokenType::STRING, Object(StringObjectType::LITERAL, value));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,8 +10,11 @@ struct Scanner {
 | 
				
			|||||||
  bool is_at_end();
 | 
					  bool is_at_end();
 | 
				
			||||||
  void scan_token();
 | 
					  void scan_token();
 | 
				
			||||||
  char advance();
 | 
					  char advance();
 | 
				
			||||||
 | 
					  bool match(char expected);
 | 
				
			||||||
 | 
					  char peek();
 | 
				
			||||||
  void add_token(TokenType type);
 | 
					  void add_token(TokenType type);
 | 
				
			||||||
  void add_token(TokenType type, Object literal);
 | 
					  void add_token(TokenType type, Object literal);
 | 
				
			||||||
 | 
						void string();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  std::string code;
 | 
					  std::string code;
 | 
				
			||||||
  std::vector<Token> tokens;
 | 
					  std::vector<Token> tokens;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user