可以通过多个编译器或解释器编译抽象语法树吗?

时间:2015-03-29 05:58:57

标签: parsing compiler-construction interpreter abstract-syntax-tree lexer

我知道没有两种编程语言完全匹配但是我想问一下我是否有一个像hello world这样的简单程序而且我运行编译翻译阶段如lex,parse然后得到AST树我可以把它发送到另一个环境说一些c AST树并用Java解释它

3 个答案:

答案 0 :(得分:3)

答案简短:不。

版本较长:

如果您有两种不同的语言实现来记录和导出它们的AST接口,并且这两个接口非常相似,您可以在它们之间进行转换,那么您可以编译为AST然后尝试将AST传递给其中一个的实施方式。

我只能假设这里说话,因为语言实现包含外部可访问的AST接口非常罕见。 (一个例外是Python,它允许你编译成AST,创建或修改AST,然后从AST编译。这里,"编译"表示"编译为VM代码"。有关详细信息,请参阅Python docs。)

特别是,我不知道Java的实现。 GCC和clang都可以输出类似于AST的东西,但是它们都不接受,并且输出可能不够完整,无法定义翻译单元的所有方面。

答案 1 :(得分:2)

我不知道任何标准化的AST表示格式可以实现这种共享(假设我们正在谈论具有相似语义的语言),但是例如在Clang+LLVM架构中,似乎AST输出可以输入多个代码生成器(编译器)。

如果有一个普遍的Java任何语言的解释器阅读AST我猜这样的事情不存在,我怀疑是否有可能将其建立为单词的含义不同的编程语言是不同的。

在澄清评论后编辑2015-03-30

  

假设我将AST序列化为字节流,通过套接字发送,然后将其反序列化为用另一种语言编写的程序中的对象树。使用JSONYAMLXML这些是用于序列化和反序列化任意数据的简单,相当标准的语言,然后以所需的语言为它们找到解析器。我认为这在技术上是可行的

具有具体编程语言的具体简单子集,让我们说一个具体的procedural language,例如Tiny C,您可以在一台计算机上构建它的解析树并将它们发送到另一台计算机以“解释”。 Google查询ast intermediate representation可以为您提供一些提示,例如http://icps.u-strasbg.fr/~pop/gcc-ast.htmlhttp://lambda-the-ultimate.org/node/716,但这与您AST的原始任何语言和Java中的通用解释程序不同/ p>

  

我正在进行一项实验

asm.js是“解析程序的现代版本,在一台机器上的语言中,并将其发送到另一台机器来解释”问题。另一台机器是任何现代Web浏览器,序列化格式是JavaScript的子集。在这个星球上有数十亿的网络浏览器,使用它的实验既有商业上的好处,也有用,因为这个项目欢迎来自像你这样的人的进一步支持或研究(?)

另见:

答案 2 :(得分:0)

回应Rici的回答:简短回答,不。

这个想法不止一次尝试过。通常它失败至少是因为你无法为“添加”定义单个AST节点,这对所有语言都意味着一件事。 语义只是简单的不同,你必须能够在发现它的特定语言环境中区分运算符的含义。还有很多其他的麻烦,比如同意详细信息。表示(树?DAG?图?)和携带多少信息(AST?符号表?控制流程?......)

人们一直在努力。

对象管理组的规范为Abstract Syntax Tree Model,它试图定义通用AST。 OMG发现的是,为了实现这一点,除了他们的必杀技风格的“通用AST模型”(ick,“GASTM”)之外,他们还需要有所谓的“特定AST模型”(“SASTM”),例如, 。特定于语言的AST,甚至是该语言的特定解析器,以便能够准确地解释运算符和操作数的含义,如该解析器所产生的。

[我构建了一个同时处理多种语言的工具。它通过基本上用运算符(例如“+”)和应该解释运算符的“域”(符号系统)标记每个节点来解决节点意义的问题。实际上,这与SASTM解决方案相同。我们不相信GASTM,所以不要理会它。]。