先貼上代碼
主程序
def do_tokenize(s):
global T
T,i,l = TData(),0,len(s)
T.f = (T.y,i-T.yi+1)
while i < l:
c = s[i]; T.f = (T.y,i-T.yi+1)
if T.nl: T.nl = False; i = do_indent(s,i,l)
elif c == '\n': i = do_nl(s,i,l)
elif c in ISYMBOLS: i = do_symbol(s,i,l)
elif c >= '0' and c <= '9': i = do_number(s,i,l)
elif (c >= 'a' and c <= 'z') or \
(c >= 'A' and c <= 'Z') or c == '_': i = do_name(s,i,l)
elif c=='"' or c=="'": i = do_string(s,i,l)
elif c=='#': i = do_comment(s,i,l)
elif c == '\\' and s[i+1] == '\n':
i += 2; T.y,T.yi = T.y+1,i
elif c == ' ' or c == '\t': i += 1
else: u_error('tokenize',s,T.f)
indent(0)
r = T.res; T = None
return r
處理縮進程序
def do_indent(s,i,l):
v = 0
while i<l:
c = s[i]
if c != ' ' and c != '\t': break
i,v = i+1,v+1
if c != '\n' and c != '#' and not T.braces: indent(v)
return i
def indent(v):
if v == T.indent[-1]: pass
elif v > T.indent[-1]:
T.indent.append(v)
T.add('indent',v)
elif v < T.indent[-1]:
n = T.indent.index(v)
while len(T.indent) > n+1:
v = T.indent.pop()
T.add('dedent',v)
這裏主程序只看
if T.nl: T.nl = False; i = do_indent(s,i,l)
這一行
nl是new line代表遇到換行符進行縮進判斷
然後看do_indent方法可以看出是通過記錄空格或tab的個數,然後使用indent函數與indent集合對比,判斷當前代碼行屬於哪個程序塊,T.add函數是添加一個標識符的類型和值。
結果就在這裏發現的以前所不知道的:
python縮進是通過判斷空格和tab個數來實現的,並不是強制規定4個空格或一個tab的!!!
難道是tinypy爲了省事才這樣?
用標準python2.x檢測一下!
可以運行!!!實在孤陋寡聞了!!!以後再也不用擔心循環嵌套太深了!!!對於過於深層的嵌套可以考慮使用2個空格的縮進,當然,過深的嵌套本省就有進一步優化的必要。