python等縮排語言的詞法分析實現:
定義兩個虛擬的token:
tokens
還有乙個縮排棧,用於確定是縮排一行,還是回退一行:
stack_indentstack = new stack();
在開始做詞法分析之前,壓入乙個預設的indent,這一步其實沒什麼必要,只是用來避免寫判斷棧頂是否為空的冗餘判斷:
_indentstack = new stack();
_indentstack.push(new integer(0));
針對每乙個新行,首先判斷行首是否是空格,如果是空格,則空格計1、tab鍵計8個空格,如果僅僅是空行,跳過。如果在碰到行尾之前碰有非空字元,則將空格數與棧頂的空格對比,如果大於,壓入當前行的空格數,並生成乙個虛擬的indent token,如果小於,將所有空格數大於當前行的出棧,並生成乙個虛擬的dedent token:
newline
@init
: ((('\u000c')?('\r')? '\n' ) | '\t' | ' ')* (('\u000c')?('\r')? '\n')
leading_space = (' ' | '\t' )*
else
if ( implicitlinejoininglevel == 0 &&
_indentstack.size() > 0)
else }}
}| ((('\u000c')?('\r')? '\n' ) | '\t' | ' ')* (('\u000c')?('\r')? '\n')
(' ' | '\t')* '#' (~'\n')*
;當然還要考慮純注釋行,和空格後僅跟有注釋的情形。
這樣詞法分析過程中,縮排的詞法分析過程就完了,在語法分析中,indent是透明的,例如:
compound_stmt
: if compound_condition (suite)+ elif_clause* else_clause?
| assignment
;suite
: indent (compound_stmt)+ (dedent | eof)
;上面的語法中,indent和dedent就跟括號的處理沒什麼區別,只不過dedent可選,主要是考慮直接在**後就eof的情況。
python程式語言縮排格式
python的縮排格式是python語法中最特別的一點,很多已經習慣了其他語言的朋友再去學python的話,開始會覺的不太 習慣。怎麼看怎麼都覺的彆扭,也有一些朋友因為這個特別的格式與python失之交臂,認為不符合程式設計的風格,但是我要 說的是恰恰是這樣的格式讓python變得更為強大。下面說說...
python的縮排問題!
python縮排用空格還是tab?本質一樣,只要不混用 一般沒有太多區別,但今天我用python編的指令碼遇到乙個奇葩問題,用空格就是報錯。後來用tab才能執行 出錯函式如下 72 def getdbdir db,date 73 f1 rawlogs idigger db 1 date 74 f2 ...
不用縮排的python
初學python多次,都被python的縮排搞得頭疼,還是習慣c的風格,查了查好像沒人弄乙個c風格的python,只能自己想辦法了。解決辦法很簡單,就是給程式塊加上大括號,方式如下 usr bin python coding utf 8 import string infilename raw in...