我需要在Tradestation的EasyLanguage到C ++之间构建一个“翻译器”(交叉编译器是正确的词吗?)。但是,没有关于EasyLanguage语法的完整文档(我可以找到)。
作为一个更普遍的问题,如果我们知道(或者即使我们不知道)某种语言'A'中有一套有效的程序,是否可以辨别'A'的语法?某些基本标记,如“if”,“else”和保留字,或者这是一个未解决的案例特定(难?)问题。
我可以使用任何有用的工具开始吗?
答案 0 :(得分:5)
简单的答案是“不”。
来自示例的任何类型的泛化都受到基本事实的影响,即猜测。你可以猜测 langauge有一个'if'标记。不保证它确实存在,或者它是拼写如果,或者它具有您理解的语义。 你不会得到一个自动化工具来为你提供语法。
你最好的选择是所有你可以获得的描述语言的文件,以及猜的语法。然后,您将为语法构建一个解析器,并根据您可以找到的代码库进行验证,然后进行修改。我已经用各种各样的语言做了几十次(参见我的简历)。
这很痛苦,但你经常会得到一些非常有用的地方。好消息是,您的解析器不必解析用户不知道如何编写的任何内容。坏消息是,他们会根据你从未见过的一些模糊的例子或者偶然发生的错字来写东西。 (即使是语言设计者也不打算这样做,但这对用户来说无关紧要;他的程序可以工作而你的编译器没有。根据定义你的问题。)
你永远不会知道的是,如果该语言的提供者具有某些他没有记录的特征,并且没有显示任何其他人。在你完成很久之后,不断准备好惊讶: - {
现在,您可以用于此过程的最佳工具IMHO是GLR parser generator;这是我公司使用的。这些将解析任何无上下文的语言(你可能会提出),而没有很多努力来弯曲语法以匹配递归下降,LL(k)或LR(k)解析器的其他常见限制。生活很难猜到语法,更不用说猜测语法然后猜测如何弯曲它使解析器生成器正确地吞下它。
一旦你掌握了正确的语法,你也会遇到构建翻译的问题。您可能会发现此答案有用:What kinds of patterns could I enforce on the code to make it easier to translate to another programming language?