Python CST 和AST 类似之处的详细介介绍
你在计算机相关操作中是否遇到过语法分析所获得的中间结果例如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中:
相关推荐
夜斗不是神 2020-11-17
huavhuahua 2020-11-20
Yasin 2020-11-16
xiaoseyihe 2020-11-16
千锋 2020-11-15
diyanpython 2020-11-12
chunjiekid 2020-11-10
wordmhg 2020-11-06
YENCSDN 2020-11-17
lsjweiyi 2020-11-17
houmenghu 2020-11-17
Erick 2020-11-17
HeyShHeyou 2020-11-17
以梦为马不负韶华 2020-10-20
lhtzbj 2020-11-17
pythonjw 2020-11-17
dingwun 2020-11-16
lhxxhl 2020-11-16