2010-08-21 75 views
0

我正在試圖編寫一個編程語言的解析器。我現在是練習的一部分,我們需要確保解析器的輸出是輸入的C中的一個轉換。添加縮進

所以像...

STARTMAIN a=b+2; return a ENDMAIN 

...必須成爲......

int main() { a=b+2; return a; } 

到目前爲止好,差不多。這個練習還要求,在我們轉換的同一時間,我們必須添加適當的縮進和(因爲去年我必須學習辛苦的方式)換行符。

顯而易見的部分是,每當{打開,你增加一個計數器,然後在每一個新行添加適當的選項卡。然而,右括號('}')是一個不同的故事,因爲您無法在手邊檢測它們,並且一旦您解析了它們,您就不能通過刪除最後打印的選項卡來將它們放在左側的選項卡上。

有沒有解決方案,和/或一致的方式來檢查和添加縮進?

回答

2

那麼,你現在已經發現了一個原因,人們並不總是懶得格式化生成的輸出;這樣做相對困難。

事實上,解決這個問題的一種方法是提供一種官方格式的語言。 Google的Go編程語言附帶'gofmt'程序以鼓勵官方格式。 C沒有這樣的標準,因此對於大括號的安置發生了宗教戰爭,但它確實有程序,如indent,它實際上可以爲你整齊地編碼。

訣竅是不輸出任何行上的任何東西,直到你知道有多少標籤輸出。因此,在一個緊箍括號的行上,您將縮進計數器遞減(確保它永遠不會變爲負數),然後纔會輸出前導製表符和下一個大括號。請注意,C的某些部分需要在大括號後面使用分號(或逗號)(請考慮初始值和結構定義);別人不(認爲語句塊)。

+0

這是一個練習的所有部分,所以沒有任何有關C轉換的嚴格規則。我知道我必須找到一種方法來確保在結束大括號之前不打印任何東西,但我無法找到一個很好的組合來完成我們被要求的所有事情,添加適當的縮進和換行符。 爲了添加適當的換行符,我在分析的每個分號中添加了「換行符和製表符」代碼,但這意味着如果接下來遇到右大括號,則會過早打印這些製表符。一種解決方案可能是讓右大括號獲得另一個換行符,並在那裏打印。 – 2010-08-22 06:33:59

+0

@Leftos:對'麻煩'的一種解釋是,你混合了兩種不應該混合的操作 - 所以你會遇到麻煩。輸出一個換行符並不意味着你也可以輸出下一批空白;你必須等到你知道發生了什麼事情後再輸出。在文件結尾處,您可能會輸出一個空白行 - 不好。在一組聲明之後,你想要一個空行,你可能會輸出一個帶有製表符的行。不好。輸出換行符(前一行的結尾)與前導空格分開。 – 2010-08-22 07:39:25

+0

@Leftos:另外,有些地方你不想在分號之後換行 - 特別是在for循環中。所以規則「在分號後打印換行符」太簡單了。 – 2010-08-22 07:41:24