我的公司正在尝试为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信息。
答案 0 :(得分:3)
如果原始设计师知道他在做什么,并且这是有道理的,那么你想要保留这个概念。使用另一个解析器生成器(或至少是某种解析方案)是正确的方法。 JavaCC或ANTLR可以作为解析器生成器使用;你必须手工翻译语法。如果语法足够简单,你可以hand code a recursive descent parser。
如果原始设计师只是在顶部,那么你可能会取代语法驱动的方面,但如果不了解他的成就,你将无法做到这一点。这个“对我而言似乎相当复杂”的事实表明你并不真正理解解析/解析器生成器技术,并且你希望做一些你理解的事情,而不是保留你不理解的东西。但是,仅仅因为你不理解它而拆除设计/实施的东西是一个坏主意。我强烈建议您了解有关这些技术的更多信息,并询问为什么以这种方式实现?最终你可能是正确的,应该用其他东西取代他的做法,但要根据知识做出选择,而不是恐惧。
答案 1 :(得分:1)
我的问题是如何使用Antlr或其他工具使用Java。编译器 - 编译器 - 编译器对我来说似乎相当复杂。
这听起来也很复杂!
或者,我想知道如何轻松编译/解析这种类型的语法,其中包含语法和语义XML信息。
不......没有简单的答案。听起来你的前同事在复杂性方面已经超越了顶峰。你将不得不:
(实际上,很有可能代码并不像看起来那么复杂......一旦你了解它并使用编译器编译器技术。)
答案 2 :(得分:1)
您最好的选择是将您的语法翻译成ANTLR或Java CC或其他工具。
另一种可能性是使用JNI调用您的C ++代码,但这充满了危险。
我不知道任何有用的东西。你只需要拿一把铲子开始挖掘。