用于Java的语法编译器编译器

时间:2012-06-13 14:02:05

标签: java compiler-construction grammar compiler-compiler

我的公司正在尝试为Android编写一些软件。我们希望使用Java,并且该公司软件的一个组件是c ++,因此需要移植(或者至少需要在尝试NDK之前尝试移植)。此代码是使用Accent创建的,它定义了语法语法。就像我所知道的那样,原作者(现在已经不在了)写了一个语法来指定如何指定语法,然后编译一个带有该语法和Accent的编译器编译器。编译器编译器采用指定格式的语法,并生成二进制代码来解析符合该语法的字符串。这是语法的示例片段:

    //include rules from from this file (such as <alpha>)
include "alphabet.bnf"

<<topSymbol>> = <alpha> <alpha> <alpha>? .//two letters with an optional third
//square brackets enclose an XML statement clarifying semantics of the rule
[
    <topSymbol>
        <letter>
                       <command val="doSomethingToLetter"/>
        </letter>
        <!--etc.-->
    </topSymbol>
]

我的问题是如何使用Antlr或其他工具使用Java。编译器 - 编译器 - 编译器对我来说似乎相当复杂。或者,我想知道如何轻松编译/解析这种类型的语法,其中包含语法和语义XML信息。

3 个答案:

答案 0 :(得分:3)

如果原始设计师知道他在做什么,并且这是有道理的,那么你想要保留这个概念。使用另一个解析器生成器(或至少是某种解析方案)是正确的方法。 JavaCC或ANTLR可以作为解析器生成器使用;你必须手工翻译语法。如果语法足够简单,你可以hand code a recursive descent parser

如果原始设计师只是在顶部,那么你可能会取代语法驱动的方面,但如果不了解他的成就,你将无法做到这一点。这个“对我而言似乎相当复杂”的事实表明你并不真正理解解析/解析器生成器技术,并且你希望做一些你理解的事情,而不是保留你不理解的东西。但是,仅仅因为你不理解它而拆除设计/实施的东西是一个坏主意。我强烈建议您了解有关这些技术的更多信息,并询问为什么以这种方式实现?最终你可能是正确的,应该用其他东西取代他的做法,但要根据知识做出选择,而不是恐惧。

答案 1 :(得分:1)

  

我的问题是如何使用Antlr或其他工具使用Java。编译器 - 编译器 - 编译器对我来说似乎相当复杂。

这听起来也很复杂!

  

或者,我想知道如何轻松编译/解析这种类型的语法,其中包含语法和语义XML信息。

不......没有简单的答案。听起来你的前同事在复杂性方面已经超越了顶峰。你将不得不:

  • 要么了解他的代码所做的事情,以及如何做到这一点,了解Antlr的工作方式,并进行手工翻译,
  • 或放弃他的代码和设计,找到一种更简单的方法来做它正在做的事情。
祝你好运!


(实际上,很有可能代码并不像看起来那么复杂......一旦你了解它并使用编译器编译器技术。)

答案 2 :(得分:1)

您最好的选择是将您的语法翻译成ANTLR或Java CC或其他工具。

另一种可能性是使用JNI调用您的C ++代码,但这充满了危险。

我不知道任何有用的东西。你只需要拿一把铲子开始挖掘。