我试图将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/