您好,登錄后才能下訂單哦!
本篇文章為大家展示了Python運(yùn)行是由Graminit.c定義的示例分析,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
Graminit.c中定義了Python運(yùn)行時刻進(jìn)行語法分析所需要的靜態(tài)數(shù)據(jù)(部分?jǐn)?shù)據(jù),主要是Accelerator,會在運(yùn)行時計算出來),按照如下的順序:
static arc arcs_0_0[3] = { {2, 1}, {3, 1}, {4, 2}, }; static arc arcs_0_1[1] = { {0, 1}, }; static arc arcs_0_2[1] = { {2, 1}, }; static state states_0[3] = { {3, arcs_0_0}, {1, arcs_0_1}, {1, arcs_0_2}, };
Arc_0_0代表DFA0中從狀態(tài)0出發(fā)的所有arc,arcs_0_1代表DFA0中從狀態(tài)1出發(fā)的所有arc,依此類推。Arcs_0_0中Arc { 2, 1 }代表一條邊從狀態(tài)0開始到狀態(tài)1,Label為2(可以在后面查到label2代表NEWLINE,即換行符)。States_0記錄了DFA0中所有的狀態(tài)節(jié)點(diǎn)上面的所有邊。
當(dāng)定義完所有的DFA的狀態(tài)和邊的信息之后,接下來定義了所有的DFA的數(shù)組:
static dfa dfas[84] = {
{256, "single_input", 0, 3, states_0,
"\004\050\014\000\000\000\000\025\074\005\023\
310\011\020\004\000\300\020\222\006\201"},{257, "file_input", 0, 2, states_1,
"\204\050\014\000\000\000\000\025\074\005\023
\310\011\020\004\000\300\020\222\006\201"},...
Graminit.c中定義了Python運(yùn)行時刻進(jìn)行語法分析所需要的靜態(tài)數(shù)據(jù)的順序中我們就拿***個元素舉例,256在graminit.h中可以查到代表single_input,也就是交互模式下單條語句。初始狀態(tài)為0,共有3個狀態(tài),對應(yīng)的狀態(tài)和邊的信息存在states_0中,***的一個很長的字符串代表了該非終結(jié)符的firstset,每個字節(jié)對應(yīng)著label的ID。
接下來,graminit.c定義了所有的Labels:
static label labels[168] = { {0, "EMPTY"}, {256, 0}, {4, 0}, {267, 0}, ...
{ 0, “EMPTY” }是一條特殊的邊,表示該狀態(tài)是accept狀態(tài),代表DFA的結(jié)束。{ 256, 0 } 則代表該label對應(yīng)的是符號256,也就是single_input,無對應(yīng)字符串描述。由于每個關(guān)鍵字在語法中是直接出現(xiàn)的,因此在Label中定義了每個關(guān)鍵字。
***,定義了grammar:
grammar _PyParser_Grammar = { 84, dfas, {168, labels}, 256 };
可以看到,整個Python2.5的語法共有84條規(guī)則/DFA,168個Label,起始Label為256, single_input。(部分?jǐn)?shù)據(jù)主要是Accelerator,會在運(yùn)行時計算出來)
上述內(nèi)容就是Python運(yùn)行是由Graminit.c定義的示例分析,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。