首页 > 解决方案 > 有没有办法在用户的表达式中从现有的 Antlr4 语法生成可执行文件?

问题描述

我已经有一个现有的应用程序,我在其中使用 Antlr4 来声明自定义语法,将 .g4 文件编译到我们的 c# 基本解析器和词法分析器中,并且我已经实现了用于表达式解析的访问者。

问题是要找到一种方法来改变从解释到编译的行为。

今天应用程序的工作方式是,我们从用户那里接收一个表达式(以定制的语法格式),将它传递给 Antlr4 实现,以便让我们的访问者运行并执行该表达式。这是一个非常重复的过程,考虑到同一个表达式只用不同的参数反复评估,实现的逻辑是一样的。

我想问一下我是否可以编译我的用户提供的表达式,保存编译的工件,以便我可以加载它并调用它,而不是每次都解析他们的表达式。这与我在 C# 编程中所做的类似,考虑到我生成了一个 DLL 文件,该文件将在以后加载并执行,而无需每次都进行解释(在此上下文中不考虑 JIT;)。

希望我对此已经足够清楚了。

更改此实现的架构不是问题,因此由于性能问题,我们确实需要对项目进行“整容”。我们的客户使用生成非常大的表达式,这需要大量内存来解析并在运行时导致一些问题。

非常感谢。

标签: c#antlr4grammar

解决方案


在对 AntLr 的实现和使用进行了一些额外的分析之后,我可以看到,即使我可以找到一种编译表达式分析的方法,输出结果对于我们的场景也无法执行,因为 local 的许多用法图书馆。

我选择运行的路径是在访问 AntLr 表达式导航时动态创建 C# 代码,通过访问方法覆盖,然后将此 C# 代码编译到内存程序集中,这样我就可以找到执行类,创建实例并调用它是执行方法。我也在使用 Rosyln 来实现这种方法。


推荐阅读