アットウィキロゴ
package service;

public class Script {

public static final char PROTO_FIELD_ID = (char) 0;
public static final char SUPER_PROTO_TOKEN_ID = (char) 4;
private boolean debug;
private String[] tokens = new String[256];
private String[] fields = new String[256];

/**
 * @param args
 */
public static void main(String[] args) {
	new Script(true);
}

public Script(boolean debug) {
	this.debug = debug;

	createTokens();

	setField("パレット", "赤", 'b');
	int field = findField((char) 5, (char) 0x0103);
	System.out.println(field);
}

public void parse() {

}

// ======================================================//
// 直接操作用ユーティリティ
// ======================================================//
private void createTokens() {
	tokens[0] = "親";
	tokens[1] = "実行";
	tokens[2] = "代入";
	tokens[3] = "数";
	tokens[4] = "元";
	tokens[5] = "パレット";
	tokens[6] = "赤";
	tokens[7] = "青";
	tokens[8] = "緑";
	tokens[9] = "透明";

	// 全ての親オブジェクトを設定
	fields[4] = new String(new char[] { 0x0000, 0x0101, 0x0000, 0x0102,
			0x0000, 0x0103, 0x0001 });
}

/**
 * あるオブジェクトにフィールドを設定する。オブジェクトフィールドがない場合は新規作成する。
 * @param token オブジェクト名
 * @param field 設定するフィールド
 * @param value そのフィールドに設定する値
 */
private void setField(String token, String field, char value) {
	int tokenId = -1;
	int fieldId = -1;
	for (int i = 0; i < tokens.length; i++) {
		if (tokens[i] == null) {
			continue;
		}
		if (tokens[i].equals(token)) {
			// トークン発見
			tokenId = i;
		}
		if (tokens[i].equals(field)) {
			// フィールドId発見
			fieldId = i;
		}
		if (tokenId >= 0 && fieldId >= 0) {
			StringBuffer buffer;
			if (fields[tokenId] == null) {
				// オブジェクトフィールドが設定されていない場合
				buffer = new StringBuffer();
				buffer.append((char) SUPER_PROTO_TOKEN_ID);
			} else {
				buffer = new StringBuffer(token);
			}
			int index = findPrivateFieldIndex(token, (char) fieldId);
			if (index < 0) {
				// フィールドが見つからない場合
				buffer.append((char) fieldId);
				buffer.append(value);
			} else {
				// フィールドが見つかった場合
				buffer.setCharAt(index, value);
			}
			fields[tokenId] = buffer.toString();
			return;
		}
	}
}

private int findField(char tokenId, char fieldId){
	String field = fields[tokenId];
	if(field == null){
		// フィールドが登録されていない
		return -2;
	}
	if(field.equals("")){
		// フィールドが空文字
		return -3;
	}

	int fieldPriv = findPrivateFieldIndex(field, fieldId);
	if(fieldPriv < 0){
		// フィールドが見つからない場合は、親を検索
		int protoIndex = findPrivateFieldIndex(field, PROTO_FIELD_ID);
		char proto = field.charAt(protoIndex);

		if(proto == (char) 0){
			// もうさかのぼる親がいない == 該当トークンはない
			return -1;
		}

		return findField(proto, fieldId);
	}

	return field.charAt(fieldPriv);
}

private int findPrivateFieldIndex(String field, char fieldId) {
	char[] records = field.toCharArray();
	// 「親」フィールドは最初の1レコード
	if (fieldId == PROTO_FIELD_ID) {
		return 0;
	} else {
		for (int i = 1; i < records.length; i += 2) {
			if (records[i] == fieldId) {
				if(debug){
					System.out.println("field index = " + i + " value index = " + (i + 1));
				}
				return i + 1;
			}
		}
	}
	return -1;
}

}
最終更新:2010年09月15日 16:55