面向人的ast解析器/unparser
horast-rereleased的Python项目详细描述
面向人类的抽象语法树(AST)语法分析器/不丢弃注释的Python3的unparser。在
此包提供新的AST节点类型(Comment和Directive),它们继承自typed中的节点_ast.ast3型模块。 此外,它还为扩展的AST提供了解析器和unparser的实现 简单易读的代码生成。在
如何使用此软件包的简单示例:
fromhorastimportparse,unparsetree=parse("""a = 1 # a equals one after this""")print(unparse(tree))# this will print the code with original comment
更多示例见examples.ipynb。在
技术细节
解析器基于内置的标记化模块,以及社区包asttokens和typed-ast。在
Unparser本质上是静态类型包Unparser类的扩展。在
horast提供和处理的节点如下所示。在
评论
当整行和行尾注释在外部时,它们被正确地解析/取消分析 多行表达式。在
目前,多行表达式中的注释处理仅部分实现。在
BlockComment
尚未实现。
此节点类型用于在 单个AST节点,因此简化了对大型注释块的处理。在
指令
因为Python没有提供直接的方法来用代码来传递指令, 以下列任何前缀开头的注释将不会被分类 作为典型评论,但作为指示:
- 如果
- 其他
- 结束语
- 定义
- 未定义
- ifdef公司
- ifndef公司
然而,在Python代码中,它们仍然像往常一样保留注释。在
例如,下面代码中的注释都将被归类为指令。在
^{pr2}$但是,当作为Python执行时,debugging将始终以^{tt2}结尾$ 因为指令在Python中保留为通常的注释,因此 它们被忽略了。在
因此,Directive节点不是用来启用 Python,至少现在是这样。在
注意:前缀已正确检查。请参见以下示例:
#if something# if some other thing
第一行中的注释将成为Directiveobject,而 第二个like将变成Commentobject。在
目前,此节点旨在实现 Python和其他语言,帮助从Python AST生成代码 在其他语言中–一个这样的用例是 *transpyle* project。在
Pragma
Pragma节点遵循与Directive节点相同的一般规则,即它们是 作为注释存储在Python代码中,但注释将被分类为pragma 如果前缀为预定义前缀:
- " pragma:"
此外,Pragma的两个子类在horast中定义,每个子类都有 基于泛型pragma前缀的own前缀:
- OpenMpPragmaclass定义前缀" pragma: omp",并存储OpenMP pragma。在
- OpenAccPragmaclass定义前缀" pragma: acc",并存储OpenACC杂注。在
下面的代码片段包含所有3种pragma类型。在
# pragma: onceuse_openmp=Trueuse_openacc=True...a,b=np.ndarray(...)c=np.zeros(...)# pragma: acc parallel copyin(a,b) copyout(c)# pragma: acc loop gangforyinrange(ymax):# type: np.int32# pragma: acc loop workerforiinrange(imax):# type: np.int32# pragma: acc loop vector reduction(+: c[y][x])forxinrange(xmax):# type: np.int32c[y,x]+=a[y,i]*b[i,x]# pragma: acc end parallel...# pragma: omp parallel doforiinrange(input_data.size):# type: int# here we compute spam spam spamheavy_compute(input_data[i])...
因此,在上面的例子中:
- 所有以" pragma: omp"开头的注释都成为OpenMpPragma对象
- 所有以" pragma: acc"开头的注释都成为OpenAccPragma对象
- 所有其他以" pragma:"开头的注释都变成Pragma对象
- 忽略类型注释,并且
- 所有其他注释都成为Comment对象。在
此外,horast模块提供了一个可扩展的基础设施来定义 自定义Pragma子类,允许用户为定义自己的pragma 实验。提供的OpenMP和OpenACC pragma定义提供 作为如何使用此功能的示例。在
包括
与pragma的处理方式类似,如果注释以^{tt21}开头$ 前缀,它将被归类为一种特殊的include direct伊夫。在
同样,这将在Python代码中作为注释保存,但它很有用 为了增强Python和其他语言之间的语法兼容性,特别是 静态编译语言。在
- 项目
标签: