使用F#來學習編譯原理(1)
慣例,先貼代碼倉庫
DavidAlphaFox/calculator起因
部分業務的原因吧,需要重新學習下編譯原理。同時目前因為要研究跨平台方案,就兩個一起來學習了。
F#第二日使用感受
之前已經在我要推薦下F#中寫了我第一日使用F#的感受,今天在說更多的感受。
type類型
相比OCaml來說,F#的type類型顯得有點單薄。F#將枚舉類型和自定義可變型分開,換句話說,就是無法在一個類型下兩個東西同時出現,像下面OCaml這種寫法,F#是無法直接實現的。
type token =
| PLUS
| MINUS
| DIGIT of String;;
因此,在F#中只能拆解成一個枚舉類型和一個可變類型來完成同樣的事情。
控制語句
相對而言,F#的控制語句比OCaml寬泛很多,容許我們在if的then語句中直接書寫多條操作語句,而無需使用begin end語句包裹。
例如F#中的我們可以這樣書寫一個if then語句
let private digit_token (state: TokenParserState) (c: char) =
if (is_digit c) then
let items = state.items
match state.acc with
| None -> TokenParserState(Some(c.ToString()),items)
| Some(acc)-> TokenParserState(Some(acc + c.ToString()),items)
else
state
而OCaml則需要begin和end來包裹。
函數
F#的函數和OCaml的函數聲明方法基本上差不多,但是最為重要的是,F#的函數聲明支持private聲明,這個可以將不想暴露給外部的函數直接被隱藏起來。
編譯原理
目前正在重新開始學習編譯原理,學習了詞法分析,也就是我們常說的Lexical analysis或Scanning,詞法分析階段是編譯過程的第一個階段。這個階段的任務是從左到右一個字元一個字元地讀入源程序,即對構成源程序的字元流進行掃描然後根據構詞規則識別單詞(也稱單詞符號或符號)。詞法分析程序實現這個任務。詞法分析程序可以使用GNU的flex來生成。
推薦閱讀: