Java 在没有语法文件的情况下,我需要做些什么以编程方式在Antlr中实现语法、解析器和词法器?

Java 在没有语法文件的情况下,我需要做些什么以编程方式在Antlr中实现语法、解析器和词法器?,java,antlr,Java,Antlr,从我在网上看到的示例和我到目前为止读到的内容来看,使用Antlr创建语言的典型方法似乎需要一个.g4语法文件和一个类似maven Antlr插件的工具来基于此生成Java源代码 不需要语法文件和使用这样的生成器就可以从头开始实现吗 在不涉及太多枯燥细节的情况下,我们需要实现一种在运行时定义了很多动态部分的语言,而硬编码它们对我们来说是行不通的。因此我问 以编程方式实现此功能至少需要什么?lexer和解析器的实现?还有什么 有人能提供一个不需要生成代码的简单实现的例子吗?我认为这在一般情况下是完全

从我在网上看到的示例和我到目前为止读到的内容来看,使用Antlr创建语言的典型方法似乎需要一个
.g4
语法文件和一个类似
maven Antlr插件的工具来基于此生成Java源代码

不需要语法文件和使用这样的生成器就可以从头开始实现吗

在不涉及太多枯燥细节的情况下,我们需要实现一种在运行时定义了很多动态部分的语言,而硬编码它们对我们来说是行不通的。因此我问

以编程方式实现此功能至少需要什么?lexer和解析器的实现?还有什么


有人能提供一个不需要生成代码的简单实现的例子吗?

我认为这在一般情况下是完全不现实的。Antlr是一个从语法文件生成解析器的工具。。。如果不使用生成解析器(因为这是“生成代码”)和使用语法文件,那么实际上,您只需要删除整个Antlr

您可能会使用运行库的某些部分(可能是ATNs?或一些较低级别的东西,如CharacterStream),但总体而言,您几乎需要从头开始编写自己的通用解析器/词法分析器


让我把你的问题转过来:你想从使用Antlr中获得什么?

你最好实现一个,它本质上是由一组语法规则直接驱动的

想换一种语言吗?修改规则集,将其交给Earley解析引擎


一个更有趣的问题可能是,“对于一些规则是恒定的,而一些规则是动态的语法,什么样的解析机制是有效的?”我已经跟踪解析机制很长时间了,还没有看到提出的这个问题,更不用说看到它的答案了。我怀疑,如果您使用占位符对基线paser中的Earley解析器进行部分评估,并为不同的规则设置占位符,您可能会得到一些有用的东西,但这显然是一个研究项目。

好吧,我仍然希望使用Antlr进行解析、侦听器、ATN-s等等。我想使用Antlr,但不想用它来生成代码,这样我就可以在运行时而不是在编译时定义某些东西。ATN是由ANTLR4生成的,是语法到解析器过程的结果。没有翻译,没有ATN。@carlspring问题是:解析和调用侦听器都由生成的代码处理。antlr运行时中没有通用的解析代码(除了一些真正低级的东西)。正如我的回答所说:antlr的整个设计都是关于尽可能少的运行时。在从语法生成词法分析器/语法分析器之后,有没有办法修改它们?@carlspring:uhm。。。是的,它们毕竟是文本文件。。。此外,解析器的源代码本身是使用模板创建的(这就是antlr支持不同语言的方式),因此您可能可以提供一组您自己的模板。但这与最初使用antlr的情况不一样吗?你编写语法规则,让解析器生成器根据这些规则生成一个解析器,没有1)ANTLR处理左递归、深看头和歧义,Earley做得很好。语法更改可能会使这些问题难以避免2)每次语法更改时,您必须愿意调用ANTLR(processfork),这似乎需要很大的开销。如果你经常使用修改过的语法,这可能会分期偿还。谢谢你的澄清!是的,这些就是我的结论。在我的例子中,部分语言可能是在模块化的基础上启用的,因此基于语法文件的代码生成毫无用处,我们无法在每次应用程序启动时生成和编译类。