Haskell 在二级树型中使用Uniplate
我正处于用Haskell为类C语言编写解析器的开始阶段。我已经搞定了AST数据类型,在深入研究语法分析器之前,我正在通过在AST本身上编写一些简单的查询来处理它 我的AST围绕两种类型展开:语句(没有值,如Haskell 在二级树型中使用Uniplate,haskell,parsec,Haskell,Parsec,我正处于用Haskell为类C语言编写解析器的开始阶段。我已经搞定了AST数据类型,在深入研究语法分析器之前,我正在通过在AST本身上编写一些简单的查询来处理它 我的AST围绕两种类型展开:语句(没有值,如if/else)和表达式(有值,如文本或二进制操作)。所以它看起来像这样(当然是大大简化了): 数据语句 =返回支出 |If表达式 数据表达 =文字整型 |变量字符串 |二进制表达式 假设我想得到表达式中使用的所有变量的名称。使用uniplate,您可以轻松: varsInExpressio
if
/else
)和表达式(有值,如文本或二进制操作)。所以它看起来像这样(当然是大大简化了):
数据语句
=返回支出
|If表达式
数据表达
=文字整型
|变量字符串
|二进制表达式
假设我想得到表达式中使用的所有变量的名称。使用uniplate,您可以轻松:
varsInExpression exp=concat[s | Variable s这似乎是双板的一个很好的用例。我依赖较慢的Data.Data
方法,但它使这段代码变得非常简单
{-# LANGUAGE DeriveDataTypeable #-}
import Data.Data
import Data.Typeable
import Data.Generics.Uniplate.Data
data Statement
= Return Expression
| If Expression Expression
deriving(Data, Typeable)
data Expression
= Literal Int
| Variable String
| Binary Expression Int Expression
deriving(Data, Typeable)
vars :: Statement -> [String]
vars stmt = [ s | Variable s <- universeBi stmt]
哦!那太棒了。我怀疑双板可能与此有关,但没有为universeBi
生成Haddock文档,谷歌也没有帮我。谢谢你:)。
biplate :: from -> (Str to, Str to -> from)