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('抱歉,沒有該用戶')