RALLI

林品儒

2016/12/29

RALLI

其實只是自己取的名字

用來執行一個自制的特殊語言的直譯器

能做到Ruby部份能做的事

直譯器

在講解這個直譯器之前

要先講解一下這個特殊語言的語法

語法

#標籤 指令 運算元1,運算元2,...

標籤可有可無

運算元用逗號分開

運算元種類

整數,浮點數

"$"開頭的是變數名稱

":"開頭的是Ruby符號

"#"開頭是標籤

最後還有用雙引號的字串可以用

直譯器原理

先把程式碼讀進來

分析語法並且存成內部表示

執行時依照指令執行對應的動作

使用到的新東西

常規表達式 Regexp

匿名函式 Proc

常規表達式

常規表達式

Regexp

英文為Regular Expression

實際上這個東西博大精深

只要知道可以用來表達文字出現的一個規則

可以用來比對字串

語法

使用 // 夾住一個Regexp

?代表出現0,1次 +是1次以上 *是0次以上

[]代表一個字的可能 ()是分組

\d是[0-9] \w是[A-Za-z0-9_]

\s是空白 \S是非空白 還有萬用字元.

實際範例

整數最前面可以有正負號

數字部份可能是0

或者是非0的開頭後面加上任意數字

/[-+]?(0|([1-9]\d*))/

實際範例

浮點數和整數很像但是後面還有數字

/[-+]?(0|([1-9]\d*))\.\d+/

因為小數點是萬用字元所以要跳脫

我們來實際看看程式是麼運作吧

匿名函式

匿名函式

Proc

這是一個可執行的特殊物件

可以被呼叫

類似的東西

其實Proc還有類似的東西

但是比較進階在此不談

block,lambda,proc...

語法

->(arg1,arg2,...){ do_sonthing }

要給予參數以及可執行的內容

用法

因為是物件所以可以在方法中間傳來傳去

所以一個物件裏面可能是不同的Proc

個人是寫遊戲時想到可以用來當技能基底用...

來看看直譯器執行的部份吧