我正在编写一个简单语法的解析器来学习解析技术。
例如,如果我有以下语法:
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方式?
答案 0 :(得分:0)
我认为不一定是一种“习惯的方式”。仅使用Hashes vs自定义域对象,每个对象都有pro和con。自定义域对象(表示每个节点类型的类)可能更好,但需要做更多工作才能实现。
Parslet是一个易于使用的ruby库,用于解析和创建AST。虽然谨防Parslet有点慢,但不应该在性能重要的地方使用。我认为Parslet默认会给你一个AST作为哈希,但如果你设置正确,你可以获得自定义域对象。
哈希大多只是因为它们易于实现而被使用,我认为在所有其他方面它们可能更糟糕。哈希只是一个捷径。但肯定会在红宝石中经常使用。
没有任何共识“红宝石”的方式来做到这一点。对每种类型的子表达式使用单独的类将被视为“更面向对象”。它可能会或可能不会比使用哈希更快或更慢。它可能需要更多的工作才能实现,但也可能不会。
答案 1 :(得分:0)
Ruby 2.6添加了RubyVM :: AST模块
https://blog.bigbinary.com/2018/10/02/ruby-2-6-adds-rubyvm-ast-module.html