Почему Truffle DSL выдает ошибку при добавлении аннотаций @Specialization? - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь реализовать 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.

1 Ответ

0 голосов
/ 27 мая 2020

Ответ, который я получил от великого человека по Graal Slack

value нужно откуда-то брать. И Truffle ожидает, что у вас будет форма выражения как подузел вашей функции печати. Стандартный способ - добавить что-то вроде @NodeChild(value = "receiver", type = ExpressionNode.class) в определение класса Stefan Marr il ya 10 минут, если value не должен поступать из подузла, то есть дочернего узла, вы можете вместо этого определить абстрактный метод execute(Object value) , который DLS реализует для вас с использованием специализаций

...