Fix Object
This commit is contained in:
		@@ -1,28 +1,41 @@
 | 
				
			|||||||
#include "object.hh"
 | 
					#include "object.hh"
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Object::Object(StringObjectType string_type, const std::string &value) : str{value} {
 | 
					std::ostream &operator<<(std::ostream &os, const ObjectType &type) {
 | 
				
			||||||
  switch (string_type) {
 | 
					  switch (type) {
 | 
				
			||||||
    case StringObjectType::IDENTIFIER:
 | 
					 | 
				
			||||||
      type = ObjectType::IDENTIFIER;
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
    case StringObjectType::LITERAL:
 | 
					 | 
				
			||||||
      type = ObjectType::STRING_LIT;
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
std::ostream &operator<<(std::ostream &os, const Object &obj) {
 | 
					 | 
				
			||||||
  switch (obj.type) {
 | 
					 | 
				
			||||||
    case ObjectType::NIL:
 | 
					    case ObjectType::NIL:
 | 
				
			||||||
 | 
					      os << "ObjectType::NIL";
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case ObjectType::IDENTIFIER:
 | 
					    case ObjectType::IDENTIFIER:
 | 
				
			||||||
 | 
					      os << "ObjectType::IDENTIFIER";
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
    case ObjectType::STRING_LIT:
 | 
					    case ObjectType::STRING_LIT:
 | 
				
			||||||
      os << obj.str;
 | 
					      os << "ObjectType::STRING_LIT";
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case ObjectType::NUMBER:
 | 
					    case ObjectType::NUMBER:
 | 
				
			||||||
      os << obj.number;
 | 
					      os << "ObjectType::NUMBER";
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return os;
 | 
					  return os;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::ostream &operator<<(std::ostream &os, const Object &obj) {
 | 
				
			||||||
 | 
					  os << "Object(" << obj.type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  switch (obj.type) {
 | 
				
			||||||
 | 
					    case ObjectType::NIL:
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case ObjectType::IDENTIFIER:
 | 
				
			||||||
 | 
					    case ObjectType::STRING_LIT:
 | 
				
			||||||
 | 
					      os << ", " << std::get<std::string>(obj.value);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    case ObjectType::NUMBER:
 | 
				
			||||||
 | 
					      os << ", " << std::get<double>(obj.value);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  os << ')';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return os;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <cstdint>
 | 
					#include <cstdint>
 | 
				
			||||||
#include <iostream>
 | 
					#include <iostream>
 | 
				
			||||||
#include <string_view>
 | 
					#include <variant>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum class StringObjectType : uint8_t {
 | 
					enum class StringObjectType : uint8_t {
 | 
				
			||||||
  IDENTIFIER,
 | 
					  IDENTIFIER,
 | 
				
			||||||
@@ -17,15 +17,15 @@ enum class ObjectType : uint8_t {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct Object {
 | 
					struct Object {
 | 
				
			||||||
  Object() : type{ObjectType::NIL} {};
 | 
					  Object() : type{ObjectType::NIL}, value{std::monostate{}} {};
 | 
				
			||||||
  Object(double number) : type{ObjectType::NUMBER}, number{number} {};
 | 
					  Object(double number) : type{ObjectType::NUMBER}, value{number} {};
 | 
				
			||||||
  Object(StringObjectType string_type, const std::string &value);
 | 
					  Object(StringObjectType string_type, std::string value)
 | 
				
			||||||
 | 
					    : type{string_type == StringObjectType::IDENTIFIER ? ObjectType::IDENTIFIER : ObjectType::STRING_LIT},
 | 
				
			||||||
 | 
					      value{std::move(value)} {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ObjectType type;
 | 
					  ObjectType type;
 | 
				
			||||||
  union {
 | 
					  std::variant<std::monostate, std::string, double> value;
 | 
				
			||||||
    std::string_view str;
 | 
					 | 
				
			||||||
    double number;
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::ostream &operator<<(std::ostream &os, const ObjectType &type);
 | 
				
			||||||
std::ostream &operator<<(std::ostream &os, const Object &obj);
 | 
					std::ostream &operator<<(std::ostream &os, const Object &obj);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -116,6 +116,8 @@ void Scanner::string() {
 | 
				
			|||||||
  advance();
 | 
					  advance();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Trim the surrounding quotes.
 | 
					  // Trim the surrounding quotes.
 | 
				
			||||||
  std::string value = code.substr(start + 1, current - 1);
 | 
					  size_t no_quote_start = start + 1;
 | 
				
			||||||
 | 
					  size_t no_quote_end = current - 1;
 | 
				
			||||||
 | 
					  std::string value = code.substr(no_quote_start, no_quote_end - no_quote_start);
 | 
				
			||||||
  add_token(TokenType::STRING, Object(StringObjectType::LITERAL, value));
 | 
					  add_token(TokenType::STRING, Object(StringObjectType::LITERAL, value));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,7 @@
 | 
				
			|||||||
#include "object.hh"
 | 
					#include "object.hh"
 | 
				
			||||||
#include <cstdint>
 | 
					#include <cstdint>
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
#include <string_view>
 | 
					#include <utility>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum class TokenType : uint8_t {
 | 
					enum class TokenType : uint8_t {
 | 
				
			||||||
  // Single-character tokens.
 | 
					  // Single-character tokens.
 | 
				
			||||||
@@ -27,12 +27,12 @@ enum class TokenType : uint8_t {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct Token {
 | 
					struct Token {
 | 
				
			||||||
  Token(TokenType type, const std::string &lexeme, Object literal, int line)
 | 
					  Token(TokenType type, std::string lexeme, Object literal, int line)
 | 
				
			||||||
    : type{type}, lexeme{lexeme}, literal{literal}, line{line}
 | 
					    : type{type}, lexeme{std::move(lexeme)}, literal{literal}, line{line}
 | 
				
			||||||
  {};
 | 
					  {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  TokenType type;
 | 
					  TokenType type;
 | 
				
			||||||
  std::string_view lexeme;
 | 
					  std::string lexeme;
 | 
				
			||||||
  Object literal;
 | 
					  Object literal;
 | 
				
			||||||
  int line;
 | 
					  int line;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user