Lex Yacc C口译员

时间:2013-08-25 15:34:48

标签: bison interpreter yacc flex-lexer

我正在使用Flex和Bison在C语言中编写一个编程语言的解释器。我不知道如何生成AST,我想知道如果我只是将代码解释为解释器看到它会有什么样的性能差异?

我还想知道Bison是否会在幕后制作一个AST,或者不是我在某些论坛上听到过它,而且在其他网站上我看过人们创建自己的?

提前致谢, 弗朗西斯

2 个答案:

答案 0 :(得分:2)

Bison没有自己生成AST,但它确实有一些功能可以帮助你编写构建AST的代码。

首先,%union语句允许您定义一个表示您将在AST中使用的节点类型的联合,因此您可以为变量声明,表达式等内容定义类型,等

然后,它允许您指定union成员与识别特定模式时执行的代码相关联,因此您可以进行类型检查,即使C编译器基本上不对联合进行类型检查。

就性能差异而言:它几乎无法猜测。通常首先构建AST是为了优化,但是优化的确切程度取决于您解释的语言和(特别是)您编写的代码。

答案 1 :(得分:2)

re:如何使用Bison构建AST:

有关从Bison构建AST的简单示例,请参阅此站点:EPaperPress

另见Mitsuhisa Sato's example(这是使用Bison的简单解释器的代码)。

re:使用AST与直接口译的口译员的表现差异。

你可以用很多方法编写一个解释器 - 下面的列表是从(通常)最慢到最快的性能(注意对于琐碎的程序,可能没什么区别。但对于重复相同代码多次的程序,那里可以是一个很大的区别):

  1. 直接解释
  2. 进行一些预处理,例如,标记和剥离注释
  3. 构建AST并解释
  4. 转换为中间代码 - 字节代码 - 通过AST或不转换 - 并解释
  5. 对于速度比较,您可以执行以下操作:

    转到:Tom Gibson's Tiny C site

    下载相应的口译员 - Tom Gibson's Tiny C for DOS, maybe WindowsTom Gibson's Tiny C for Linux

    这是一个纯粹的翻译 - 上面的#1。写一个计算素数或类似东西的小程序,然后计时。

    来自佐藤网站的'Tiny C'包括一个解释器,它解释了AST - #3。为它写一个类似的程序,然后计时。

    最后,从Marc Feeley's Tiny C获取另一个Tiny C。

    这个创建一个AST,将其转换为字节代码,然后解释 - 上面的#4。为这个重写你的小程序,及时。

    我希望这有帮助!