我试图学习使用电镀来转换和搜索由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"]
我看到的问题是镀层只能看到与根节点一致的类型。如果我以一个语句作为我的根节点开始,它不会查看作为语句子句的表达式。在我查看表达式的第二种情况下,它似乎下降并找到子表达式。但是,它没有向我展示作为表达子项的运算符或身份类型。
如何让板块下降到具有混合类型的数据结构中?或者我使用了错误的工具?