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

开发 后端
提起Python CST你对其是否算是头一次见面?是否对 Python CST 的实际相关应用与相关代码不算太熟悉?如果你想了解相关的内容就点击以下的文章即可。

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

 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则是:

 

  1. (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中:

 

  1. typedef struct _node {  
  2. short n_type;  
  3. char *n_str;  
  4. int n_lineno;  
  5. int n_col_offset;  
  6. int n_nchildren;  
  7. struct _node *n_child;  
  8. } node;  
  9. Field  
  10. Description  
  11. n_type   

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

n_str

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

n_lineno

对应的行号

n_col_offset

列号

n_nchildren

子结点的个数

n_child

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

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

 

  1. PyAPI_FUNC(node *) PyNode_New(int type);  
  2. PyAPI_FUNC(int) PyNode_AddChild(node *n, int type,  
  3. char *str, int lineno, int col_offset);  
  4. PyAPI_FUNC(void) PyNode_Free(node *n);  
  5. /* Node access functions */  
  6. #define NCH(n) ((n)->n_nchildren)  
  7. #define CHILD(n, i) (&(n)->n_child[i])  
  8. #define RCHILD(n, i) (CHILD(n, NCH(n) + i))  
  9. #define TYPE(n) ((n)->n_type)  
  10. #define STR(n) ((n)->n_str)  
  11. /* Assert that the type of a node is what we expect */  
  12. #define REQ(n, type) assert(TYPE(n) == (type))  
  13. PyAPI_FUNC(void) PyNode_ListTree(node *);   

 

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

【编辑推荐】

  1. Python编程语言在Zope软件开发中具体应用
  2. Python语言中常用的四种工具的介绍
  3. Python语言功能中的宏编程语言的实际操作方案介绍
  4. mod_python在性能上要优于传统CGI的缘由
  5. Python中文转换url编码的实际操作步骤介绍
责任编辑:佚名 来源: 互联网
相关推荐

2010-03-25 13:19:57

Python_ast.

2009-12-28 09:51:17

Fedora GNOM

2010-03-26 17:17:37

Python特色

2011-06-30 10:20:38

JSFMVC

2011-07-08 16:24:53

VOPO

2009-06-24 13:50:29

JSF和MVC

2010-02-22 16:16:14

Python语法

2021-11-14 22:06:48

JavaPython方式

2011-07-22 16:50:05

JAVA

2009-07-03 11:21:43

Servlet和JSPJSP路径

2009-08-03 18:49:17

C#和Java

2009-09-02 09:44:01

JSP和JavaBea

2010-03-09 15:15:02

Python字符串类型

2010-03-10 19:25:04

python多线程

2010-02-23 10:32:20

Python 脚本

2010-02-22 17:54:07

Python工具

2010-03-11 11:07:37

Python函数参数

2010-03-25 16:51:12

Python程序

2020-06-29 14:10:28

JVM参数配置

2011-07-21 17:02:48

JAVA模式框架
点赞
收藏

51CTO技术栈公众号