Skip to content

YauHsien/erl4th

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

erl4th

Forth in Erlang

運用 Erlang 語言的特性,讓 Forth 語言可以運作。

要編譯 Forth ,一開始只要先把輸入的程式用空格分開,就已經是後序式了,而後序式也是一種二元樹或多元樹。然後, Forth 程式區分為三種符號:文字、值、區隔符號,所以做 lexical analysis 時,應該要這樣做:

  • 文字應該要表示為〈文字,參數數目〉,因為文字是運算符號,有相對的參數,而參數數目表示為負整數。例如〈my-emit, -1〉,相當於在函數語言中有個函數名叫 my-emit/1 。
  • 值應該要表示為〈值,消化參數數目〉。值的存在,可能之後會被運算符號消化掉,所以需要定義「消化參數數目」,去跟〈文字,參數數目〉做加總抵消。於是,如果有一個運算符號的「參數數目」沒有抵消為 0 ,就可以印出那個運算符號是 stack underflow error 。
  • 區隔符號只能照樣存在 lexical analysis 的結果,因為之後做 semantic analysis 要用。

Syntax analysis 就不必了,因為 Forth 程式經 lexical analysis 之後,得到一串東西,就是語法樹。

至於 semantic analysis 的任務,是把 Forth 程式整理成一份字典和一個運算用的 stack 。字典中的每一筆,是一個文字定義,而且定義好的文字其實就是函數,例如 : star 42 emit ; 是函數 start/0 。在這一階段,要把每一筆文字的參數數目算出來,所以一筆文字表達成 (key, value) ,則是(〈star, 0〉,[42, emit]),本來 lexem value 是 [〈42, 1〉, 〈emit, -1〉] ,後來經由 semantic analysis 處理之後,要把第二個數字消掉,變成 [42, emit] ,之後可以直接拿去算。

Releases

No releases published

Packages

 
 
 

Languages