構建自己的編譯器 十七 函式宣告

2021-10-18 13:48:51 字數 1065 閱讀 3514

# 函式

f(a:int, b:int): a+b=>f.

[按理說,預設返回值是變數函式都可以,但是返回值與字尾就沒關係了,它本身是乙個函式嘛,還要禁止它呢]

[但是這最後返回的時候確實有些不對勁,按理說也應該是int啊]

[類是有字尾的,函式是沒有字尾的,我把類和函式歸一了,這樣仍會報錯,但是也沒有問題,檢查在變數端檢查]

[比如你寫的函式既能返回整數,也能返回字串,但某個時刻你只想返回整數,返回字串報錯,那麼你只能在變數端檢查]

[這麼寫: a.int<=fun().]

func(ca:int, cb:int): (ca+cb=>func). [正確,宣告乙個域,則直接返回這個域,相當於走變數賦值的預設那一套,而括號裡面的實際上並未執行]

func(): (

la: 0,

lb: "yes".

"no" => lb.

lfunc.int(a, b): (a+b=>lfunc).

lfunc2.void():(). [表示不返回任何引數,空域往往表示作為介面]

lfunc(1, 2). [直接執行了]

func: (a+b=>func). [錯誤,如果是域的話,基本宣告方式在前面必須加括號]

[引用宣告方式]

[函式一般不會加字尾,因為返回值問題,類一般都要加字尾,為了區分的問題]

func.cls(): fun.cls. [正確,相當於直接拷貝,走變數賦值的預設那一套,但是左部括號和形參都要正確,不然就認為不是乙個函式,這種多用於函式或拷貝構造]

[我需要一批關鍵字,實際上它們起到表示式的作用,賦予型別但不賦予值]

func(a.int, b.int): func(a.int, b.int). [錯誤,函式的宣告形式只有前面是,後面就不是了]

func(a.int, b.int): func(1, 2). [正確,但這實際上是返回的東西,返回它自己,這種多用於沒有返回值,因此返回它自己,是類]

func: fun(1, 2). [錯誤,前面必須要有括號和形參,必須是函式宣告形式]

func(1, 2): fun(1, 2). [錯誤,前面必須是宣告形式]

構建自己的編譯器 十八 函式執行

執行方式 cla 表示執行初始執行語句,也是普通執行函式 cla 1,2 表示執行初始含參語句,在別的程式語言來說,就是簡單的執行函式 cla1 func 1,2 表示執行函式內函式 cla func 1,2 錯誤 正確,不能執行兩個函式,除非返回的也是自己的型別,這時候就必須新增上字尾了 cla ...

打造自己的編譯器

為了更深入的了解程式設計的底層,就想研究下編譯。找了幾本編譯原理看,什麼正規表示式 自動機把我都搞糊塗了。把複雜的問題弄得更複雜,這不是我希望的。還是自己做個東西模擬下編譯過程。任務 讀入原始碼,輸出彙編。為什麼不直接生成機器碼?彙編可以直接看出編譯是否錯誤。先設定乙個語言模型 只有運算子 識別符號...

構建自己的編譯器(二)語法分析器

用來描述計算機語言語法的符號集。現在,幾乎每一位新程式語言書籍的作者都使用巴科斯正規化來定義程式語言的語法規則。擴充套件巴科斯 瑙爾正規化 ebnf 是表達作為描述計算機程式語言和形式語言的正規方式的上下文無關文法的元語法符號表示法。它是基本巴科斯正規化 bnf 元語法符號表示法的一種擴充套件。如由...