温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Python中CST 和AST类有哪些相同的地方

发布时间:2021-07-10 15:50:55 来源:亿速云 阅读:484 作者:Leah 栏目:编程语言

这篇文章给大家介绍Python中CST 和AST类有哪些相同的地方,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

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

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

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

  1. 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 -> 

  2. 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类有哪些相同的地方就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI