我正在試圖編寫一個編程語言的解析器。我現在是練習的一部分,我們需要確保解析器的輸出是輸入的C中的一個轉換。添加縮進
所以像...
STARTMAIN a=b+2; return a ENDMAIN
...必須成爲......
int main() { a=b+2; return a; }
到目前爲止好,差不多。這個練習還要求,在我們轉換的同一時間,我們必須添加適當的縮進和(因爲去年我必須學習辛苦的方式)換行符。
顯而易見的部分是,每當{打開,你增加一個計數器,然後在每一個新行添加適當的選項卡。然而,右括號('}')是一個不同的故事,因爲您無法在手邊檢測它們,並且一旦您解析了它們,您就不能通過刪除最後打印的選項卡來將它們放在左側的選項卡上。
有沒有解決方案,和/或一致的方式來檢查和添加縮進?
這是一個練習的所有部分,所以沒有任何有關C轉換的嚴格規則。我知道我必須找到一種方法來確保在結束大括號之前不打印任何東西,但我無法找到一個很好的組合來完成我們被要求的所有事情,添加適當的縮進和換行符。 爲了添加適當的換行符,我在分析的每個分號中添加了「換行符和製表符」代碼,但這意味着如果接下來遇到右大括號,則會過早打印這些製表符。一種解決方案可能是讓右大括號獲得另一個換行符,並在那裏打印。 – 2010-08-22 06:33:59
@Leftos:對'麻煩'的一種解釋是,你混合了兩種不應該混合的操作 - 所以你會遇到麻煩。輸出一個換行符並不意味着你也可以輸出下一批空白;你必須等到你知道發生了什麼事情後再輸出。在文件結尾處,您可能會輸出一個空白行 - 不好。在一組聲明之後,你想要一個空行,你可能會輸出一個帶有製表符的行。不好。輸出換行符(前一行的結尾)與前導空格分開。 – 2010-08-22 07:39:25
@Leftos:另外,有些地方你不想在分號之後換行 - 特別是在for循環中。所以規則「在分號後打印換行符」太簡單了。 – 2010-08-22 07:41:24