pythonlex
1. python webkit怎么安装啊
下载源码
安装
mkdir build
cd build
../autogen.sh
出现错误提示:
automake: cannot open < gtk-doc.make: No such file or directory
sudo apt-get install gtk-doc-tools
继续第二步
../autogen.sh
出现错误:
configure: error: You need the 'flex' lexer generator to compile WebKit
google 一下关于 flex的资料
Flex 是一个高效、免费的开源框架,可用于构建具有表现力的 Web 应用程序,这些应用程序利用 Adobe Flash Player和 Adobe AIR, 运行时跨浏览器、桌面和操作系统实现一致的部署。虽然只能使用 Flex 框架构建 Flex 应用程序,但Adobe Flash Builder™(之前称为 Adobe Flex Builder™)软件可以通过智能编码、交互式遍历调试以及可视设计用户界面布局等功能加快开发。
网址: http://www.adobe.com/devnet/flex/flex-sdk-download-all.html
下载之后解压缩,发现不是我这里想要的source
网络了一下 flex ,在第一页的最下面一个网页,标题: flex: The Fast Lexical Analyzer
打开 http://flex.sourceforge.net/ 之后,看了一下介绍:
Flex is a tool for generating scanners. A scanner, sometimes called a tokenizer, is a program which recognizes lexical patterns in text. The flex program reads user-specified input files, or its standard input if no file names are given, for a description of a scanner to generate. The description is in the form of pairs of regular expressions and C code, called rules. Flex generates a C source file named, "lex.yy.c", which defines the function yylex(). The file "lex.yy.c" can be compiled and linked to proce an executable. When the executable is run, it analyzes its input for occurrences of text matching the regular expressions for each rule. Whenever it finds a match, it executes the corresponding C code.
下载之后,安装成功,执行 flex --version ,显示:flex 2.5.37,安装成功.
继续第二步
../autogen.sh
出现错误:configure: error: You need the 'gperf' hash function generator to compile WebKit
gperf网址:http://www.gnu.org/software/gperf/
安装 gperf:
wget http://ftp.gnu.org/pub/gnu/gperf/gperf-3.0.4.tar.gz
tar zxvf gperf-3.0.4.tar.gz
cd gperf-3.0.4/
./configure
make
make install
继续第二步
../autogen.sh
出现错误:configure: error: JPEG library (libjpeg) not found
IJG is an informal group that writes and distributes a widely used free library for JPEG image compression. The first version was released on 7-Oct-1991.
安装 jpeg library:
到http://www.ijg.org/找到下载源码的链接
wget http://www.ijg.org/files/jpegsrc.v8d.tar.gz
cd jpeg-8d/
./configure
make
sudo make install
安装成功
继续第二步
../autogen.sh
出现错误:configure: error: PNG library (libpng) not found
libpng: http://www.libpng.org/pub/png/libpng.html
安装:
wget http://downloads.sourceforge.net/project/libpng/libpng15/1.5.13/libpng-1.5.13.tar.xz
tar xvf libpng-1.5.13.tar.xz
cd libpng-1.5.13
./configure
make
sudo make install
安装成功
继续第二步
../autogen.sh
libpng的错误仍然出现: configure: error: PNG library (libpng) not found
观察了一下编绎的配制过程:
checking for libpng... no
checking for libpng14... no
checking for libpng12... no
checking for png_read_info in -lpng... no
configure: error: PNG library (libpng) not found
checking的是libpng1.4版本,而刚才安装的是libpng1.5版本
2. python代码运行助手怎么打开
python代码运行助手是能在网页上运行python语言的工具。因为python的运行环境在很多教程里都是用dos的,黑乎乎的界面看的有点简陋,所以出了这python代码运行助手,作为ide。
实际上,python代码运行助手界面只能算及格分,如果要找ide,推荐使用jupyter。jupyter被集成到ANACONDA里,只要安装了anacoda就能使用了。
回到这个问题:
1、要打开这运行助手首先要下载一个learning.py,如果找不到可以复制如下代码另存为“learning.py”,编辑器用sublime、或者notepad++。
#!/usr/bin/envpython3
#-*-coding:utf-8-*-
r'''
learning.py
APython3tutorialfromhttp://www.liaoxuefeng.com
Usage:
python3learning.py
'''
importsys
defcheck_version():
v=sys.version_info
ifv.major==3andv.minor>=4:
returnTrue
print('Yourcurrentpythonis%d.%d.PleaseusePython3.4.'%(v.major,v.minor))
returnFalse
ifnotcheck_version():
exit(1)
importos,io,json,subprocess,tempfile
fromurllibimportparse
fromwsgiref.simple_serverimportmake_server
EXEC=sys.executable
PORT=39093
HOST='local.liaoxuefeng.com:%d'%PORT
TEMP=tempfile.mkdtemp(suffix='_py',prefix='learn_python_')
INDEX=0
defmain():
httpd=make_server('127.0.0.1',PORT,application)
print('ReadyforPythoncodeonport%d...'%PORT)
httpd.serve_forever()
defget_name():
globalINDEX
INDEX=INDEX+1
return'test_%d'%INDEX
defwrite_py(name,code):
fpath=os.path.join(TEMP,'%s.py'%name)
withopen(fpath,'w',encoding='utf-8')asf:
f.write(code)
print('Codewroteto:%s'%fpath)
returnfpath
defdecode(s):
try:
returns.decode('utf-8')
exceptUnicodeDecodeError:
returns.decode('gbk')
defapplication(environ,start_response):
host=environ.get('HTTP_HOST')
method=environ.get('REQUEST_METHOD')
path=environ.get('PATH_INFO')
ifmethod=='GET'andpath=='/':
start_response('200OK',[('Content-Type','text/html')])
return[b'<html><head><title>LearningPython</title></head><body><formmethod="post"action="/run"><textareaname="code"style="width:90%;height:600px"></textarea><p><buttontype="submit">Run</button></p></form></body></html>']
ifmethod=='GET'andpath=='/env':
start_response('200OK',[('Content-Type','text/html')])
L=[b'<html><head><title>ENV</title></head><body>']
fork,vinenviron.items():
p='<p>%s=%s'%(k,str(v))
L.append(p.encode('utf-8'))
L.append(b'</html>')
returnL
ifhost!=HOSTormethod!='POST'orpath!='/run'ornotenviron.get('CONTENT_TYPE','').lower().startswith('application/x-www-form-urlencoded'):
start_response('400BadRequest',[('Content-Type','application/json')])
return[b'{"error":"bad_request"}']
s=environ['wsgi.input'].read(int(environ['CONTENT_LENGTH']))
qs=parse.parse_qs(s.decode('utf-8'))
ifnot'code'inqs:
start_response('400BadRequest',[('Content-Type','application/json')])
return[b'{"error":"invalid_params"}']
name=qs['name'][0]if'name'inqselseget_name()
code=qs['code'][0]
headers=[('Content-Type','application/json')]
origin=environ.get('HTTP_ORIGIN','')
iforigin.find('.liaoxuefeng.com')==-1:
start_response('400BadRequest',[('Content-Type','application/json')])
return[b'{"error":"invalid_origin"}']
headers.append(('Access-Control-Allow-Origin',origin))
start_response('200OK',headers)
r=dict()
try:
fpath=write_py(name,code)
print('Execute:%s%s'%(EXEC,fpath))
r['output']=decode(subprocess.check_output([EXEC,fpath],stderr=subprocess.STDOUT,timeout=5))
exceptsubprocess.CalledProcessErrorase:
r=dict(error='Exception',output=decode(e.output))
exceptsubprocess.TimeoutExpiredase:
r=dict(error='Timeout',output='执行超时')
exceptsubprocess.CalledProcessErrorase:
r=dict(error='Error',output='执行错误')
print('Executedone.')
return[json.mps(r).encode('utf-8')]
if__name__=='__main__':
main()
2,再用一个记事本写如下的代码:
@echooff
pythonlearning.py
pause
另存为‘运行.bat’
3、把“运行.bat”和“learning.py”放到同一目录下,
3. tensorlab 支持python接口吗
这又是一个 Awesome XXX 系列的资源整理,由 vinta 发起和维护。内容包括:Web框架、网络爬虫、网络内容提取、模板引擎、数据库、数据可视化、图片处理、文本处理、自然语言处理、机器学习、日志、代码分析等。
伯乐在线已在 GitHub 上发起“Python 资源大全中文版”的整理。欢迎扩散、欢迎加入。
GitHub - jobbole/awesome-python-cn: Python资源大全中文版
环境管理
管理 Python 版本和环境的工具
p – 非常简单的交互式 python 版本管理工具。
pyenv – 简单的 Python 版本管理工具。
Vex – 可以在虚拟环境中执行命令。
virtualenv – 创建独立 Python 环境的工具。
virtualenvwrapper- virtualenv 的一组扩展。
包管理
管理包和依赖的工具。
pip – Python 包和依赖关系管理工具。
pip-tools – 保证 Python 包依赖关系更新的一组工具。
conda – 跨平台,Python 二进制包管理工具。
Curdling – 管理 Python 包的命令行工具。
wheel – Python 分发的新标准,意在取代 eggs。
包仓库
本地 PyPI 仓库服务和代理。
warehouse – 下一代 PyPI。
Warehousebandersnatch – PyPA 提供的 PyPI 镜像工具。
devpi – PyPI 服务和打包/测试/分发工具。
localshop – 本地 PyPI 服务(自定义包并且自动对 PyPI 镜像)。
分发
打包为可执行文件以便分发。
PyInstaller – 将 Python 程序转换成独立的执行文件(跨平台)。
dh-virtualenv – 构建并将 virtualenv 虚拟环境作为一个 Debian 包来发布。
Nuitka – 将脚本、模块、包编译成可执行文件或扩展模块。
py2app – 将 Python 脚本变为独立软件包(Mac OS X)。
py2exe – 将 Python 脚本变为独立软件包(Windows)。
pynsist – 一个用来创建 Windows 安装程序的工具,可以在安装程序中打包 Python本身。
构建工具
将源码编译成软件。
buildout – 一个构建系统,从多个组件来创建,组装和部署应用。
BitBake – 针对嵌入式 linux 的类似 make 的构建工具。
fabricate – 对任何语言自动找到依赖关系的构建工具。
PlatformIO – 多平台命令行构建工具。
PyBuilder – 纯 Python 实现的持续化构建工具。
SCons – 软件构建工具。
交互式解析器
交互式 Python 解析器。
IPython – 功能丰富的工具,非常有效的使用交互式 Python。
bpython- 界面丰富的 Python 解析器。
ptpython – 高级交互式Python解析器, 构建于python-prompt-toolkit 之上。
文件
文件管理和 MIME(多用途的网际邮件扩充协议)类型检测。
imghdr – (Python 标准库)检测图片类型。
mimetypes – (Python 标准库)将文件名映射为 MIME 类型。
path.py – 对 os.path 进行封装的模块。
pathlib – (Python3.4+ 标准库)跨平台的、面向对象的路径操作库。
python-magic- 文件类型检测的第三方库 libmagic 的 Python 接口。
Unipath- 用面向对象的方式操作文件和目录
watchdog – 管理文件系统事件的 API 和 shell 工具
日期和时间
操作日期和时间的类库。
arrow- 更好的 Python 日期时间操作类库。
Chronyk – Python 3 的类库,用于解析手写格式的时间和日期。
dateutil – Python datetime 模块的扩展。
delorean- 解决 Python 中有关日期处理的棘手问题的库。
moment – 一个用来处理时间和日期的Python库。灵感来自于Moment.js。
PyTime – 一个简单易用的Python模块,用于通过字符串来操作日期/时间。
pytz – 现代以及历史版本的世界时区定义。将时区数据库引入Python。
when.py – 提供用户友好的函数来帮助用户进行常用的日期和时间操作。
文本处理
用于解析和操作文本的库。
通用
chardet – 字符编码检测器,兼容 Python2 和 Python3。
difflib – (Python 标准库)帮助我们进行差异化比较。
ftfy – 让Unicode文本更完整更连贯。
fuzzywuzzy – 模糊字符串匹配。
Levenshtein – 快速计算编辑距离以及字符串的相似度。
pangu.py – 在中日韩语字符和数字字母之间添加空格。
pyfiglet -figlet 的 Python实现。
shortuuid – 一个生成器库,用以生成简洁的,明白的,URL 安全的 UUID。
unidecode – Unicode 文本的 ASCII 转换形式 。
uniout – 打印可读的字符,而不是转义的字符串。
xpinyin – 一个用于把汉字转换为拼音的库。
Slug化
awesome-slugify – 一个 Python slug 化库,可以保持 Unicode。
python-slugify – Python slug 化库,可以把 unicode 转化为 ASCII。
unicode-slugify – 一个 slug 工具,可以生成 unicode slugs ,需要依赖 Django 。
解析器
phonenumbers – 解析,格式化,储存,验证电话号码。
PLY – lex 和 yacc 解析工具的 Python 实现。
Pygments – 通用语法高亮工具。
pyparsing – 生成通用解析器的框架。
python-nameparser – 把一个人名分解为几个独立的部分。
python-user-agents – 浏览器 user agent 解析器。
sqlparse – 一个无验证的 SQL 解析器。
特殊文本格式处理
一些用来解析和操作特殊文本格式的库。
通用
tablib – 一个用来处理中表格数据的模块。
Office
Marmir – 把输入的Python 数据结构转换为电子表单。
openpyxl – 一个用来读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的库。
python-docx – 读取,查询以及修改 Microsoft Word 2007/2008 docx 文件。
unoconv – 在 LibreOffice/OpenOffice 支持的任意文件格式之间进行转换。
XlsxWriter – 一个用于创建 Excel .xlsx 文件的 Python 模块。
xlwings – 一个使得在 Excel 中方便调用 Python 的库(反之亦然),基于 BSD 协议。
xlwt / xlrd – 读写 Excel 文件的数据和格式信息。
relatorio – 模板化OpenDocument 文件。
PDF
PDFMiner – 一个用于从PDF文档中抽取信息的工具。
PyPDF2 – 一个可以分割,合并和转换 PDF 页面的库。
ReportLab – 快速创建富文本 PDF 文档。
Markdown
Mistune – 快速并且功能齐全的纯 Python 实现的 Markdown 解析器。
Python-Markdown – John Gruber’s Markdown 的 Python 版实现。
YAML
PyYAML – Python 版本的 YAML 解析器。
CSV
csvkit – 用于转换和操作 CSV 的工具。
Archive
unp – 一个用来方便解包归档文件的命令行工具。
自然语言处理
用来处理人类语言的库。
NLTK – 一个先进的平台,用以构建处理人类语言数据的 Python 程序。
jieba – 中文分词工具。
langid.py – 独立的语言识别系统。
Pattern – Python 网络信息挖掘模块。
SnowNLP – 一个用来处理中文文本的库。
TextBlob – 为进行普通自然语言处理任务提供一致的 API。
TextGrocery – 一简单高效的短文本分类工具,基于 LibLinear 和 Jieba。
文档
用以生成项目文档的库。
Sphinx – Python 文档生成器。
awesome-sphinxdoc
MkDocs – 对 Markdown 友好的文档生成器。
pdoc – 一个可以替换Epydoc 的库,可以自动生成 Python 库的 API 文档。
Pycco – 文学编程(literate-programming)风格的文档生成器。
配置
用来保存和解析配置的库。
config – logging 模块作者写的分级配置模块。
ConfigObj – INI 文件解析器,带验证功能。
ConfigParser – (Python 标准库) INI 文件解析器。
profig – 通过多种格式进行配置,具有数值转换功能。
python-decouple – 将设置和代码完全隔离。
命令行工具
用于创建命令行程序的库。
命令行程序开发
cement – Python 的命令行程序框架。
click – 一个通过组合的方式来创建精美命令行界面的包。
cliff – 一个用于创建命令行程序的框架,可以创建具有多层命令的命令行程序。
clint – Python 命令行程序工具。
colorama – 跨平台彩色终端文本。
docopt – Python 风格的命令行参数解析器。
Gooey – 一条命令,将命令行程序变成一个 GUI 程序。
python-prompt-toolkit – 一个用于构建强大的交互式命令行程序的库。
生产力工具
aws-cli – Amazon Web Services 的通用命令行界面。
bashplotlib – 在终端中进行基本绘图。
caniusepython3 – 判断是哪个项目妨碍你你移植到 Python 3。
cookiecutter – 从 cookiecutters(项目模板)创建项目的一个命令行工具。
4. 安装GTK开发环境,未满足依赖关系,如何解决
源不对,把网易镜像的源全部重新加了一遍就可以了。就是这个软件装真是多阿。。。。。
将会安装下列额外的软件包:
accerciser anjuta anjuta-common at-spi-doc autoconf autogen automake autotools-dev cvs debhelper devhelp devhelp-common
docbook docbook-dsssl docbook-to-man docbook-xsl docbook-xsl-doc-html eog-dev epiphany-browser epiphany-browser-data
epiphany-browser-dev evolution-dev exuberant-ctags festival festlex-cmu festlex-poslex festvox-kallpc16k gedit-dev
gettext gir1.0-atk-1.0 gir1.0-clutter-1.0 gir1.0-freedesktop gir1.0-glib-2.0 gir1.0-gstreamer-0.10 gir1.0-gtk-2.0
gir1.0-pango-1.0 glade glade-gnome global gnome-api-docs gnome-common gnome-core-devel gnome-js-common gstreamer0.10-doc
gstreamer0.10-plugins-base-doc gstreamer0.10-plugins-good-doc gstreamer0.10-plugins-ugly-doc gtk-doc-tools gtranslator
hal-doc html2text intltool intltool-debian ipython jade libart-2.0-dev libatk1.0-dev libatk1.0-doc libatspi-dev
libaudiofile-dev libavahi-client-dev libavahi-common-dev libavahi-glib-dev libbonobo2-dev libbonoboui2-dev libcairo2-dev
libcairo2-doc libcamel1.2-dev libcanberra-doc libdb4.6 libdbus-1-dev libdbus-glib-1-dev libdbus-glib-1-doc libdevhelp-1-1
libdirectfb-dev libdirectfb-extra libebook1.2-dev libedataserver1.2-dev libedataserverui1.2-dev libenchant-dev
libesd0-dev libestools1.2 libexpat1-dev libffi-dev libfontconfig1-dev libfreetype6-dev libgail-dev libgail-doc
libgail-gnome-dev libgconf2-dev libgcrypt11-dev libgda-4.0-4 libgda-4.0-common libgdl-1-3 libgdl-1-common libgdl-1-dev
libgirepository1.0-0 libglade2-dev libgladeui-1-9 libglib2.0-dev libglib2.0-doc libgmime-2.4-dev libgnome-desktop-dev
libgnome-keyring-dev libgnome-menu-dev libgnome-speech-dev libgnome-speech7 libgnome2-dev libgnome2-doc
libgnomecanvas2-dev libgnomecanvas2-doc libgnomecups1.0-1 libgnomekbd-dev libgnomeprint2.2-0 libgnomeprint2.2-data
libgnomeprintui2.2-0 libgnomeprintui2.2-common libgnomeui-dev libgnomeui-doc libgnomevfs2-dev libgnutls-dev libgp11-dev
libgpg-error-dev libgstreamer-plugins-base0.10-dev libgstreamer0.10-dev libgtk2.0-dev libgtk2.0-doc libgtkhtml-editor-dev
libgtkhtml3.14-dev libgtksourceview2.0-dev libgtksourceview2.0-doc libgtop2-dev libgweather-dev libice-dev libidl-dev
libjpeg62-dev libltdl-dev libmail-sendmail-perl libnautilus-extension-dev libnotify-doc libnspr4-dev liboobs-1-dev
libopts25 libopts25-dev liborbit2-dev libpanel-applet2-dev libpanel-applet2-doc libpango1.0-dev libpango1.0-doc
libpixman-1-dev libpng12-dev libpopt-dev libpthread-stubs0 libpthread-stubs0-dev librsvg2-dev libseed0 libselinux1-dev
libsepol1-dev libsm-dev libsoup-gnome2.4-dev libsoup2.4-dev libsoup2.4-doc libsp1c2 libsqlite3-dev
libstartup-notification0-dev libsys-hostname-long-perl libsysfs-dev libtasn1-3-dev libtelepathy-glib-doc libtool
libtotem-plparser-dev libunique-dev libvala0 libvte-dev libvte-doc libwebkit-dev libwnck-dev libx11-dev libxau-dev
libxcb-render-util0-dev libxcb-render0-dev libxcb1-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev
libxext-dev libxfixes-dev libxft-dev libxi-dev libxinerama-dev libxklavier-dev libxml2-dev libxml2-doc libxrandr-dev
libxrender-dev libxres-dev libxtst-dev m4 orbit2 po-debconf policykit-1-doc python-bugbuddy python-dbus-doc python-dev
python-evince python-evolution python-foolscap python-gnome2-desktop python-gnome2-desktop-dev python-gnome2-dev
python-gnome2-doc python-gnomedesktop python-gnomeprint python-gobject-dev python-gtk2-dev python-gtk2-doc python-gtop
python-mediaprofiles python-metacity python-pyorbit-dev python-rsvg python-totem-plparser python-wxgtk2.8
python-wxversion python2.6-dev sp x11proto-composite-dev x11proto-core-dev x11proto-damage-dev x11proto-fixes-dev
x11proto-input-dev x11proto-kb-dev x11proto-randr-dev x11proto-record-dev x11proto-render-dev x11proto-resource-dev
x11proto-xext-dev x11proto-xinerama-dev xtrans-dev zlib1g-dev
建议安装的软件包:
libgtkmm2.0-dev libgnomemm2.0-dev autoconf2.13 autoconf-archive gnu-standards autoconf-doc dh-make psgml docbook-defguide
jadetex docbook-dsssl-doc libsaxon-java libxalan2-java docbook-xsl-saxon fop xalan dbtoepub pidgin-festival
festival-freebsoft-utils gettext-doc doxygen apache httpd id-utils python-doc python-gnome2-extras-doc bluefish
python-profiler python-numpy python-matplotlib python-qt3 python-qt4 libgcrypt11-doc libgda-4.0-bin libgda-4.0-mysql
libgda-4.0-postgres python-subunit gnutls-doc gnutls-bin guile-gnutls libtool-doc sqlite3-doc automaken gfortran
fortran95-compiler gcj libunique-doc libmail-box-perl bug-buddy python-gnome2-desktop-doc python-gnome2-desktop-dbg
wx2.8-doc wx2.8-examples python-wxtools ruby tcsh csh octave3.0 mksh pdksh
5. 想学习Python要看什么书呢(我是初学者)
《深度学习入门》([ 日] 斋藤康毅)电子书网盘下载免费在线阅读
资源链接:
链接: https://pan..com/s/1ddnvGv-r9PxjwMLpN0ZQIQ
书名:深度学习入门
作者:[ 日] 斋藤康毅
译者:陆宇杰
豆瓣评分:9.4
出版社:人民邮电出版社
出版年份:2018-7
页数:285
内容简介:本书是深度学习真正意义上的入门书,深入浅出地剖析了深度学习的原理和相关技术。书中使用Python3,尽量不依赖外部库或工具,从基本的数学知识出发,带领读者从零创建一个经典的深度学习网络,使读者在此过程中逐步理解深度学习。书中不仅介绍了深度学习和神经网络的概念、特征等基础知识,对误差反向传播法、卷积神经网络等也有深入讲解,此外还介绍了深度学习相关的实用技巧,自动驾驶、图像生成、强化学习等方面的应用,以及为什么加深层可以提高识别精度等“为什么”的问题。
作者简介:
斋藤康毅
东京工业大学毕业,并完成东京大学研究生院课程。现从事计算机视觉与机器学习相关的研究和开发工作。是Introcing Python、Python in Practice、The Elements of Computing Systems、Building Machine Learning Systems with Python的日文版译者。
译者简介:
陆宇杰
众安科技NLP算法工程师。主要研究方向为自然语言处理及其应用,对图像识别、机器学习、深度学习等领域有密切关注。Python爱好者。
6. 如何用python写一个解释器
大学里计算机科学最吸引我的地方就是编译器。最神奇的是,编译器是如何读出我写的那些烂代码,并且还能生成那么复杂的程序。当我终于选了一门编译方面的课程时,我发现这个过程比我想的要简单得多。
在本系列的文章中,我会试着通过为一种基本命令语言IMP写一个解释器,来展示这种简易性。因为IMP是一个简单广为人知的语言,所以打算用 Python写这个解释器。Python代码看起来很像伪代码,所以即使你不认识 Python,你也能理解它。解析可以通过一套从头开始实现的解析器组合完成(在本系列的下一篇文章中会有解释)。除了sys(用于I/O)、re(用于解析正则表达式)以及unittest(用于确保一切工作正常)库,没有使用其他额外的库。
IMP 语言
在开始写之前,我们先来讨论一下将要解释的语言。IMP是拥有下面结构的最小命令语言:
赋值语句(所有变量都是全局的,而且只能存储整数):
Python
1
x := 1
条件语句:
Python
1
2
3
4
5
if x = 1 then
y := 2
else
y := 3
end
while循环:
Python
1
2
3
while x < 10 do
x := x + 1
end
复合语句(分号分隔):
Python
1
2
x := 1;
y := 2
OK,所以它只是一门工具语言,但你可以很容易就把它扩展成比Lua或python更有用的语言。我希望能把这份教程能保持尽量简单。
下面这个例子是计算阶乘的程序:
Python
1
2
3
4
5
6
n := 5;
p := 1;
while n > 0 do
p := p * n;
n := n - 1
end
IMP没有读取输入的方式,所以初始状态必须是在程序最开始写一系列的赋值语句。也没有打印结果的方式,所以解释器必须在程序的结尾打印所有变量的值。
解释器的结构
解释器的核心是“中间表示”(Intermediate representation,IR)。这就是如何在内存中表示IMP程序。因为IMP是一个很简单的语言,中间表示将直接对应于语言的语法;每一种表达和语句都有对应的类。在一种更复杂的语言中,你不仅需要一个“语法表示”,还需要一个更容易分析或运行的“语义表示”。
解释器将会执行三个阶段:
将源码中的字符分割成标记符(token)
将标记符组织成一棵抽象语法树(AST)。抽象语法树就是中间表示。
评估这棵抽象语法树,并在最后打印这棵树的状态
将字符串分割成标记符的过程叫做“词法分析”,通过一个词法分析器完成。关键字是很短,易于理解的字符串,包含程序中最基本的部分,如数字、标识符、关键字和操作符。词法分析器会除去空格和注释,因为它们都会被解释器忽略。
将标记符组织成抽象语法树(AST)的过程称为“解析过程”。解析器将程序的结构提取成一张我们可以评估的表格。
实际执行这个解析过的抽象语法树的过程称为评估。这实际上是这个解析器中最简单的部分了。
本文会把重点放在词法分析器上。我们将编写一个通用的词汇库,然后用它来为IMP创建一个词法分析器。下一篇文章将会重点打造一个语法分析器和评估计算器。
词汇库
词法分析器的操作相当简单。它是基于正则表达式的,所以如果你不熟悉它们,你可能需要读一些资料。简单来说,正则表达式就是一种能描述其他字符串的特殊的格式化的字符串。你可以使用它们去匹配电话号码或是邮箱地址,或者是像我们遇到在这种情况,不同类型的标记符。
词法分析器的输入可能只是一个字符串。简单起见,我们将整个输入文件都读到内存中。输出是一个标记符列表。每个标记符包括一个值(它代表的字符串)和一个标记(表示它是一个什么类型的标记符)。语法分析器会使用这两个数据来决定如何构建一棵抽象语法树。
由于不论何种语言的词法分析器,其操作都大同小异,我们将创建一个通用的词法分析器,包括一个正则表达式列表和对应的标签(tag)。对每一个表达式,它都会检查是否和当前位置的输入文本匹配。如果匹配,匹配文本就会作为一个标记符被提取出来,并且被加上该正则表达式的标签。如果该正则表达式没有标签,那么这段文本将会被丢弃。这样免得我们被诸如注释和空格之类的垃圾字符干扰。如果没有匹配的正则表达式,程序就要报错并终止。这个过程会不断循环直到没有字符可匹配。
下面是一段来自词汇库的代码:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sys
import re
def lex(characters, token_exprs):
pos = 0
tokens = []
while pos < len(characters):
match = None
for token_expr in token_exprs:
pattern, tag = token_expr
regex = re.compile(pattern)
match = regex.match(characters, pos)
if match:
text = match.group(0)
if tag:
token = (text, tag)
tokens.append(token)
break
if not match:
sys.stderr.write('Illegal character: %sn' % characters[pos])
sys.exit(1)
else:
pos = match.end(0)
return tokens
注意,我们遍历正则表达式的顺序很重要。lex会遍历所有的表达式,然后接受第一个匹配成功的表达式。这也就意味着,当使用词法分析器时,我们应当首先考虑最具体的表达式(像那些匹配算子(matching operator)和关键词),其次才是比较一般的表达式(像标识符和数字)。
词法分析器
给定上面的lex函数,为IMP定义一个词法分析器就非常简单了。首先我们要做的就是为标记符定义一系列的标签。IMP只需要三个标签。RESERVED表示一个保留字或操作符。INT表示一个文字整数。ID代表标识符。
Python
1
2
3
4
5
import lexer
RESERVED = 'RESERVED'
INT = 'INT'
ID = 'ID'
接下来定义词法分析器将会用到的标记符表达式。前两个表达式匹配空格和注释。它们没有标签,所以 lex 会丢弃它们匹配到的所有字符。
Python
1
2
3
token_exprs = [
(r'[ nt]+', None),
(r'#[^n]*', None),
然后,只剩下所有的操作符和保留字了。记住,每个正则表达式前面的“r”表示这个字符串是“raw”;Python不会处理任何转义字符。这使我们可以在字符串中包含进反斜线,正则表达式正是利用这一点来转义操作符比如“+”和“*”。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(r':=', RESERVED),
(r'(', RESERVED),
(r')', RESERVED),
(r';', RESERVED),
(r'+', RESERVED),
(r'-', RESERVED),
(r'*', RESERVED),
(r'/', RESERVED),
(r'<=', RESERVED),
(r'<', RESERVED),
(r'>=', RESERVED),
(r'>', RESERVED),
(r'=', RESERVED),
(r'!=', RESERVED),
(r'and', RESERVED),
(r'or', RESERVED),
(r'not', RESERVED),
(r'if', RESERVED),
(r'then', RESERVED),
(r'else', RESERVED),
(r'while', RESERVED),
(r'do', RESERVED),
(r'end', RESERVED),
最后,轮到整数和标识符的表达式。要注意的是,标识符的正则表达式会匹配上面的所有的保留字,所以它一定要留到最后。
Python
1
2
3
(r'[0-9]+', INT),
(r'[A-Za-z][A-Za-z0-9_]*', ID),
]
既然正则表达式已经定义好了,我们还需要创建一个实际的lexer函数。
Python
1
2
def imp_lex(characters):
return lexer.lex(characters, token_exprs)
如果你对这部分感兴趣,这里有一些驱动代码可以测试输出:
Python
1
2
3
4
5
6
7
8
9
10
11
import sys
from imp_lexer import *
if __name__ == '__main__':
filename = sys.argv[1]
file = open(filename)
characters = file.read()
file.close()
tokens = imp_lex(characters)
for token in tokens:
print token
继续……
7. python3 大家帮我看看为什么要写成这个样子 代码在补充问题里,就是明明d是列表,为什么要通过元素来判断
deflogin():
dict_data={}
withopen('a.txt','r')asdf:
fordindf:
d=[d.strip().split('')]
forkvind:
dict_data[kv[0]]=kv[1:]
print(dict_data)
printd#看看出什麽,我得到的是这个[['alex','123',
,'123456']]
user_name=input('用户名')
user_pwd=input('密码')
ifuser_nameindict_dataanser_pwdind[0]:
user_login['loginis']=True
user_login['current_name']=user_name
a=input('修改密码按1,查看本用户信息按2')
ifa=='1':
xiugai()
elifa=='2':
look()
else:
print('抱歉,没有该用户')