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