青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評論-2670  文章-0  trackbacks-0
    為了測試Kernel FP的健壯性以及進(jìn)行一些bug的排除,一個四則運算式子的分析程序理所當(dāng)然地就被實現(xiàn)了。代碼如下:

    這里使用的方法是,現(xiàn)將字符串切開,然后變成一段一段的,最后直接遍歷求值。譬如說輸入(1+2)*(3+4)要得到21。程序可以識別出錯誤,不過main函數(shù)忽略一切錯誤(因為懶得寫那么多if)。

    P.S. 沒有語法糖寫起來還真是慘啊……等測試得差不多的時候就把高級的語法糖添加進(jìn)去。

    首先要為token建模。四則運算式子的token類型有括號、運算符和數(shù)字:
1 data token
2   = t_leftbrace
3   | t_rightbrace
4   | t_add
5   | t_sub
6   | t_mul
7   | t_div
8   | t_num float

    然后是詞法分析的函數(shù)。token_split輸入一個字符串,輸出一個token數(shù)組和剩余的字符串。剩余的字符串如果存在的話,第一個字符是無法被識別的字符,譬如字母等:
 1 data token_stream = token_stream (list token) string
 2 
 3 def token_getnum input =
 4   let
 5     def _getnum output input =
 6       select input of
 7         case list x tail : if (and (cegt x '0') (celt x '9')) (_getnum (list x output) tail) (pair output input)
 8         case empty : pair output input
 9       end
10   in select _getnum "" input of
11     case pair output input : pair (reverse output) input
12   end
13 
14 def token_atof input = select atof input of
15   case success number : number
16 end
17 
18 def token_split input =
19   let
20     def _split stream = select stream of
21       case token_stream tokens remain : select remain of
22         case empty : stream
23         case list '(' tail : _split (token_stream (list t_leftbrace tokens) tail)
24         case list ')' tail : _split (token_stream (list t_rightbrace tokens) tail)
25         case list '+' tail : _split (token_stream (list t_add tokens) tail)
26         case list '-' tail : _split (token_stream (list t_sub tokens) tail)
27         case list '*' tail : _split (token_stream (list t_mul tokens) tail)
28         case list '/' tail : _split (token_stream (list t_div tokens) tail)
29         else : select token_getnum remain of
30           case pair num tail : select num of
31             case empty : stream
32             case list x xs : _split (token_stream (list (t_num (token_atof num)) tokens) tail)
33           end
34         end
35       end
36     end
37   in select _split (token_stream empty input) of
38     case token_stream tokens remain : token_stream (reverse tokens) remain
39   end

    接下來是語法分析。語法分析直接使用我們已經(jīng)熟練到無法再熟練,連方法都可以倒著背出來的遞歸下降法進(jìn)行分析:
 1 def token_toint token = select token of
 2   case t_leftbrace : 0
 3   case t_rightbrace : 1
 4   case t_add : 2
 5   case t_sub : 3
 6   case t_mul : 4
 7   case t_div : 5
 8   case t_num x : 6
 9 end
10 
11 def token_startwith token tokens = select tokens of
12   case empty : false
13   case list first remains : iequ (token_toint token) (token_toint first)
14 end
15 
16 data expression
17   = e_add expression expression
18   | e_sub expression expression
19   | e_mul expression expression
20   | e_div expression expression
21   | e_num float
22   | e_error string
23 
24 def exp_getfactor tokens = select head tokens of
25   case t_num x : pair (success x) (tail tokens)
26   case t_leftbrace : select exp_getexp (tail tokens) of
27     case pair first remains : select first of
28       case fail message : pair first remains
29       case success x :
30         if (token_startwith t_rightbrace remains)
31           (pair first (tail remains))
32           (pair (fail "此處需要右括號") remains)
33     end
34   end
35   else : pair (fail "此處需要表達(dá)式") tokens
36 end
37 
38 def exp_getterm tokens=
39   let
40     def _getterm current tokens ismul = select exp_getfactor tokens of
41       case pair result remains : select result of
42         case fail message : pair result remains
43         case success x :
44           let
45             def new_current=if ismul (fmul current x) (fdiv current x)
46           in if (isempty remains)
47             (pair (success new_current) remains)
48             select head remains of
49               case t_mul : _getterm new_current (tail remains) true
50               case t_div : _getterm new_current (tail remains) false
51               else : pair (success new_current) remains
52             end
53       end
54     end
55   in _getterm 1.0 tokens true
56 
57 def exp_getexp tokens=
58   let
59     def _getexp current tokens isadd = select exp_getterm tokens of
60       case pair result remains : select result of
61         case fail message : pair result remains
62         case success x :
63           let
64             def new_current=if isadd (fadd current x) (fsub current x)
65           in if (isempty remains)
66             (pair (success new_current) remains)
67             select head remains of
68               case t_add : _getexp new_current (tail remains) true
69               case t_sub : _getexp new_current (tail remains) false
70               else : pair (success new_current) remains
71             end
72       end
73     end
74   in _getexp 0.0 tokens true

    有了這些函數(shù)之后,我們寫幾個main來測試它們:
