4

我的公司正在尝试为 Android 编写一些软件。我们想使用 Java,并且公司软件的一个组件是 c++,因此需要移植(或者至少在尝试 NDK 之前需要尝试移植)。此代码是使用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>
]

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

4

3 回答 3

3

如果最初的设计师知道他在做什么,而且这是有道理的,那么你想保留这个概念。使用另一个解析器生成器(或至少某种解析方案)是正确的方法。JavaCC 或 ANTLR 都可以作为解析器生成器;您必须手动翻译语法。如果语法足够简单,您可以手动编写递归下降解析器。

如果最初的设计师只是过头了,那么您可能可以替换语法驱动方面,但是如果不了解他的目标,您将无法做到这一点。这个“对我来说似乎相当复杂”的事实表明您并不真正了解解析/解析器生成器技术,并且您希望做一些您了解的事情而不是保留您不了解的事情。但是,仅仅因为您不了解它而将设计/实现良好的东西拆开是一个坏主意。我强烈建议您更多地了解这些技术,并问为什么要以这种方式实施?最终你可能是对的,应该用其他方法代替他的方法,但要根据知识做出选择,而不是恐惧。

于 2012-06-13T14:39:34.283 回答
1

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

对我来说听起来也很复杂!

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

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

  • 要么了解他的代码的作用以及它是如何工作的,要么了解 Antlr 的工作原理,然后手动翻译,
  • 或者放弃他的代码和设计,找到一种更简单的方法来做它正在做的事情。

祝你好运!


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

于 2012-06-13T14:10:20.023 回答
1

最好的办法是将您拥有的语法翻译成 ANTLR 或 Java CC 或其他一些工具。

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

我不知道有什么可以提供帮助的。你只需要拿一把铲子开始挖掘。

于 2012-06-13T14:12:43.360 回答