從零開始製作程式語言/逐行輸入系統
外觀
要製作一個編譯器,顯然你需要從檔案中獲取輸入。因此,你需要熟悉至少一種你熟練掌握的語言中的檔案 I/O。現在如何獲取語句呢?程式語言中的每一行都以一個非常特定的字元結束,該字元不是換行符。通常是分號 (;) 或左大括號 ({)。所以要獲取完整的一行,我們只需要輸入到終止字元為止。請注意,這種方法意味著你不能在字串或字元中包含終止字元,而必須用它們的 ASCII 碼來表示它們。
1.Input Character 2.Check if Character is terminating character 2.1.If true , add character and terminate process 2.2.Else add character and continue 2.3.If line contains EOF(end of file) character, terminate program after processing line. [Usually done by the means of flags] 3.Repeat from step 1
此演算法將從檔案中獲取輸入,然後將其儲存到分配給它的字元陣列中。
現在,一旦你擁有了完整的邏輯行,你打算用它做什麼?顯然你要處理它。但如何處理呢?有兩種方法。
1. 詞法分析和語法分析行
2. 獲取關鍵字並隨後採取相應措施
在方法 1 中,我們獲取行,將其透過所謂的“詞法分析器”,將其分解成標記,再透過“語法分析器”對其進行分析。根據此分析結果,它做出明智的決策,並將行傳送到相應的處理過程。但是,這種方法需要非常複雜的系統。
本書旨在跳過語法分析和詞法分析的過程,直接進入處理階段。因此,本書使用偽語法分析器和偽詞法分析器方法(方法 2),該方法對每種型別的語句進行不同的詞法分析和語法分析,這使得編譯器更簡單,並允許更多的語法自由度。
此方法的演算法相當簡單
1.Take character from character array storing logical line till we encounter a 'delimiter' like ',",[space] and {
2.Compare the keyword thus derived with the set of all defined keywords.
2.1.If one matches, send the line to the matching function to process it.
2.2.If none match, produce an error message
此過程完成後,檢查行輸入系統設定的標誌,如果標誌已設定,則終止程式。