我试图将Truffle框架实现为现有语言(INI),并且设法通过基本功能和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)具有executeGeneric(VirtaulFrame)方法和executeNumber,executeBoolean,executeChar和executeString方法。所以类PrintFunction也有这些方法

那么,您认为是什么真正导致了错误消息,或者至少是什么意思?

我从都通过Truffle实现的Mumbler语言和SimpleLanguage中获得灵感。

最佳答案

我在Graal Slack上从一个伟人那里得到的答案

value需要来自某个地方。 Truffle希望您拥有一种表达形式,作为打印功能的子节点。标准方法是在类定义中添加@NodeChild(value = "receiver", type = ExpressionNode.class)之类的内容
斯蒂芬·马尔(Stefan Marr)不到10分钟
如果value不应该来自子节点(即子节点),则可以定义一个抽象的execute(Object value)方法,DLS将使用专业化方法为您实现

关于java - 为什么在添加@Specialization批注时Truffle DSL会出错?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62038918/

10-10 02:28