使用带有python AST的Control.Lens.Plated

时间:2017-11-20 23:18:05

标签: haskell abstract-syntax-tree lens

我试图学习使用电镀来转换和搜索由language-python(https://hackage.haskell.org/package/language-python-0.5.4/docs/Language-Python-Common-AST.html)生成的python AST

简要总结一下类型:

  • 模块是一系列陈述
  • 语句可以包含更多语句或表达式
  • 表达式可以包含更多表达式,标识或运算符

我创建了一个hello world来开始使用这两个库。这是我的代码,它定义了python AST类型子集的板块:

{-# LANGUAGE FlexibleInstances#-}
module Lib
    ( someFunc
    ) where
import Language.Python.Version3.Parser
import Language.Python.Common.Token
import Language.Python.Common.AST
import Language.Python.Common.SrcLocation
import Control.Lens.Plated
import Data.Data.Lens
import Language.Python.Common.Pretty
import Language.Python.Common.PrettyAST


instance Plated (Statement SrcSpan) where
  plate = uniplate

instance Plated (Expr SrcSpan) where
  plate = uniplate

instance Plated (Ident SrcSpan) where
  plate = uniplate

instance Plated (Op SrcSpan) where
  plate = uniplate

extract (Right (x, _)) = x

someFunc :: IO ()
someFunc = do
  putStrLn $ show $ concatMap (map prettyText) $ universe $ extract $ parseStmt "2*(1+x)" "file.py"
  putStrLn $ show $ map prettyText $ universe $ extract $ parseExpr "2*(1+x)" "file.py"

该程序的输出是

["2 * (1 + x)"]
["2 * (1 + x)","2","(1 + x)","1 + x","1","x"]

我看到的问题是镀层只能看到与根节点一致的类型。如果我以一个语句作为我的根节点开始,它不会查看作为语句子句的表达式。在我查看表达式的第二种情况下,它似乎下降并找到子表达式。但是,它没有向我展示作为表达子项的运算符或身份类型。

如何让板块下降到具有混合类型的数据结构中?或者我使用了错误的工具?

0 个答案:

没有答案