c# – 我可以将ANTLR用于未预处理的代码吗?

我即将为OpenEdge(4GL数据库语言)编写解析器,我想使用ANTLR(或类似的).

我认为这可能是一个问题有两个原因:

> OpenEdge是一种4GL数据库语言,它允许以下构造:

assign
    customer.name = 'Customer name'
    customer.age = 20
.

在哪里.最后是行分隔符,该语句结合了两个数据库字段的赋值. OpenEdge有更多这些结构;
>我需要保留源文件的所有细节,因此在解析文件之前我无法扩展预处理器语句,因此:

// file myinc.i
7 * 14

// source.p
assign customer.age = {myinc.i}.

在上面的例子中,我需要保留customer.age是使用{myinc.i}而不是7 * 14分配的事实.

我可以使用ANTLR来实现这一点,还是需要编写自己的解析器?

更新:
我需要这个解析器不从它生成可执行文件,而是用于代码分析.这就是为什么我需要AST来包含使用include的事实.

解决方法:

只是为了澄清:ANTLR不是解析器,而是解析器生成器.

您可以为该语言编写自己的解析器,也可以为其编写(ANTLR)语法,让ANTLR为您生成词法分析器和解析器.您可以在语法中混合自定义代码以跟踪您的分配.

所以答案是:是的,你可以使用ANTLR.

注意我对OpenEdge不熟悉,但SQL语法通常很难编写解析器或语法.看看ANTLR wiki,看看从头开始编写一个并不是一件轻而易举的事.你没有提到它,但我认为你已经看过可以解析你的语言的现有解析器了吗?

仅供参考:您可能已经拥有它,但这里是文档的链接,包括OpenEdge SQL方言的BNF语法:http://www.progress.com/progress/products/documentation/docs/dmsrf/dmsrf.pdf

上一篇:java – 如何获取antlr解析的错误消息?


下一篇:使用javax.lang.model或ANTLR JavaParser获取有关Java源代码的信息的示例/教程