python等縮排語言的詞法分析實現

2021-09-09 04:40:31 字數 1143 閱讀 6477

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...