吐槽:出的题目没有大佬做吗?俺很伤心哇

从本周开始我们正式进入Python的编译和解释环节。今天我们先来谈谈Python运行环节前的词法执行环节。

由于这部分开始都比较复杂,我会采用实际的例子来逐步分析。两章一篇,第一部分讲大致流程,第二部分讲详细实现过程。

词法分析的流程

本质上,Python提供了两种执行Python的方式:

PyRun_File系列

PyRun_String系列

故名思义,前者接受一个py文件进行编译->解释执行,而后者直接对一个符合Python语法的字符串进行编译->解释执行的过程。

为了减少篇幅,我们以后者进行举例,假设我们有一串Python代码,如下所示:

k = 5

print(k)

当我们键入上述代码后,Python会初始化运行环境,设置一系列的环境参数,创建Python虚拟机和对应的线程。(这块等我们实际讲到Python的虚拟机再深入探讨)

准备工作都OK以后,主要的工作流程都在token.h/.c里面了,

tok_state

词法解析通俗来讲是一个非常巨大的状态迁移过程,比如我们要记录当前解析到什么字符,这个字符是否可以和上一个合并或者开始新的状态解析。如果是新的状态解析,之前解析的字符是否需要进行回退等等。

因此,Python为了维护解析整个Python代码,设计了tok_state这个结构体:

struct tok_state {

/* Input state; buf <= cur <= inp <= end */

/* NB an entire line is held in the buffer */

char *buf; /* Input buffer, or NULL; malloc'ed if fp != NULL */

char *cur; /* Next character in buffer */

char *inp; /* End of data in buffer */

char *end; /* End of input buffer if buf != NULL */

char *start; /* Start of current token if not NULL */

int done; /* E_OK normally, E_EOF at EOF, otherwise error code */

/* NB If done != E_OK, cur must be == inp!!! */

FILE *fp; /* Rest of input; NULL if tokenizing a string */

int tabsize; /* Tab spacing */

int indent; /* Current indentation index */

int indstack[MAXINDENT]; /* Stack of indents */

int atbol; /* Nonzero if at begin of new line */

int pendin; /* Pending indents (if > 0) or dedents (if < 0) */

char *prompt, *nextprompt; /* For interactive prompting */

int lineno; /* Current line number */

int level; /* () [] {} Parentheses nesting level */

/* Used to allow free continuations inside them */

/* Stuff for checking on different tab sizes */

const char *filename; /* For error messages */

int altwarning; /* Issue warning if alternate tabs don't match */

int alterror; /* Issue error if alternate tabs don't match */

int alttabsize; /* Alternate tab spacing */

int altindstack[MAXINDENT]; /* Stack of alternate indents */

/* Stuff for PEP 0263 */

int decoding_state; /* -1:decoding, 0:init, 1:raw */

int decoding_erred; /* whether erred in decoding */

int read_coding_spec; /* whether 'coding:...' has been read */

char *encoding;

int cont_line; /* whether we are in a continuation line. */

const char* line_start; /* pointer to start of current line */

#ifndef PGEN

PyObject *decoding_readline; /* codecs.open(...).readline */

PyObject *decoding_buffer;

#endif

const char* enc;

const char* str;

const char* input; /* Tokenizer's newline translated copy of the string. */

};

第一眼看上去比较复杂,令人摸不着头脑,实际上我们只要关注如下几个字段即可:

buf,字符串本身(当然在文件模式下就指向文件的缓冲区)

cur,即将解析的下一个字符。

inp,词法分析处于效率考虑,读取字符串(文件内容)是以行为单位进行读取。

start,当前识别的token的起始位置。

在字符串模式下,buf,cur,inp都是相同的。

tok->buf = tok->cur = tok->end = tok->inp = (char*)str;

有一点需要注意的是,Python可以在文件头表明支持的encode模式,比如如下代码:

#!/usr/bin/python

# -*- coding: UTF-8 -*-

print "你好,世界";

因此,在处理词法分析之前,需要做相应的解码记录操作。

static const char *

decode_str(const char *input, int single, struct tok_state *tok)

