99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀Python的詞法分析與語法分析
Python的詞法分析與語法分析
2017-10-07
收藏

Python的詞法分析與語法分析

這篇文章主要介紹了Python的詞法分析(Lexical Analysis)與 語法分析(Syntactic Analysis),需要的朋友可以參考下

詞法分析(Lexical Analysis):分析由字符組成的單詞是否合法,如果沒有問題的話,則產(chǎn)生一個(gè)單詞流。

語法分析(Syntactic Analysis):分析由單詞組成的句子是否合法,如果沒有問題的話,則產(chǎn)生一個(gè)語法樹。

在詞法分析器分析源代碼文本的時(shí)候,有一個(gè)概念需要明確:

1.物理行:由回車字符序列(在Windows上是CR LF,在Unix上是LF)結(jié)尾的字符序列組成一個(gè)物理行。

2.邏輯行:由一個(gè)或者多個(gè)物理行組成,可以明確地使用反斜杠(\)來連接多個(gè)物理行使之成為一個(gè)邏輯行;或者,處在圓括號,中括號,花括號內(nèi)的表達(dá)式可以跨越多個(gè)物理行,但是被當(dāng)作一個(gè)邏輯行。

詞法分析器是面向邏輯行的,也就是說,對于詞法分析器而言,只有邏輯行才算是一行,它只在邏輯行結(jié)束之處才產(chǎn)生NEWLINE這個(gè)單詞或者說token。

對于每一處縮進(jìn),不管它有多少個(gè)空白字符,詞法分析器只會產(chǎn)生一個(gè)INDENT單詞或者說token,代表縮進(jìn)一級,每當(dāng)要退出一級縮進(jìn)的時(shí)候,詞法分析器就會產(chǎn)生一個(gè)DEDENT單詞或者說token。注意,單詞DEDENT并沒有一個(gè)或一組字符與之對應(yīng),它是完全的邏輯概念。

Python使用稍作修改的BNF(巴科斯范式)來表示詞法與語法規(guī)則。

下面重點(diǎn)說一下需要注意的地方,以避免發(fā)生一些低級但是隱蔽的編程錯(cuò)誤。

1.標(biāo)識符是區(qū)分大小寫的,但是仍然不要僅僅用大小寫不同來區(qū)分兩個(gè)變量。

2.不要使用那些在其它編程語言中是關(guān)鍵字的標(biāo)識符作為變量名,因?yàn)樗鼈兒芸赡軙蔀镻ython的關(guān)鍵字。

3.不要使用Python明確聲明有特殊意義的標(biāo)志符作為變量名(這類變量一般以下劃線開頭),除非明確自己要使用那個(gè)特殊含義。

4.不要在Python中使用$和?(字符串中除外),它們不是合法的字符。 

5.不要混用Tab和空格來表示縮進(jìn),只使用其中一種,并養(yǎng)成習(xí)慣。

6.整數(shù)字面常量有10,16,8,2幾種表示方法,如果使用16進(jìn)制,請寫0xa或者0Xa;如果使用8進(jìn)制,請寫0o7或者0O7;如果使用2進(jìn)制,請寫0b1或者0B1;總之,不要省略掉那個(gè)標(biāo)識進(jìn)制的字母,建議只使用小寫字母。

7.在整數(shù)字面常量后加一個(gè)l或者L就形成了一個(gè)長整數(shù),建議只使用L,因?yàn)樾憀看起來像數(shù)字1.

8.整數(shù)使用32位表示,但是長整數(shù)并不限于多少位表示,在內(nèi)存允許的情況下,它可以表示任意大小的整數(shù),這與C語言等是不一樣的。

9.如果一個(gè)整數(shù)字面常量的值超過32位整數(shù)的表示范圍,那么Python會自動將它升級為長整數(shù),但是在早期的Python實(shí)現(xiàn)中可能并非如此,因此如果你預(yù)計(jì)需要一個(gè)很大的整數(shù)值,請明確使用長整數(shù)。

10.浮點(diǎn)數(shù)字面常量只有10進(jìn)制形式。


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }