// JsonToken — 簡易版（現在のNyash制限内で動作）
// 責務: JSONトークンの基本構造

// 🌟 JSONトークン（Everything is Box）
box JsonToken {
    type: StringBox        // トークンタイプ
    value: StringBox       // トークンの値
    start: IntegerBox      // 開始位置
    end: IntegerBox        // 終了位置
    
    birth(token_type, token_value, start_pos, end_pos) {
        me.type = token_type
        me.value = token_value
        me.start = start_pos
        me.end = end_pos
    }
    
    // ===== アクセッサーメソッド =====
    
    get_type() { return me.type }
    get_value() { return me.value }
    get_start() { return me.start }
    get_end() { return me.end }
    
    // ===== 判定メソッド（簡易版） =====
    
    is_literal() {
        return me.type == "NULL" or me.type == "TRUE" or me.type == "FALSE" or me.type == "NUMBER" or me.type == "STRING"
    }
    
    is_structural() {
        return me.type == "LBRACE" or me.type == "RBRACE" or me.type == "LBRACKET" or me.type == "RBRACKET" or me.type == "COMMA" or me.type == "COLON"
    }
    
    is_error() {
        return me.type == "ERROR"
    }
    
    is_eof() {
        return me.type == "EOF"
    }
    
    // ===== デバッグ用メソッド =====
    
    to_string() {
        return me.type + "(" + me.value + ") at " + me.start + "-" + me.end
    }
}

// 🏭 トークンファクトリー（簡易版）
static box TokenFactory {
    
    // リテラル値トークン
    create_null(start, end) {
        return new JsonToken("NULL", "null", start, end)
    }
    
    create_true(start, end) {
        return new JsonToken("TRUE", "true", start, end)
    }
    
    create_false(start, end) {
        return new JsonToken("FALSE", "false", start, end)
    }
    
    create_number(value, start, end) {
        return new JsonToken("NUMBER", value, start, end)
    }
    
    create_string(value, start, end) {
        return new JsonToken("STRING", value, start, end)
    }
    
    // 構造文字トークン
    create_lbrace(start) {
        return new JsonToken("LBRACE", "{", start, start + 1)
    }
    
    create_rbrace(start) {
        return new JsonToken("RBRACE", "}", start, start + 1)
    }
    
    create_lbracket(start) {
        return new JsonToken("LBRACKET", "[", start, start + 1)
    }
    
    create_rbracket(start) {
        return new JsonToken("RBRACKET", "]", start, start + 1)
    }
    
    create_comma(start) {
        return new JsonToken("COMMA", ",", start, start + 1)
    }
    
    create_colon(start) {
        return new JsonToken("COLON", ":", start, start + 1)
    }
    
    // 制御トークン
    create_eof(pos) {
        return new JsonToken("EOF", "", pos, pos)
    }
    
    create_error(message, start, end) {
        return new JsonToken("ERROR", message, start, end)
    }
    
    // ===== 文字からトークンタイプを判定 =====
    
    char_to_token_type(ch) {
        if ch == "{" { return "LBRACE" }
        if ch == "}" { return "RBRACE" }
        if ch == "[" { return "LBRACKET" }
        if ch == "]" { return "RBRACKET" }
        if ch == "," { return "COMMA" }
        if ch == ":" { return "COLON" }
        return null
    }
    
    // 文字が構造文字かどうか判定
    is_structural_char(ch) {
        return ch == "{" or ch == "}" or ch == "[" or ch == "]" or ch == "," or ch == ":"
    }
    
    // 文字が空白かどうか判定
    is_whitespace_char(ch) {
        return ch == " " or ch == "\t" or ch == "\n" or ch == "\r"
    }
    
    // 文字が数値の開始文字かどうか判定
    is_number_start_char(ch) {
        return ch == "-" or (ch >= "0" and ch <= "9")
    }
    
    // キーワードからトークンタイプを判定
    keyword_to_token_type(keyword) {
        if keyword == "null" { return "NULL" }
        if keyword == "true" { return "TRUE" }
        if keyword == "false" { return "FALSE" }
        return null
    }
}