我需要为单个DSL实现两个工具:Java中的UI编辑器和C / C ++中的解释器。我的第一个想法是使用ANTLR,因为它可以为Java和C / C ++生成解析器。但是我见过的所有ANTLR示例都包含一些特定于语言的代码或设置。
有没有办法为单个DSL生成两个解析器?
从单个语法生成两个解析器是否有意义?
这个问题有没有常用的方法?
答案 0 :(得分: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解析器。但这取决于你的语言相当简单。
我不知道这个问题是否有“常用方法”,但这肯定是一个经常出现的问题;很多语法在不同的项目之间共享,但从我所看到的,最常见的方法是剪切并粘贴语法,并重写动作。我已经完成了几次宏观方法,它可以工作但它永远不会像你想要的那样优雅。
答案 1 :(得分:0)
您可以尝试yacc和jacc。 http://web.cecs.pdx.edu/~mpj/jacc/ http://dinosaur.compilertools.net/#yacc
他们的语法非常相似,可能有些帮助 手女仆预处理工具,您可以使用一个源文件。
PS 但是为什么不在C ++中编写一次解析器并通过JNI使用它?
答案 2 :(得分:0)
你当然可以使用ANTLR。语言特定部分是动作或谓词。如果你不需要它们,那么你将不会在语法中有任何语言特定的东西。顺便说一句。无论你使用哪种解析器生成器(包括yacc,bison等),如果你需要,你总是会在语法中使用语言特定的东西。