1 def main97 = token_getnum "123vczh"
2 def main98 = token_getnum "vczh123"
3 def main99 = token_split "(1+2)*(3+4)"
4 def main100 = select token_split "(1+2)*(3+4)" of
5   case token_stream tokens remains : exp_getexp tokens
6 end
7 def main101 = select token_split "(1+2)*(3+4)" of
8   case token_stream tokens remains : pairfirst (exp_getexp tokens)
9 end

    下面就是結(jié)果啦!
1 main97返回值:(sysutils.pair "123" "vczh")
2 main98返回值:(sysutils.pair "" "vczh123")
3 main99返回值:(startup.token_stream [startup.t_leftbrace , (startup.t_num 1.0) , startup.t_add , (startup.t_num 2.0) , startup.t_rightbrace , startup.t_mul , startup.t_leftbrace , (startup.t_num 3.0) , startup.t_add , (startup.t_num 4.0) ,startup.t_rightbrace] "")
4 main100返回值:(sysutils.pair (system.success 21.0"")
5 main101返回值:(system.success 21.0)

    返回system.success 21.0!娃哈哈……
posted on 2008-12-13 07:13 陳梓瀚(vczh) 閱讀(3378) 評論(2)  編輯 收藏 引用 所屬分類: 腳本技術(shù)

評論:
# re: Kernel FP 的四則運算式子分析程序 2008-12-14 17:55 | ckyap
沒有語法糖寫起來還真是慘啊。。。  回復(fù)  更多評論
  
# re: Kernel FP 的四則運算式子分析程序 2008-12-14 18:53 | 陳梓瀚(vczh)
這就是實驗型語言與工程型語言的最大區(qū)別……Kernel FP的初衷是為了讓我能夠研究一下我自己對實現(xiàn)一門pure functional programming的想法究竟是能用的還是不能用的。  回復(fù)  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久夜夜夜| 欧美亚洲一区二区三区| 国产精品日韩久久久| 久久免费一区| 亚洲国产美女久久久久| 野花国产精品入口| 伊人成人网在线看| 一区二区三区欧美在线| 尤妮丝一区二区裸体视频| 久久久亚洲国产美女国产盗摄| 亚洲午夜精品久久久久久浪潮| 久久久精品免费视频| 欧美在线视频二区| 欧美揉bbbbb揉bbbbb| 欧美二区在线| 国产一区二区三区免费在线观看 | 中文日韩欧美| 99成人在线| 牛牛影视久久网| 久久三级福利| 一区二区av| 欧美日韩国产美女| 亚洲成人在线网| 欧美一级久久| 亚洲第一福利视频| 亚洲国产一区在线观看| 欧美日韩视频免费播放| 夜夜嗨av色一区二区不卡| 久久久精品2019中文字幕神马| 国产模特精品视频久久久久 | 亚洲欧美日韩在线综合| 亚洲专区在线视频| 欧美性jizz18性欧美| 一本色道久久| 欧美成人亚洲| 久久九九免费| 亚洲欧美日韩国产精品| 国产精品久久久久久av福利软件 | 亚洲一区二区三区精品在线 | 亚洲国产毛片完整版| 亚洲精品国产精品久久清纯直播| 久久精品一区二区三区不卡| 日韩亚洲在线观看| 性色av一区二区三区红粉影视| 国产精品久久午夜夜伦鲁鲁| 亚洲综合国产| 久久久青草青青国产亚洲免观| 一本色道久久88综合日韩精品| 精品成人乱色一区二区| 久久一区免费| 亚洲三级影院| 午夜伦欧美伦电影理论片| 好吊日精品视频| 欧美国产日韩一区二区| 夜夜嗨av色综合久久久综合网| 欧美激情免费观看| 亚洲已满18点击进入久久| 亚洲精品系列| 亚洲欧洲日产国产网站| 国产精品porn| 欧美日韩伦理在线免费| 欧美日本三区| 久久动漫亚洲| 日韩亚洲国产欧美| 亚洲欧洲一级| 久久精品官网| 亚洲免费观看在线视频| 国产欧美日韩综合一区在线播放| 久久久青草青青国产亚洲免观| 欧美亚洲一区二区在线| 午夜国产不卡在线观看视频| 亚洲一区在线播放| 亚洲性视频网站| 亚洲电影免费观看高清完整版在线| 久久理论片午夜琪琪电影网| 久久久久久九九九九| 久久亚洲精品一区| 亚洲在线成人精品| 亚洲男人的天堂在线aⅴ视频| 亚洲综合视频1区| 午夜精品一区二区三区电影天堂 | 欧美精品v国产精品v日韩精品| 亚洲欧美国产精品va在线观看| 9l国产精品久久久久麻豆| 亚洲无线视频| 午夜久久一区| 99国产精品久久久久久久成人热| 亚洲日产国产精品| 99视频在线观看一区三区| 在线中文字幕不卡| 欧美一区二区三区四区夜夜大片 | 欧美凹凸一区二区三区视频| 欧美一区二区视频97| 久久久久一区二区三区| 免费国产一区二区| 欧美三级韩国三级日本三斤| 国产精品久久久久久久久久久久| 国产精品区免费视频| 国产一区二区日韩精品欧美精品| 在线观看不卡| 一区二区精品在线| 亚洲免费成人av| 亚洲一区在线播放| 久久久久久网站| 亚洲全部视频| 欧美一区二视频| 欧美v亚洲v综合ⅴ国产v| 国产精品白丝黑袜喷水久久久| 国产一区二区三区四区在线观看 | 一区二区三欧美| 久久福利电影| 欧美日韩一二区| 国内精品免费午夜毛片| 国产日韩精品综合网站| 国产精品丝袜白浆摸在线| 在线免费精品视频| 亚洲国产美国国产综合一区二区| 一区二区三区欧美| 久热国产精品视频| 免费在线看成人av| 香蕉亚洲视频| 欧美电影免费网站| 亚洲自拍啪啪| 免费欧美日韩| 国产最新精品精品你懂的| 99视频在线观看一区三区| 久久久久久久一区二区| 一本色道**综合亚洲精品蜜桃冫 | 性色av一区二区三区在线观看| 免费欧美在线视频| 亚洲欧美激情一区| 欧美日韩亚洲一区| 91久久中文字幕| 久久偷看各类wc女厕嘘嘘偷窃| 99视频在线观看一区三区| 免费视频久久| 很黄很黄激情成人| 欧美亚洲网站| 一区二区三区日韩欧美精品| 欧美大片一区二区三区| 影音先锋久久久| 久久久夜精品| 欧美一区激情| 国产精品午夜在线观看| 亚洲视频精选在线| 欧美影院成人| 欧美激情在线| 美女精品一区| 国产精品劲爆视频| 宅男噜噜噜66一区二区| 亚洲电影免费观看高清完整版在线观看 | 久久噜噜亚洲综合| 狠狠色丁香婷婷综合影院| 久久精品卡一| 欧美一区二区视频在线| 国产日本欧美一区二区三区| 午夜精品久久久久影视 | 国产日韩欧美精品综合| 午夜影院日韩| 亚洲影院一区| 国产情侣一区| 久久久久久久网| 久久精品色图| 在线观看日韩国产| 久久夜色精品国产亚洲aⅴ| 久久国产精品久久久| 韩日欧美一区二区| 免费看av成人| 蜜桃久久av一区| 亚洲精品中文字幕有码专区| 亚洲黄页一区| 欧美日韩在线三级| 亚洲欧美日韩人成在线播放| 亚洲欧美日本国产有色| 国产美女搞久久| 久久综合电影一区| 快播亚洲色图| 国产精品美女久久久久久2018 | 欧美视频在线观看视频极品| 在线视频欧美精品| 亚洲深夜福利网站| 国产精品自拍在线| 理论片一区二区在线| 欧美成人第一页| 亚洲一区二区三区免费视频 | 久久蜜桃资源一区二区老牛| 亚洲激情在线观看| 99精品福利视频| 国产日韩欧美在线| 欧美电影免费网站| 国产精品v亚洲精品v日韩精品| 欧美在线高清视频| 美女啪啪无遮挡免费久久网站| 99精品视频免费在线观看| 亚洲欧美国产精品桃花| 亚洲福利av| 欧美mv日韩mv国产网站| 欧美日韩国产在线| 久久婷婷国产综合国色天香| 欧美精品观看|