新聞中心
我們都知道在Python運(yùn)行的過(guò)程中是需要不直接的利用到Grammar文件的相關(guān)內(nèi)容進(jìn)而進(jìn)行相關(guān)的語(yǔ)法分析,那么如果你對(duì)Python運(yùn)行的實(shí)際操作感興趣的話,你就可以瀏覽我們的文章對(duì)其有一個(gè)更好的了解。過(guò)程中會(huì)依賴graminit.c/graminit.h中的數(shù)據(jù)結(jié)構(gòu)來(lái)進(jìn)行語(yǔ)法分析

前面提到了在Python的源代碼目錄下面有一個(gè)Grammar目錄,里面只有一個(gè)文件Grammar,以BNF的語(yǔ)法定義了Python的全部語(yǔ)法。拿if語(yǔ)句舉例來(lái)說(shuō):
- if_stmt: 'if' test ':' suite
('elif' test ':' suite)* ['else' ':' suite]
上面的語(yǔ)句可以這樣理解,if語(yǔ)句是if關(guān)鍵字+邏輯表達(dá)式+ ‘:’+語(yǔ)句塊(suite)后面跟上0至多個(gè)elif語(yǔ)句并以else語(yǔ)句結(jié)束。在最左邊的if_stmt表示這一句話定義了if_stmt(非終結(jié)符),’:’右邊則是if_stmt的具體對(duì)應(yīng)的內(nèi)容。
1. ‘’引號(hào)中的內(nèi)容是實(shí)際的字符串,’if’就代表if這兩個(gè)字符
2. 一般的標(biāo)示符代表著非終結(jié)符,也就是某個(gè)等式的左邊,if_stmt, test, suite都是非終結(jié)符,可以被擴(kuò)展為等式右邊的序列。
3. ()括號(hào)是原子操作符,被括號(hào)括起來(lái)的被作為單個(gè)表達(dá)式看待
4. *代表0或多個(gè),比如在if_stmt中的(‘elif’ test ‘:’ suite)*代表一個(gè)if語(yǔ)句中可以有0或者多個(gè)elif子句
5. +代表1或者多個(gè)
但是,這個(gè)文件并不只是用來(lái)作為參考資料的。實(shí)際上,Python運(yùn)行的時(shí)候也需要間接利用到Grammar文件的內(nèi)容來(lái)進(jìn)行語(yǔ)法分析。
Python PGEN
在Makefile.pre.in和Parser/grammar.mak中均有類似如下的代碼:
- ###################################################
#######################- # Grammar
- GRAMMAR_H= $(srcdir)/Include/graminit.h
- GRAMMAR_C= $(srcdir)/Python/graminit.c
- GRAMMAR_INPUT= $(srcdir)/Grammar/Grammar
- ###############################################
###########################- # Parser
- PGEN= Parser/pgen$(EXE)
- POBJS= \
- Parser/acceler.o \
- Parser/grammar1.o \
- Parser/listnode.o \
- Parser/node.o \
- Parser/parser.o \
- Parser/parsetok.o \
- Parser/bitset.o \
- Parser/metagrammar.o \
- Parser/firstsets.o \
- Parser/grammar.o \
- Parser/pgen.o
- PARSER_OBJS= $(POBJS) Parser/myreadline.o Parser/tokenizer.o
- PGOBJS= \
- Objects/obmalloc.o \
- Python/mysnprintf.o \
- Parser/tokenizer_pgen.o \
- Parser/printgrammar.o \
- Parser/pgenmain.o
- PGENOBJS= $(PGENMAIN) $(POBJS) $(PGOBJS)
- ###################################################
#########################- # Special rules for object files
- $(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
- -$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
- $(PGEN): $(PGENOBJS)
- $(CC) $(OPT) $(LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
這段代碼負(fù)責(zé)生成pgen,然后調(diào)用pgen以Grammar作為輸入,生成graminit.h/graminit.c。PGEN是Python自帶的語(yǔ)法分析數(shù)據(jù)生成的工具,負(fù)責(zé)分析Grammar然后生成對(duì)應(yīng)的graminit.c/graminit.h。然后,Python運(yùn)行過(guò)程中會(huì)依賴graminit.c/graminit.h中的數(shù)據(jù)結(jié)構(gòu)來(lái)進(jìn)行語(yǔ)法分析。PGEN的具體實(shí)現(xiàn)不在本文討論范圍中,從略。
【編輯推薦】
- 對(duì)Python源代碼組織的相關(guān)實(shí)際操作步驟解析
- Python安裝的步驟操作其實(shí)是件很容易的事
- Python源碼分析的實(shí)際相關(guān)操作步驟解析
- Python unicode ascii編碼在windows中的實(shí)際應(yīng)用
- Python語(yǔ)言中常用的四種工具的介紹
名稱欄目:Python運(yùn)行的過(guò)程中不直接用到的相關(guān)函數(shù)的介紹
標(biāo)題網(wǎng)址:http://www.dlmjj.cn/article/dppdesg.html


咨詢
建站咨詢
