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

隨筆-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) 閱讀(3373) 評論(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>
            亚洲第一在线| 亚洲最黄网站| 亚洲国产专区| 伊人成人网在线看| 国产伦精品一区二区三区四区免费| 女人色偷偷aa久久天堂| 欧美va亚洲va国产综合| 欧美日韩不卡| 国产精品久在线观看| 国产三级欧美三级| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 亚洲高清激情| 日韩五码在线| 午夜一区在线| 乱码第一页成人| 亚洲国产老妈| 亚洲欧美日韩在线不卡| 久久天堂成人| 欧美性片在线观看| 狠狠色综合网| 一区二区三区国产在线观看| 久久本道综合色狠狠五月| 久久这里只有精品视频首页| 亚洲国产精品一区二区www在线| 欧美成人影音| 国产精品福利在线观看网址| 国产在线观看91精品一区| 亚洲精品综合久久中文字幕| 午夜视频久久久| 亚洲欧美网站| 久久―日本道色综合久久| 欧美日韩在线观看一区二区三区| 国产一区二区精品久久| 欧美日韩在线影院| 在线观看三级视频欧美| 亚洲欧美怡红院| 欧美激情va永久在线播放| 亚洲自拍偷拍一区| 欧美日韩八区| 欧美日产一区二区三区在线观看 | 久久精品二区| 99www免费人成精品| 欧美在线视频观看| 中文日韩电影网站| 欧美成人精品在线观看| 亚洲综合第一页| 欧美精品一线| 亚洲国产女人aaa毛片在线| 久久www成人_看片免费不卡| 91久久久久久久久| 久久视频在线免费观看| 国产啪精品视频| 国产精品视频专区| 国产亚洲视频在线观看| 亚洲精选在线观看| 久久久久国内| 亚洲在线国产日韩欧美| 国内精品伊人久久久久av一坑| 午夜视频久久久久久| 在线观看日韩av电影| 18成人免费观看视频| 亚洲综合国产精品| 欧美小视频在线| 久久久999精品| 国产精品午夜在线| 欧美亚洲在线视频| 夜夜狂射影院欧美极品| 免费不卡中文字幕视频| 亚洲国产日韩一级| 欧美国产在线电影| 男女精品视频| 国产美女精品视频免费观看| 性18欧美另类| 亚洲欧美日韩综合国产aⅴ| 国产色综合网| 久久人91精品久久久久久不卡| 久久av一区二区三区| 亚洲免费伊人电影在线观看av| 国产精品入口夜色视频大尺度 | 久久久国产视频91| 亚洲女人av| 国产毛片一区| 亚洲全部视频| 亚洲欧洲日韩在线| 日韩视频免费| 精品成人一区二区| 亚洲高清免费在线| 欧美日韩国产91| 亚洲综合色婷婷| 亚洲欧美中文另类| 在线观看欧美视频| 亚洲三级网站| 国产精品免费看片| 久久综合色播五月| 欧美久久九九| 国产亚洲欧美日韩在线一区| 久久久亚洲欧洲日产国码αv| 久久精品亚洲乱码伦伦中文| 91久久久在线| 亚洲性线免费观看视频成熟| 黄色成人在线观看| 亚洲免费观看在线观看| 欧美在线3区| 亚洲日本中文字幕| 午夜精品国产精品大乳美女| 国产亚洲精品自拍| 亚洲级视频在线观看免费1级| 国产精品色一区二区三区| 久久午夜精品一区二区| 欧美视频免费看| 欧美α欧美αv大片| 国产精品久在线观看| 亚洲成人在线网| 国产毛片久久| 一区二区三区色| 亚洲激情小视频| 销魂美女一区二区三区视频在线| 一本色道精品久久一区二区三区 | 亚洲欧美国产制服动漫| 欧美不卡视频一区| 久久综合九色综合网站| 免费观看日韩| 欧美大秀在线观看 | 亚洲欧洲视频在线| 国产一区二区三区最好精华液| 亚洲精品视频一区| 亚洲精品国产系列| 每日更新成人在线视频| 久久爱www久久做| 国产精品无码专区在线观看| 亚洲伦理在线| 日韩一区二区免费看| 久久久亚洲人| 久久大香伊蕉在人线观看热2| 在线免费观看日本欧美| 欧美亚洲综合另类| 先锋影音久久| 国产欧美一区二区精品仙草咪 | 久久久精品国产免大香伊| 欧美一区二区三区免费看| 国产精品久久九九| 宅男66日本亚洲欧美视频| 亚洲桃花岛网站| 亚洲毛片av| 午夜精品久久久久久久久久久久| 欧美喷水视频| 亚洲免费观看高清完整版在线观看| 99视频在线观看一区三区| 欧美日韩国产91| 一本久久综合亚洲鲁鲁| 国产在线视频欧美| 卡一卡二国产精品| 亚洲国产毛片完整版| 欧美精品精品一区| 日韩天堂在线视频| 亚洲欧美日韩中文播放| 国产日本欧洲亚洲| 久久在线播放| 亚洲精品国产视频| 亚洲女ⅴideoshd黑人| 日韩亚洲欧美一区二区三区| 亚洲一区中文字幕在线观看| 欧美视频一区二区三区| 亚洲一级高清| 久久偷看各类wc女厕嘘嘘偷窃| 精品成人a区在线观看| 欧美不卡视频一区| 中日韩高清电影网| 葵司免费一区二区三区四区五区| 久久高清免费观看| 欧美一区不卡| 亚洲国产你懂的| 亚洲自拍偷拍色片视频| 国产日韩欧美综合一区| 免费视频亚洲| 亚洲一区精品在线| 欧美不卡三区| 香蕉久久夜色精品| 亚洲韩日在线| 国产精品一区一区三区| 久久天天躁夜夜躁狠狠躁2022| 亚洲另类在线视频| 久久精品亚洲| 亚洲午夜在线视频| 亚洲欧洲综合| 久久久之久亚州精品露出| 亚洲免费大片| 亚洲第一网站| 老司机一区二区三区| 午夜精品999| 日韩一级精品视频在线观看| 黑人中文字幕一区二区三区| 欧美视频免费在线| 欧美精品尤物在线| 一区二区日韩伦理片| 欧美日韩不卡视频| 欧美激情视频在线播放| 免费视频一区| 玖玖在线精品| 久热精品视频在线免费观看|