使 Rascal AST 在 DSL 中可见

问题描述 投票:0回答:1

我正在努力将宏添加到我的 DSL 中。我想知道是否可以在 DSL 层访问我的 DSL 的 Rascal AST,以便我可以直接引用 AST。例如:

defmacro example(oldEntity : Entity):
  if oldEntity.simpleName == "Account":
    entity #{concat(oldEntity.simpleName, "_New")}{
      ...
    }
  else:
    entity #{oldEntity.simpleName}{
      ...
    }

这里,

simpleName
是实体 AST 的一个组件。

注意:上面的语法仅用于说明。

rascal
1个回答
0
投票

是的,这是可能的。实现很简单,但设计可能很困难。

您拥有的有关源程序的每条信息都会暴露给程序员。如果您正在编写一个解释器,这只是产生该信息的 Rascal 函数的结果。如果您正在编写编译器,则需要设计在运行时访问该信息。会有一个编译时 Rascal 函数在代码中生成常量以及对这些常量进行操作的方法。

我猜你正在写一个类似 lisp 的解释器。这是为您的语言设计“反射 API”的问题。您将在哪些范围内向程序员提供哪些函数和参考?您的解释器可能必须对以前仅是静态名称的表达式调用

eval
(因此
lookup
变为
eval

© www.soinside.com 2019 - 2024. All rights reserved.