[英]What is the idiomatic way to construct an AST in Ruby?
我正在為一個簡單的語法創建解析器,以學習解析技術。
例如,如果我有以下語法:
exp := if-exp ...
if-exp := if bool-exp then exp else exp
....
在支持代數數據類型的語言中,我可以執行以下操作:
type exp =
| If-exp of bool-exp * exp * exp
| ....
我發現的一個Java示例為每個子表達式創建一個類:
Class If_exp
@bool_exp
@then_exp
@else_exp
...
end
“ 如何手動構造AST? ”使用散列來構造AST。
哪種方法更好? Ruby的方式是什么?
我認為這不一定是“慣用方式”。 僅使用哈希與自定義域對象,每個對象都有優缺點。 自定義域對象(代表每種節點類型的類)可能更好,但是要執行更多的工作。
Parslet是一個易於使用的ruby庫,用於解析和創建AST。 盡管當心Parslet有點慢,並且不應該在性能很重要的地方使用。 我認為默認情況下,Parslet將為您提供AST作為哈希值,但是如果正確設置它,則可以獲取自定義域對象。
散列大多僅用於哈希表,因為它們易於實現,我認為在所有其他方面,它們可能更糟。 哈希只是捷徑。 但可以肯定的是,紅寶石中經常使用一種。
毫無必要,沒有達成共識的“紅寶石”方法。 對每種類型的子表達式使用單獨的類將被視為“面向對象更多”。 它可能比使用哈希更快或更慢的性能。 實施可能會花費更多的工作,但可能不會。
Ruby 2.6添加了RubyVM :: AST模塊
https://blog.bigbinary.com/2018/10/02/ruby-2-6-adds-rubyvm-ast-module.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.