• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-341  評論-2670  文章-0  trackbacks-0
                語法分析器終于完成了,總共花了7個小時的時間。其中遇到了一些小問題,譬如lambda expression的\param->expression和let-in expression的let declaration-list in expression里面的expression需要盡可能長的解決辦法。因為用了Vczh Syngram,所以不得不調整出符合需求的文法。

                為了大概看一看文法有沒有寫對,我寫了一個程序,讀入KernelFP語言寫的一份代碼,將其格式化并輸出。

                輸入代碼如下:
             1 type int
             2 type char
             3 type bool = true | false
             4 type list T = empty | list T (list T)
             5 
             6 func iadd::int->int->int alias "add"
             7 func isub::int->int->int alias "sub"
             8 func imul::int->int->int alias "mul"
             9 func idiv::int->int->int alias "div"
            10 func imod::int->int->int alias "mod"
            11 func ilg::int->int->bool alias "ilg"
            12 func ism::int->int->bool alias "ism"
            13 func iequ::int->int->bool alias "iequ"
            14 func chr::int->char alias "chr"
            15 func ord::char->int alias "ord"
            16 
            17 func not::bool->bool
            18 def not a = select a of
            19               case true : false
            20               case false : true
            21             end
            22 
            23 func and::bool->bool->bool
            24 def and a b = select a of
            25                 case true : b
            26                 case false : false
            27               end
            28 
            29 func or::bool->bool->bool
            30 def or a b = select a of
            31                 case true : true
            32                 case false : b
            33               end
            34 
            35 func xor::bool->bool->bool
            36 def xor a b = select a of
            37                 case true : not b
            38                 case false : b
            39               end
            40 
            41 func T if::bool->T->T
            42 def if cond t f = select cond of
            43                     case true : t
            44                     case false : f
            45                   end
            46 
            47 func ineg::int->int
            48 def ineg num = isub 0 num
            49 
            50 func coffset::char->int->char
            51 def coffset c i = chr (iadd (ord c) i)
            52 
            53 func itoa::int->list char
            54 def itoa a = if (iequ a 0) (list '0' empty) (if (ism a 0)
            55                (list '-' (itoa (ineg a)))
            56                let
            57                  func _itoa::int->(list char)->(list char)
            58                  def _itoa a chs = select a of
            59                                      case 0 : chs
            60                                      else : _itoa (div a 10) (list (coffset '0' (mod a 10)) chs)
            61                                    end
            62                in _itoa a empty)
            63 
            64 func atoi::list char->int
            65 def atoi chs = select chs of
            66                  case empty : 0
            67                  case list '-' chs : ineg (atoi chs)
            68                  case c chs : iadd (imul 10 (isub (ord c) (ord '0'))) (atoi chs)
            69                end

                輸出代碼如下:
             1 表達式1/1
             2   type int
             3 
             4   type char
             5 
             6   type bool = (true | false)
             7 
             8   type list T = (empty | (list T (list T)))
             9 
            10   func iadd :: ((int -> int-> int) alias "add"
            11 
            12   func isub :: ((int -> int-> int) alias "sub"
            13 
            14   func imul :: ((int -> int-> int) alias "mul"
            15 
            16   func idiv :: ((int -> int-> int) alias "div"
            17 
            18   func imod :: ((int -> int-> int) alias "mod"
            19 
            20   func ilg :: ((int -> int-> bool) alias "ilg"
            21 
            22   func ism :: ((int -> int-> bool) alias "ism"
            23 
            24   func iequ :: ((int -> int-> bool) alias "iequ"
            25 
            26   func chr :: (int -> char) alias "chr"
            27 
            28   func ord :: (char -> int) alias "ord"
            29 
            30   func not :: (bool -> bool)
            31   def not a = 
            32     select a of
            33       case true : false
            34       case false : true
            35     end
            36 
            37   func and :: ((bool -> bool-> bool)
            38   def and a b = 
            39     select a of
            40       case true : b
            41       case false : false
            42     end
            43 
            44   func or :: ((bool -> bool-> bool)
            45   def or a b = 
            46     select a of
            47       case true : true
            48       case false : b
            49     end
            50 
            51   func xor :: ((bool -> bool-> bool)
            52   def xor a b = 
            53     select a of
            54       case true : (not b)
            55       case false : b
            56     end
            57 
            58   func T if :: ((bool -> T) -> T)
            59   def if cond t f = 
            60     select cond of
            61       case true : t
            62       case false : f
            63     end
            64 
            65   func ineg :: (int -> int)
            66   def ineg num = ((isub 0) num)
            67 
            68   func coffset :: ((char -> int-> char)
            69   def coffset c i = (chr ((iadd (ord c)) i))
            70 
            71   func itoa :: (int -> (list char))
            72   def itoa a = (((if ((iequ a) 0)) ((list '0') empty)) (((if ((ism a) 0)) ((list '-') (itoa (ineg a)))) 
            73     (let
            74       func _itoa :: ((int -> (list char)) -> (list char))
            75       def _itoa a chs = 
            76         select a of
            77           case 0 : chs
            78           else : ((_itoa ((div a) 10)) ((list ((coffset '0') ((mod a) 10))) chs))
            79         end
            80     in((_itoa a) empty))))
            81 
            82   func atoi :: ((list char-> int)
            83   def atoi chs = 
            84     select chs of
            85       case empty : 0
            86       case ((list '-') chs) : (ineg (atoi chs))
            87       case (c chs) : ((iadd ((imul 10) ((isub (ord c)) (ord '0')))) (atoi chs))
            88     end
            89 

                今晚和明天要想出一個解決帶有模板參數的類型推導的解決辦法。因為實際上當你寫下
                func T1 T2 name::T1->T2
                def name a = ....
                的時候,T1和T2不一定能夠取到所有類型,而且T1和T2也不一定沒有關系。所以如果你不寫func頭的話,一個默認的,不影響語義的func頭是可以生成出來的,直接用模板就可以了。所以對于這門最小內核語言來說,這個語法糖是可以省略的。

                譬如說:
                func T1 T2 T3 makelist :: T1 -> T2 -> T3
                def makelist a b = list a (list b empty)
                在這個描述下,T1必須跟T2相同,而且T3必須是list T1這種類型。所以,你把函數頭改成了func T makelist::T->T->list T,也是絲毫沒有影響的。
            posted on 2008-10-01 01:31 陳梓瀚(vczh) 閱讀(1565) 評論(0)  編輯 收藏 引用 所屬分類: 腳本技術
            天堂无码久久综合东京热| 97久久久精品综合88久久| 久久午夜综合久久| 精品伊人久久大线蕉色首页| 无码国产69精品久久久久网站| 新狼窝色AV性久久久久久| 性欧美大战久久久久久久久| 狠狠色婷婷综合天天久久丁香| 91亚洲国产成人久久精品| 精品久久久一二三区| 精品综合久久久久久97超人 | 青青热久久国产久精品| 伊人久久大香线蕉综合影院首页 | 精品伊人久久大线蕉色首页| 久久综合久久综合久久综合| 久久久久亚洲av成人网人人软件| 日韩精品久久无码人妻中文字幕| 亚洲中文字幕无码久久2020| 夜夜亚洲天天久久| 久久精品国产亚洲AV麻豆网站 | 无码人妻精品一区二区三区久久| 青青草原综合久久| 日产精品久久久久久久| 国内精品久久久久影院老司| 国产精品成人无码久久久久久| 久久综合88熟人妻| 久久精品国产亚洲AV久 | 国产精品99久久免费观看| 热99RE久久精品这里都是精品免费 | 国产精品va久久久久久久| 久久精品国产亚洲Aⅴ蜜臀色欲| 久久亚洲私人国产精品| 亚洲女久久久噜噜噜熟女| 中文成人无码精品久久久不卡 | 中文字幕无码免费久久| 亚洲天堂久久久| 偷窥少妇久久久久久久久| 青青草原综合久久大伊人| 欧美久久久久久| 亚洲精品白浆高清久久久久久| 久久婷婷五月综合97色直播|