use of priv.bajdcc.LALR1.grammar.runtime.IRuntimeDebugExec in project jMiniLang by bajdcc.
the class ModuleBase method getCodePage.
@Override
public RuntimeCodePage getCodePage() throws Exception {
if (runtimeCodePage != null)
return runtimeCodePage;
String base = ResourceLoader.load(getClass());
Grammar grammar = new Grammar(base);
RuntimeCodePage page = grammar.getCodePage();
IRuntimeDebugInfo info = page.getInfo();
info.addExternalValue("g_null", () -> new RuntimeObject(null));
final BigInteger MINUS_ONE = new BigInteger("-1");
info.addExternalValue("g_minus_1", () -> new RuntimeObject(MINUS_ONE));
info.addExternalValue("g_true", () -> new RuntimeObject(true));
info.addExternalValue("g_false", () -> new RuntimeObject(false));
final String NEWLINE = System.lineSeparator();
info.addExternalValue("g_endl", () -> new RuntimeObject(NEWLINE));
info.addExternalValue("g_nullptr", () -> new RuntimeObject(-1));
info.addExternalFunc("g_is_null", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "判断是否为空";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(args.get(0).getObj() == null);
}
});
info.addExternalFunc("g_is_valid_handle", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "判断句柄合法";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kPtr };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(((int) args.get(0).getObj()) >= 0);
}
});
info.addExternalFunc("g_set_flag", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "设置对象属性";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject, RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
BigInteger flag = (BigInteger) args.get(1).getObj();
args.get(0).setFlag(flag.longValue());
return args.get(0);
}
});
info.addExternalFunc("g_get_flag", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "获取对象属性";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(BigInteger.valueOf(args.get(0).getFlag()));
}
});
info.addExternalFunc("g_is_flag", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "判断对象属性";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject, RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
BigInteger flag = (BigInteger) args.get(1).getObj();
return new RuntimeObject(args.get(0).getFlag() == flag.longValue());
}
});
info.addExternalFunc("g_set_debug", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "输出调试信息";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kBool };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
boolean debug = (boolean) args.get(0).getObj();
status.getService().getProcessService().setDebug(status.getPid(), debug);
return null;
}
});
info.addExternalFunc("g_not_null", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "判断是否有效";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(args.get(0).getObj() != null);
}
});
info.addExternalFunc("g_print", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "标准输出";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
logger.info(args.get(0).getObj());
return null;
}
});
info.addExternalFunc("g_print_info", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "标准输出";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
logger.info(args.get(0));
return null;
}
});
info.addExternalFunc("g_printn", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "标准输出并换行";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
Object[] info = status.getProcInfo();
logger.info(String.format("#%03d [%s] %s", status.getPid(), info[2], args.get(0).getObj()));
return null;
}
});
info.addExternalFunc("g_printdn", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "调试输出并换行";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
Object[] info = status.getProcInfo();
logger.debug(String.format("#%03d [%s] %s", status.getPid(), info[2], args.get(0).getObj()));
return null;
}
});
info.addExternalFunc("g_print_err", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "错误输出";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
logger.error(args.get(0).getObj());
return null;
}
});
info.addExternalFunc("g_to_string", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "将对象转换成字符串";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) {
RuntimeObject obj = args.get(0);
if (obj == null) {
return new RuntimeObject(null);
}
return new RuntimeObject(String.valueOf(args.get(0).getObj()));
}
});
info.addExternalFunc("g_new", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "深拷贝";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return args.get(0).clone();
}
});
info.addExternalFunc("g_doc", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "文档";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(status.getHelpString(args.get(0).getObj().toString()));
}
});
info.addExternalFunc("g_get_type", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "获取类型";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(args.get(0).getTypeName());
}
});
info.addExternalFunc("g_get_type_ordinal", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "获取类型(索引)";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(BigInteger.valueOf(args.get(0).getTypeIndex()));
}
});
info.addExternalFunc("g_type", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "获取类型";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(args.get(0).getTypeString());
}
});
info.addExternalFunc("g_hash", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "获取哈希";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
if (args.get(0).getObj() == null)
return new RuntimeObject("NULL");
return new RuntimeObject(String.valueOf(args.get(0).getObj().hashCode()));
}
});
info.addExternalFunc("g_exit", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "程序退出";
}
@Override
public RuntimeObjectType[] getArgsType() {
return null;
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
throw new RuntimeException(RuntimeError.EXIT, -1, "用户自行退出");
}
});
info.addExternalFunc("g_load", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "载入并运行程序";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(BigInteger.valueOf(status.runProcess(args.get(0).getObj().toString())));
}
});
info.addExternalFunc("g_load_x", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "载入并运行程序";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(BigInteger.valueOf(status.runProcessX(args.get(0).getObj().toString())));
}
});
info.addExternalFunc("g_load_user", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "载入并运行用户态程序";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(BigInteger.valueOf(status.runUsrProcess(args.get(0).getObj().toString())));
}
});
info.addExternalFunc("g_load_user_x", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "载入并运行用户态程序";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
return new RuntimeObject(BigInteger.valueOf(status.runUsrProcessX(args.get(0).getObj().toString())));
}
});
info.addExternalFunc("g_print_file", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "载入并运行程序";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kString };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
try {
BufferedReader br = new BufferedReader(new FileReader(args.get(0).getObj().toString()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
} catch (Exception e) {
System.err.println(e.getMessage());
}
return null;
}
});
buildIORead(info);
return runtimeCodePage = page;
}
use of priv.bajdcc.LALR1.grammar.runtime.IRuntimeDebugExec in project jMiniLang by bajdcc.
the class ModuleList method buildArrayMethod.
/**
* 数组操作
* @param info 信息
*/
private void buildArrayMethod(IRuntimeDebugInfo info) {
info.addExternalFunc("g_array_add", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "数组添加元素";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray, RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = (RuntimeArray) args.get(0).getObj();
args.get(1).setReadonly(false);
array.add(args.get(1));
return args.get(0);
}
});
info.addExternalFunc("g_array_contains", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "数组查找元素";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray, RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = (RuntimeArray) args.get(0).getObj();
args.get(1).setReadonly(false);
return new RuntimeObject(array.contains(args.get(1)));
}
});
info.addExternalFunc("g_array_append", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "数组添加数组";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray, RuntimeObjectType.kArray };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = (RuntimeArray) args.get(0).getObj();
RuntimeArray array2 = (RuntimeArray) args.get(1).getObj();
array.add(array2);
args.get(1).setReadonly(false);
return args.get(0);
}
});
info.addExternalFunc("g_array_insert", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "数组添加元素";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray, RuntimeObjectType.kInt, RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = (RuntimeArray) args.get(0).getObj();
BigInteger n = (BigInteger) args.get(1).getObj();
args.get(2).setReadonly(false);
array.insert(n.intValue(), args.get(2));
return args.get(0);
}
});
info.addExternalFunc("g_array_set", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "数组设置元素";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray, RuntimeObjectType.kInt, RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = (RuntimeArray) args.get(0).getObj();
BigInteger index = (BigInteger) args.get(1).getObj();
args.get(2).setReadonly(false);
if (!array.set(index.intValue(), args.get(2))) {
status.err(RuntimeException.RuntimeError.INVALID_INDEX, "array.set");
}
return null;
}
});
info.addExternalFunc("g_array_pop", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "数组弹出元素";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = (RuntimeArray) args.get(0).getObj();
return new RuntimeObject(array.pop());
}
});
info.addExternalFunc("g_array_clear", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "数组清除元素";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = (RuntimeArray) args.get(0).getObj();
array.clear();
return new RuntimeObject(array);
}
});
info.addExternalFunc("g_array_reverse", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "数组反转";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = (RuntimeArray) args.get(0).getObj();
array.reverse();
return new RuntimeObject(array);
}
});
info.addExternalFunc("g_array_get", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "数组查询";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray, RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = (RuntimeArray) args.get(0).getObj();
BigInteger index = (BigInteger) args.get(1).getObj();
return new RuntimeObject(array.get(index.intValue()));
}
});
info.addExternalFunc("g_array_get_ex", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "数组查询";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray, RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = (RuntimeArray) args.get(0).getObj();
BigInteger index = (BigInteger) args.get(1).getObj();
return new RuntimeObject(array.get(index.intValue(), status));
}
});
info.addExternalFunc("g_array_size", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "数组长度";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = (RuntimeArray) args.get(0).getObj();
return array.size();
}
});
info.addExternalFunc("g_array_remove", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "数组移除";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray, RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = (RuntimeArray) args.get(0).getObj();
BigInteger index = (BigInteger) args.get(1).getObj();
return new RuntimeObject(array.remove(index.intValue()));
}
});
info.addExternalFunc("g_array_delete", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "数组移除";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray, RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = (RuntimeArray) args.get(0).getObj();
RuntimeObject obj = args.get(1);
return new RuntimeObject(array.delete(obj));
}
});
info.addExternalFunc("g_array_empty", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "数组为空";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = (RuntimeArray) args.get(0).getObj();
return new RuntimeObject(array.isEmpty());
}
});
info.addExternalFunc("g_array_range", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "产生连续整数数组";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kInt, RuntimeObjectType.kInt };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = new RuntimeArray();
int a = ((BigInteger) args.get(0).getObj()).intValue();
int b = ((BigInteger) args.get(1).getObj()).intValue();
for (int i = a; i <= b; i++) {
array.add(new RuntimeObject(BigInteger.valueOf(i)));
}
return new RuntimeObject(array);
}
});
info.addExternalFunc("g_array_fill", new IRuntimeDebugExec() {
@Override
public String getDoc() {
return "填充数组";
}
@Override
public RuntimeObjectType[] getArgsType() {
return new RuntimeObjectType[] { RuntimeObjectType.kArray, RuntimeObjectType.kObject };
}
@Override
public RuntimeObject ExternalProcCall(List<RuntimeObject> args, IRuntimeStatus status) throws Exception {
RuntimeArray array = (RuntimeArray) args.get(0).getObj();
RuntimeObject obj = args.get(1);
for (int i = 0; i <= array.length(); i++) {
array.set(i, obj);
}
return new RuntimeObject(array);
}
});
}
Aggregations