我的目标是为我的应用程序开发一个 DSL,但我希望用户能够在他/她的 DSL 中设置一个断点,而无需用户了解有关 DSL 运行的底层语言的任何信息,而他/她看到的是DSL 相关的语法、堆栈、监视变量等。
我怎样才能做到这一点?
我的目标是为我的应用程序开发一个 DSL,但我希望用户能够在他/她的 DSL 中设置一个断点,而无需用户了解有关 DSL 运行的底层语言的任何信息,而他/她看到的是DSL 相关的语法、堆栈、监视变量等。
我怎样才能做到这一点?
这取决于您的目标平台。例如,如果你在 .NET 上实现你的 DSL 编译器,用调试信息(变量名、表达式和语句的源代码位置等)注释你的字节码是很简单的。
如果您还为您的语言提供 Visual Studio 扩展,您将能够重用免版税的 MSVS 隔离 Shell 来编辑和调试您的 DSL 代码。
JVM 可以使用几乎相同的方法(您可以使用 Eclipse 或 Netbeans 作为调试前端)。
原生代码生成稍微复杂一些,但仍然可以做一些简单的事情,比如生成填充了line
pragma 的 C 代码。
您基本上需要为您的 DSL 生成具有内置断点机会的代码,每个断点都具有用于观察内部状态变量的内置设施。然后您的调试器就知道如何将 DSL 中的位置映射到调试断点,并且对于每个断点,只需调用观察者。(如果观察者有名字,例如变量名,你可以让用户选择要调用的名字)。