我正計劃為某種語言撰寫決議器。我非常有信心可以在 Parsec 中拼湊出一個決議器而沒有太多麻煩,但我考慮在 AST 中包含注釋,以便最終實作代碼格式化程式。
起初,向 AST 型別添加一個額外的引數似乎是一個合適的想法(這基本上是這個答案中建議的)。例如,而不是擁有
data Expr = Add Expr Expr | ...
一個人會
data Expr a = Add a Expr Expr
并a用于任何注釋(例如,用于運算式之后的注釋)。
然而,也有一些不那么令人興奮的案例。該語言具有類似 C 的注釋 ( // ..., /* .. */) 和一個簡單的 for 回圈,如下所示:
for (i in 1:10)
{
... // list of statements
}
現在,除了正文之外,至少有一些10地方可以放置一個(或多個)評論:
/*A*/ for /*B*/ ( /*C*/ i /*E*/ in /*F*/ 1 /*G*/ : /*H*/ 10 /*I*/ ) /*J*/
{ /*K*/
...
換句話說,雖然 for 回圈以前可以方便地表示為一個識別符號 ( i)、兩個運算式 ( 1& 10) 和一個陳述句串列(主體),但我們現在至少必須包含10更多引數或注釋記錄。這很快就會變得丑陋和混亂,所以我想知道是否有更好的方法來處理這個問題。我當然不是第一個想要撰寫保留注釋的代碼格式化程式的人,所以必須有一個不錯的解決方案,或者撰寫格式化程式就那么混亂?
uj5u.com熱心網友回復:
您可能只需要兩個通用的評論產品就可以捕獲其中的大部分職位:
Expr -> Comment Expr
Stmt -> Comment Stmt
這似乎應該肯定地捕獲評論 A、C、F、H、J 和 K;也可能 G 取決于您的語法到底是什么樣的。制作中只剩下三個需要處理的地方for(可能四個,其中一個隱藏在Range這里):
Stmt -> "for" Comment "(" Expr Comment "in" Range Comment ")" Stmt
換句話說:每個文字字串之前都有一個,但第一個。最終似乎并不太繁重。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517158.html
標籤:哈斯克尔
上一篇:Haskell中的堆疊
