類型驗證系統的設計

類型驗證系統能發現許多代碼中的錯誤,能夠幫助程序員快速找到這些錯誤,儘快構建正確的代碼。程序員

fn func-name(arg1: Str arg2: Bool) -> Bool
  return true

類型驗證系統須要首先收集函數的定義:正則表達式

func-name:Str:Bool -> Bool

而後會對代碼出現的函數調用進行類型驗證:函數

if func-name("filter", true) return true

若是要支持不定參數或可選參數,那麼類型系統的驗證就須要進行相似正則的運算:this

fn func-name(args: Str+) return args.join('|')
fn func-name(arg: Bool?) if is-define(args) return true

類型系統獲得了參數的類型後,用預約義的函數類型 Pattern 去 Match 獲得的 Type Str..net

用正則表達式來實現的話,移植性會出現問題,由於這須要語言支持對正則表達式的正則插值。如今我只發現 Perl 支持,別的語言對於正則的功能就有限多了。因此一涉及到正則,語言的可移植性就出現了問題。rest

用現有的匹配系統完成這個工做,雖然效率低些,但若是寫成低級語言,仍是一樣高效。code

首先定義一個 type grammar 來定義參數的 pattern 規則,十分簡單:token

Str :Str Str+ Str?

只是支持字符串,符號,重複匹配和無關緊要的語法:字符串

type = |Str Token Rept|+ $
        Str   = ':' [\a\-] ;
        Token = [\a\-]+ ;

用一個 Int+ 的字符串去匹配 Int Int 的字符串,很簡單的啊。get

泛型函數,支持多種參數的同名函數,類型有分支,還有不一樣的返回值。

這用正則,就很是很是複雜了,仍是老實用本身的系統把。

(return return-type) 將返回類型放在最後的表達式中。

也就是說返回值是在匹配之後纔會得到,若是不匹配,就返回錯誤,若是正確 就返回類型,這要頻繁切換匹配文本,還有類型別名,要創建一個現成的 curosr, 重置 cursor 到 off -> 0, 切換 text 到新的文本,只有分支和字符串沒有別的 用到表達式,添加 return 字符串,cursor 用 reset text 預備好 rule estr

match rules opt-rules, grammar no door rule, 
only have some token; token only have define
match-rule: pattern to match pattern
opt-match to get rule ast
use this rule to match-rule , text use reset (cursor, $text)
no match no return [@type](https://my.oschina.net/fanren1919) , return would check it if is same with define
if no problem, then call would return its define
many call have same name, then combin together with pattern 
then could check rest string -> string rest array -> return array
only could make code is more readable and simple, and is writeable 
with many language.

Pattern define:

Pattern = Int Int -> Int | Str Str -> Str

Branch use |...| is hard to combin, use a | b | c is simple to combin

So Type Grammar is not same with Spp, and have own Optimizer code.

Branch is define use | opt, define

相關文章
相關標籤/搜索