python ast_Python CST 和AST 类似之处的详细介介绍

本文详细介绍了Python中的CST(抽象语法树)和AST(抽象语法树)的区别。CST是语法分析的直接产物,包含大量冗余信息,而AST则更简洁,直接对应语义。Python的语法分析生成CST,然后通过PyAst_FromNode转换为AST。CST的Node结构和相关操作函数也在文中进行了讲解。
摘要由CSDN通过智能技术生成

你在计算机相关操作中是否遇到过语法分析所获得的中间结果例如CST,你想知道CST的实际相关应用吗?下面的文章是针对 Python CST 的实际相关应用与相关代码的详细介绍,忘你会从中得到自己想要的东西。

Python CST 和AST 类似,都是语法分析所获得的中间结果。他们的不同之处在于,CST直接对应语法分析的匹配的过程,是直接生成的,含有大量冗余信息。而AST省略了中间的冗余信息,直接对应实际的语义,也就是分析的结果。用例子说明要清楚一些:

假设有这样一个表达式a,

Python CST是这样的:(->表示从父结点到子结点)

file_input ->stmt ->simple_stmt ->small_stmt ->expr_stmt ->testlist ->test ->or_test ->and_test

->not_test ->comparison ->expr ->xor_expr ->and_expr ->shift_expr ->arith_expr ->term ->

factor ->power ->atom ->(NAME, “a”)

而AST则是:

(stmt_ty, expr_kind) ->(expr_ty, name_kind) ->(“a”)

可以看到CST表述了整个分析a的过程,从file_input一直推导到***的NAME,每一步推导都成了树的结点,而大部分信息都可以说是无用的。AST的结构要简单和直接的多,直接表明a是一个表达式语句(假定a是一个单独的语句),内容是一个标示符,值为”a”。Python的语法分析生成的是 Python CST而非AST,之后Python会调用PyAst_FromNode将CST转换为AST。

CST的结点称为Node,其结构定义在node.h中:

typedef struct _node {

short n_type;

char *n_str;

int n_lineno;

int n_col_offset;

int n_nchildren;

struct _node *n_child;

} node;

Field

Description

n_type

结点类型,终结符定义在token.h中,而非终结符定义在graminit.h中

n_str

结点所对应的字符串的内容

n_lineno

对应的行号

n_col_offset

列号

n_nchildren

子结点的个数

n_child

子结点数组,动态分配内存

Python提供了下面的函数/宏来操作CST,同样定义在node.h中:

PyAPI_FUNC(node *) PyNode_New(int type);

PyAPI_FUNC(int) PyNode_AddChild(node *n, int type,

char *str, int lineno, int col_offset);

PyAPI_FUNC(void) PyNode_Free(node *n);

/* Node access functions */

#define NCH(n) ((n)->n_nchildren)

#define CHILD(n, i) (&(n)->n_child[i])

#define RCHILD(n, i) (CHILD(n, NCH(n) + i))

#define TYPE(n) ((n)->n_type)

#define STR(n) ((n)->n_str)

/* Assert that the type of a node is what we expect */

#define REQ(n, type) assert(TYPE(n) == (type))

PyAPI_FUNC(void) PyNode_ListTree(node *);

以上就是对 Python CST 和AST 类似,都是语法分析所获得的中间结果。他们的不同之处在于,CST直接对应语法分析的匹配的过程,是直接生成的,含有大量冗余信息。而AST省略了中间的冗余信息,直接对应实际的语义,也就是分析的结果。用例子说明相关的内容的介绍,忘你会有所收获。

【编辑推荐】

【责任编辑:孙巧华 TEL:(010)68476606】

点赞 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值