0

I need to implement two tools for a single DSL: UI editor in Java and interpreter in C/C++. My first idea was to use ANTLR, since it can generate parsers for both Java and C/C++. But all ANTLR examples that I've seen contains some language-specific code or settings.

Is there any way to generate two parsers for a single DSL?

Does this even make sense to generate two parsers from a single grammar?

Is there any commonly used approaches for this problem?

4

3 回答 3

1

至少根据文档,bison 可以生成 C++ 和 Java 解析器(我从未使用过 Java 接口,只使用过一次 C++ 接口,但有人告诉我它们可以工作)。语法不会是问题,但动作会是问题,特别是因为您可能在两个解析器中做不同的事情,而不仅仅是使用不同的语言。但是你应该能够让每一个动作都成为一个简单的$$ = method($1, $2, ...);陈述。

bison 不使用 C(++) 预处理器(实际上并不能,因为将预处理器指令放入 bison 输入文件很常见),但您可以使用其他一些宏系统——我不愿推荐m4,但它如果你知道如何使用它——或者一个 shell 脚本来组装不同的输入文件,它会起作用。

另一种可能性是在解析器中创建一个 AST。您可以使用任何解析器生成器,包括 Antlr 或 bison,在 C 或 C++ 中构建 AST 解析器,然后包装结果以与 JNI for Java 一起使用。如果你使用 Antlr,你可以用很少的语言特定代码生成一个 AST 生成器,所以使用简单的宏处理器,你可以在 C++ 和 Java 中构建本地 AST 解析器,我认为。但这取决于您的语言是否相当简单。

我不知道这个问题是否有“常用方法”,但这肯定是一个经常出现的问题;许多语法在不同的项目之间共享,但据我所见,最常见的方法是剪切和粘贴语法,然后重写动作。我已经做过几次宏观方法,它可以工作,但它永远不会像你想要的那样优雅。

于 2013-07-14T02:38:51.280 回答
0

你当然可以使用 ANTLR。语言特定部分是动作或谓词。如果您不需要它们,那么语法中将没有任何特定于语言的内容。顺便提一句。无论您使用哪种解析器生成器(包括 yacc、bison 等),如果需要,您总是会在语法中包含特定于语言的内容。

于 2013-07-16T07:45:00.380 回答
0

你可以试试yacc和jacc。 http://web.cecs.pdx.edu/~mpj/jacc/ http://dinosaur.compilertools.net/#yacc

它们具有非常相似的语法,可以借助一些手佣预处理工具,您可以使用一个源文件。

PS 但是为什么不在 C++ 中编写一次解析器并通过 JNI 使用它呢?

于 2013-07-14T00:40:48.083 回答