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

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

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

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

    首先要為token建模。四則運算式子的token類型有括號、運算符和數字:
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

    然后是詞法分析的函數。token_split輸入一個字符串,輸出一個token數組和剩余的字符串。剩余的字符串如果存在的話,第一個字符是無法被識別的字符,譬如字母等:
 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

    接下來是語法分析。語法分析直接使用我們已經熟練到無法再熟練,連方法都可以倒著背出來的遞歸下降法進行分析:
 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 "此處需要表達式") 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

    有了這些函數之后,我們寫幾個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

    下面就是結果啦!
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) 閱讀(3371) 評論(2)  編輯 收藏 引用 所屬分類: 腳本技術

評論:
# re: Kernel FP 的四則運算式子分析程序 2008-12-14 17:55 | ckyap
沒有語法糖寫起來還真是慘啊。。。  回復  更多評論
  
# re: Kernel FP 的四則運算式子分析程序 2008-12-14 18:53 | 陳梓瀚(vczh)
這就是實驗型語言與工程型語言的最大區別……Kernel FP的初衷是為了讓我能夠研究一下我自己對實現一門pure functional programming的想法究竟是能用的還是不能用的。  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产三级精品三级| 久久国内精品视频| 欧美一站二站| 亚洲欧美日韩综合一区| 亚洲女同在线| 欧美亚洲自偷自偷| 久久久人成影片一区二区三区观看 | 91久久久一线二线三线品牌| 老牛国产精品一区的观看方式| 久久精品成人| 欧美成年人网站| 国产精品vip| 影音先锋中文字幕一区二区| 亚洲国产一区二区三区a毛片| 一本色道久久综合亚洲精品小说| 午夜亚洲激情| 亚洲大胆美女视频| 日韩亚洲欧美成人| 性做久久久久久久久| 你懂的国产精品| 国产农村妇女毛片精品久久莱园子 | 亚洲综合色噜噜狠狠| 久久久久久久一区二区| 亚洲国产影院| 欧美在线观看一区| 欧美日韩91| 在线观看成人av| 先锋亚洲精品| 亚洲日本va午夜在线电影| 欧美一级理论片| 欧美精选一区| 在线观看日韩精品| 欧美一区午夜精品| 一区二区不卡在线视频 午夜欧美不卡在 | 玖玖玖国产精品| 国产精品毛片a∨一区二区三区|国| 在线精品在线| 久久久久国产精品www| 99精品99久久久久久宅男| 欧美成人激情视频免费观看| 国产日韩欧美一区| 午夜精品成人在线视频| 99在线精品视频在线观看| 美日韩丰满少妇在线观看| 国外成人在线| 久久男人资源视频| 欧美在线三区| 狠狠综合久久av一区二区小说 | 亚洲综合色在线| 亚洲欧洲精品一区二区| 久久综合狠狠综合久久激情| 国产婷婷97碰碰久久人人蜜臀| 亚洲在线视频网站| 这里是久久伊人| 国产精品久久| 久久不射电影网| 韩国av一区二区三区四区| 伊人久久综合| 久久综合九色99| 欧美一级片在线播放| 国产欧美日韩中文字幕在线| 亚洲欧美在线免费观看| 亚洲专区一二三| 国产日韩欧美电影在线观看| 欧美在线free| 久久久久久黄| 亚洲国产婷婷综合在线精品 | 欧美福利小视频| 久久一日本道色综合久久| 在线观看欧美视频| 亚洲国产综合91精品麻豆| 欧美精品在线一区二区| 亚洲一区二区三区乱码aⅴ| 亚洲视频播放| 国外视频精品毛片| 亚洲福利视频二区| 欧美日韩一级黄| 久久超碰97人人做人人爱| 久久久久久久久久久久久9999| 在线成人性视频| 亚洲美女中出| 狠狠干成人综合网| 亚洲黄色av一区| 国产精品无人区| 欧美成人精品| 国产精品www994| 久久这里有精品15一区二区三区 | 欧美久久99| 亚洲欧美日产图| 久久青草久久| 亚洲伊人观看| 蜜桃av一区| 欧美影片第一页| 欧美r片在线| 校园春色综合网| 欧美黄色一级视频| 久久久蜜桃精品| 欧美午夜激情小视频| 久热精品视频在线观看一区| 欧美激情综合网| 久久这里只精品最新地址| 欧美午夜宅男影院| 亚洲国产裸拍裸体视频在线观看乱了 | 欧美一区二区啪啪| 这里只有精品在线播放| 久久久久久久久久久一区| 亚洲欧洲99久久| 欧美人与性动交α欧美精品济南到| 欧美怡红院视频一区二区三区| 欧美精品九九99久久| 免费在线欧美黄色| 国产欧美日韩综合精品二区| 性色av一区二区三区| 免费一级欧美在线大片| 国产精品大片wwwwww| 亚洲高清av| 狠狠色丁香婷综合久久| 亚洲小说春色综合另类电影| 99re6这里只有精品| 久久全球大尺度高清视频| 欧美在线观看一区| 国产精品高清一区二区三区| 亚洲精品久久久久久久久久久久| 在线播放视频一区| 欧美综合第一页| 久久国产黑丝| 国产精品狼人久久影院观看方式| 日韩网站在线看片你懂的| 亚洲日本欧美| 欧美大片第1页| 亚洲欧洲一区二区三区在线观看| 亚洲国产小视频在线观看| 免费久久99精品国产自| 欧美国产精品一区| 亚洲激情啪啪| 欧美激情在线观看| 亚洲免费久久| 亚洲一区二区在线| 国产精品拍天天在线| 亚洲永久在线| 久久综合色综合88| 亚洲激情视频在线| 欧美大胆成人| 99re66热这里只有精品4| 亚洲网站视频福利| 国产精品美女在线观看| 香蕉国产精品偷在线观看不卡| 欧美一区亚洲一区| 在线观看免费视频综合| 欧美成人影音| 夜夜嗨av一区二区三区| 欧美一区二区三区男人的天堂 | 韩国三级电影一区二区| 久久久青草婷婷精品综合日韩| 欧美成人精品在线播放| 99精品国产99久久久久久福利| 欧美色精品天天在线观看视频| 亚洲一二三区视频在线观看| 久久高清一区| 亚洲人成在线免费观看| 欧美日韩亚洲一区二区三区在线观看 | 欧美激情国产日韩| 中文日韩欧美| 国产中文一区| 欧美日韩视频在线一区二区| 亚洲一区二区精品视频| 美女脱光内衣内裤视频久久影院 | 欧美激情亚洲视频| 亚洲字幕在线观看| 亚洲国产精品va在线看黑人| 欧美日韩免费在线观看| 久久国产精品久久w女人spa| 亚洲精品国产精品久久清纯直播| 午夜视频精品| 亚洲精选大片| 国语对白精品一区二区| 国产精品高潮呻吟久久av无限| 亚洲春色另类小说| 国产精品国产三级国产专播精品人| 欧美一区二区视频网站| 亚洲欧洲日韩女同| 老牛嫩草一区二区三区日本| 亚洲一区二区三区午夜| 亚洲第一视频网站| 国产区欧美区日韩区| 欧美区亚洲区| 美女免费视频一区| 午夜精品福利在线观看| 亚洲日本在线视频观看| 久久亚洲精品一区| 午夜精品久久久久久久| 亚洲美女在线国产| 在线精品福利| 国产一区二区毛片| 国产欧美日韩激情| 欧美视频中文字幕| 欧美日韩精品免费观看视频完整| 久久久国产午夜精品| 亚洲欧美日韩视频一区| 亚洲午夜羞羞片|