2012-06-13 49 views
4

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

//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信息。

+1

如果你需要一个编译器 - 编译器 - 编译器,那么你做错了什么。 –

+4

语法语法。编译器编译器编译。 IT说唱? – maksimov

+8

Yo dawg,我听说你喜欢描述语言,所以我为你的语法写了一个文法语法,这样你就可以解析你如何解析你的语法。 –

回答

1

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

这听起来很复杂!

另外,我想知道如何轻松地编译/解析这种类型的语法,它包含语法和语义XML信息。

不......没有简单的答案。这听起来像你的前同事在复杂性方面走在了前列。你将有:

  • 无论是在他的代码做了什么让你的头,它是怎么做的,学习ANTLR的是如何工作的,并手工翻译,
  • 或抛弃他的代码和设计,并找到一个更简单的方式来做它正在做的事情。

祝你好运!


(其实,有一个很好的机会,并不复杂的代码,因为它似乎......一旦你得到它周围你的头,和编译器编译器技术。)

+0

我同意这个答案,如果你成功地实现了你所问的问题,那么想想下一个开发者,当你走了,并试图到达那里。 –

+0

“想想下一个开发人员”,但只能假设他有能力按照公司的业务目标定义自己的工作。如果因为下一个开发人员可能没有受过良好教育而选择非常糟糕的黑客行为,那么这样做是因为您的组织选择聘用技能弱的人才,如果这对他们有用(我认为这很有用,但不相信它很好) 。如果您的组织聘用了优秀的人才,那么选择合适的解决方案。 –

1

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

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

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

+2

(我会推荐意大利面叉而不是铲子:-) –

3

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

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