Я пытаюсь реализовать Truffle Framework на существующем языке ( INI ), и мне удалось запустить язык с базовыми c функциями и Truffle. Однако, когда я пытаюсь добавить аннотации @Specialization
к своим методам, компилятор выдает сбой и выводит следующее сообщение:
src/main/java/ini/eval/function/PrintFunction.java:[17,17] Not enough child node declarations found. Please annotate the node class with addtional @NodeChild annotations or remove all execute methods that do not provide all evaluated values. The following execute methods do not provide all evaluated values for the expected signature size 1: [executeGeneric(VirtualFrame), executeNumber(VirtualFrame), executeBoolean(VirtualFrame), executeChar(VirtualFrame), executeString(VirtualFrame)]
Однако, когда я удаляю аннотацию @Specialization
, он работает нормально
Это единственный класс, в котором я еще добавил специализацию:
@NodeInfo(shortName = "print")
@GenerateNodeFactory()
public abstract class PrintFunction extends BuiltInExecutable {
public PrintFunction(IniParser parser, String name, String[] parameterNames) {
super();
}
private static final PrintStream out = System.out;
@Specialization
public Number print(Number value) {
doPrint(value);
return value;
}
@TruffleBoundary
private static void doPrint(Number value) {
out.print(value);
}
... More specializations for other types (boolean, and String)
@Specialization
public Object print(Object value) {
doPrint(value);
return value;
}
@TruffleBoundary
private static void doPrint(Object value) {
out.print(value);
}
}
Суперкласс всех узлов (AstElement) имеет методы executeGeneri c (VirtaulFrame) и executeNumber , executeBoolean, executeChar и executeString. Итак, класс PrintFunction также имеет эти методы.
Итак, что, по вашему мнению, действительно вызывает сообщение об ошибке или, по крайней мере, что это означает?
Я черпаю вдохновение из языка Mumbler. и SimpleLanguage реализованы с Truffle.