python的词法_Python的词法分析相关推荐

  1. Python学习教程(Python学习视频_Python学些路线):Day05 总结和练习

    Python学习教程(Python学习视频_Python学些路线):总结和练习 练习清单 寻找"水仙花数". 寻找"完美数". "百钱百鸡" ...

  2. 视频教程-快速入门Python基础教程_Python基础知识大全-Python

    快速入门Python基础教程_Python基础知识大全 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥99.00 立即 ...

  3. python的词法结构(行、注释、文件编码、标识符、关键字和字面值)

    python3.6版本 1.行结构 1.1 物理行 python的物理行以一个行终止符为界限.在源文件中或者字符串中,支持使用任何标准平台上的行终止序列--Unix的LF(换行)或者Windows下的 ...

  4. Python学习教程(Python学习视频_Python学习路线):Day04循环结构

    Python学习教程(Python学习视频_Python学习路线):循环结构 循环结构的应用场景 如果在程序中我们需要重复的执行某条或某些指令,例如用程序控制机器人踢足球,如果机器人持球而且还没有进入 ...

  5. 视频教程-快速入门Python基础教程_Python基础进阶视频-Python

    快速入门Python基础教程_Python基础进阶视频 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥199.00 立 ...

  6. Python学习教程(Python学习路线_Python基础学习教程_Python视频教程):初学者新手怎样快速入门Python

    Python学习教程(Python学习路线_Python基础学习教程_Python视频教程):初学者新手怎样快速入门Python? 人生苦短,我用Python!!!短短几个字,现在在各大学习类平台随处 ...

  7. python开发编译器_python开发编译器

    引言 最近刚刚用python写完了一个解析protobuf文件的简单编译器,深感ply实现词法分析和语法分析的简洁方便.乘着余热未过,头脑清醒,记下一点总结和心得,方便各位pythoner参考使用. ...

  8. PLY文档翻译——利用Python进行词法和语法分析

    PLY (Python Lex-Yacc) 文章目录 1. Preface and Requirements 2. Introduction 3. PLY Overview 4. Lex 4.1 Le ...

  9. python自然语言处理_Python自然语言处理

    Python自然语言处理 作者:(印)雅兰·萨纳卡(Jalaj Thanaki) 著 出版日期:2018年08月 文件大小:30.79M 支持设备: ¥50.00在线试读 适用客户端: 言商书局 iP ...

最新文章

  1. 报错: eclipse加载maven工程提示pom.xml无法解析org.apache.maven.plugins:maven-resources-plugin:2.3.2...
  2. OneAPM大讲堂 | 提高JavaScript性能的30个技巧
  3. python实现顺序查找和哈希查找
  4. VTK:可视化之SideBySideViewports
  5. MyBatis常用配置解析-Properties标签
  6. php设置html全局路径_PHPCMS V9 URL去掉或修改/html路径的方法
  7. 2017.9.12 连通数 失败总结
  8. String StringBuilder StringBuffer
  9. [摘译]js内存泄漏常见的四种情况
  10. python第一个公开发行版_python之基础篇(一)
  11. 计算机基础表格函数基础知识大全,计算机基础-EXCEL公式和函数
  12. 写CSDN博客时,调节字体大小、颜色及其他样式的常用操作方法
  13. html5考试总结300字,期中考试总结300字(优秀篇)
  14. mac + win ,用python一行代码批量下载哔哩哔哩视频
  15. SEP8266 由零开始(一),最小系统,下载,与WiFi建立
  16. linux系统怎么制作win10,win10 + linux 制作双系统教程(我本身是win10系统)
  17. cgb2109-day02
  18. 旋转编码器怎么调零点?
  19. 数据可视化之折线图让数据变得更直观易懂
  20. webstorm和网站制作

热门文章

  1. html中的列表标签
  2. lv655液晶电视东芝
  3. c语言 for循环 逗号,vs中for语句中的逗号怎么使用?
  4. PowerPoint处理图表3个技巧
  5. ifstream和ofstream的理解
  6. 实验2-2-9 计算火车运行时间 (15 分)
  7. 【工作一年总结】做自己喜欢的事时是会发光的,可是老天,能让这光芒更强烈些吗?
  8. 推荐几个好用的redis可视化工具
  9. S32K Bootloader
  10. DDK学习笔记(转)