慣例,先貼代碼倉庫

DavidAlphaFox/calculator?

github.com
圖標

起因

部分業務的原因吧,需要重新學習下編譯原理。同時目前因為要研究跨平台方案,就兩個一起來學習了。

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來生成。


推薦閱讀:
相关文章