簡體   English   中英

在Ruby中構造AST的慣用方式是什么?

[英]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作為哈希值,但是如果正確設置它,則可以獲取自定義域對象。

散列大多僅用於哈希表,因為它們易於實現,我認為在所有其他方面,它們可能更糟。 哈希只是捷徑。 但可以肯定的是,紅寶石中經常使用一種。

毫無必要,沒有達成共識的“紅寶石”方法。 對每種類型的子表達式使用單獨的類將被視為“面向對象更多”。 它可能比使用哈希更快或更慢的性能。 實施可能會花費更多的工作,但可能不會。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM