c# - 有没有办法在用户的表达式中从现有的 Antlr4 语法生成可执行文件?
问题描述
我已经有一个现有的应用程序,我在其中使用 Antlr4 来声明自定义语法,将 .g4 文件编译到我们的 c# 基本解析器和词法分析器中,并且我已经实现了用于表达式解析的访问者。
问题是要找到一种方法来改变从解释到编译的行为。
今天应用程序的工作方式是,我们从用户那里接收一个表达式(以定制的语法格式),将它传递给 Antlr4 实现,以便让我们的访问者运行并执行该表达式。这是一个非常重复的过程,考虑到同一个表达式只用不同的参数反复评估,实现的逻辑是一样的。
我想问一下我是否可以编译我的用户提供的表达式,保存编译的工件,以便我可以加载它并调用它,而不是每次都解析他们的表达式。这与我在 C# 编程中所做的类似,考虑到我生成了一个 DLL 文件,该文件将在以后加载并执行,而无需每次都进行解释(在此上下文中不考虑 JIT;)。
希望我对此已经足够清楚了。
更改此实现的架构不是问题,因此由于性能问题,我们确实需要对项目进行“整容”。我们的客户使用生成非常大的表达式,这需要大量内存来解析并在运行时导致一些问题。
非常感谢。
解决方案
在对 AntLr 的实现和使用进行了一些额外的分析之后,我可以看到,即使我可以找到一种编译表达式分析的方法,输出结果对于我们的场景也无法执行,因为 local 的许多用法图书馆。
我选择运行的路径是在访问 AntLr 表达式导航时动态创建 C# 代码,通过访问方法覆盖,然后将此 C# 代码编译到内存程序集中,这样我就可以找到执行类,创建实例并调用它是执行方法。我也在使用 Rosyln 来实现这种方法。
推荐阅读
- scala - 将 Spark 中的多个 ArrayType 列合并为一个 ArrayType 列
- angular - 如何实现对服务器页面的细分?
- java - 找不到枚举时的枚举类映射问题
- javascript - 是否可以使用变量列表进行字符串插值?
- ios - 应用 CIFilter 后,无论我做什么,图像都会变大
- hl7-fhir - 治疗并发症,哪些表应该存储数据
- php - 在 mysql 的 php 查询中是否有任何 msi 关键字或特殊角色?
- iphone - 如何在 Swift 中找到 iOS 应用程序内部目录的路径?
- matlab - MATLAB 绘制连续日期的数据以及特定日期的观测数据
- docker - Docker 查看历史日志