在Ruby中构造AST的惯用方法是什么?

时间:2016-02-10 20:33:40

标签: ruby parsing abstract-syntax-tree

我正在编写一个简单语法的解析器来学习解析技术。

例如,如果我有以下语法:

exp    := if-exp ...
if-exp := if bool-exp then exp else exp
....

在支持代数数据类型的语言中,我可以这样做:

type exp = 
| If-exp of bool-exp * exp * exp
| ....

我发现Java example为每个子表达式创建一个类:

Class If_exp
  @bool_exp
  @then_exp
  @else_exp

 ...

end

" How to manually construct an AST?"使用哈希来构造AST。

哪种方式更好?什么是Ruby方式?

2 个答案:

答案 0 :(得分:0)

我认为不一定是一种“习惯的方式”。仅使用Hashes vs自定义域对象,每个对象都有pro和con。自定义域对象(表示每个节点类型的类)可能更好,但需要做更多工作才能实现。

Parslet是一个易于使用的ruby库,用于解析和创建AST。虽然谨防Parslet有点慢,但不应该在性能重要的地方使用。我认为Parslet默认会给你一个AST作为哈希,但如果你设置正确,你可以获得自定义域对象。

哈希大多只是因为它们易于实现而被使用,我认为在所有其他方面它们可能更糟糕。哈希只是一个捷径。但肯定会在红宝石中经常使用。

没有任何共识“红宝石”的方式来做到这一点。对每种类型的子表达式使用单独的类将被视为“更面向对象”。它可能会或可能不会比使用哈希更快或更慢。它可能需要更多的工作才能实现,但也可能不会。

答案 1 :(得分:0)