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

隨筆-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>
            亚洲人久久久| 日韩视频在线免费| 午夜精品美女自拍福到在线| 亚洲人体1000| 欧美视频官网| 久久爱另类一区二区小说| 午夜亚洲视频| 亚洲国产高清一区| 亚洲精品美女在线观看播放| 欧美午夜女人视频在线| 美日韩精品视频免费看| 久久精品成人一区二区三区蜜臀| 国产精品久久久久久久久动漫 | 亚洲午夜视频在线观看| 国产乱肥老妇国产一区二| 久久综合免费视频影院| 欧美精品一卡| 欧美亚洲综合网| 久久综合网络一区二区| 亚洲无线视频| 久久久久久久久久久久久久一区| 91久久精品国产91久久性色| 国产精品99久久久久久人| 国产主播一区二区三区四区| 亚洲日本aⅴ片在线观看香蕉| 欧美丝袜一区二区三区| 免费观看成人| 国产精品久久久久影院色老大| 老司机一区二区三区| 欧美日韩在线播放三区四区| 久久久噜噜噜久久人人看| 欧美日韩在线观看一区二区| 毛片一区二区三区| 国产精品外国| 亚洲精品一区二区三区不| 国产一区自拍视频| 亚洲一本大道在线| 亚洲麻豆一区| 久久免费一区| 久久精品91久久久久久再现| 欧美日韩久久不卡| 欧美激情一区| 尤物精品在线| 欧美一级精品大片| 性欧美长视频| 国产精品第一页第二页第三页| 欧美成人一区在线| 尹人成人综合网| 欧美亚洲综合另类| 欧美一区二区三区男人的天堂| 欧美精品一卡| 亚洲国产天堂久久综合网| 精品动漫一区| 久久激情视频久久| 久久久久久**毛片大全| 国产精品一区二区三区四区五区| 亚洲精品中文字幕在线| 亚洲日本中文| 欧美国产免费| 91久久精品一区二区别| 91久久综合| 欧美福利视频| 亚洲精品一区二区三区福利| 亚洲精品日韩在线| 欧美激情精品久久久久久黑人 | 久久久999精品视频| 久久久亚洲精品一区二区三区| 国产视频综合在线| 久久久久国产精品麻豆ai换脸| 久久深夜福利| 亚洲电影免费在线| 欧美激情乱人伦| 99视频超级精品| 一本色道久久综合亚洲精品不卡| 日韩视频中文字幕| 欧美日韩中文另类| 亚洲一区二区三区在线看 | 精品成人国产在线观看男人呻吟| 久久久国产精品一区二区中文| 美女主播视频一区| 亚洲精选国产| 国产精品第一页第二页第三页| 亚洲免费视频网站| 牛人盗摄一区二区三区视频| 亚洲欧洲一区二区天堂久久| 欧美日韩国产综合视频在线| 亚洲一区三区视频在线观看| 久久九九免费| 亚洲免费电影在线| 国产精品久久久久久五月尺| 午夜亚洲福利| 亚洲电影在线看| 亚洲一区中文字幕在线观看| 国产欧美日韩一区| 欧美α欧美αv大片| 亚洲视频图片小说| 欧美不卡视频一区发布| 在线中文字幕不卡| 韩国免费一区| 欧美日韩久久久久久| 亚洲欧美日韩视频一区| 亚洲电影专区| 久久精品99| 一区二区三区欧美激情| 国产欧美视频在线观看| 欧美福利电影网| 久久成人免费视频| 一区电影在线观看| 欧美黄色影院| 久久亚洲精品一区| 亚洲欧美电影在线观看| 在线成人小视频| 国产美女精品一区二区三区| 欧美成人在线网站| 欧美综合第一页| 在线一区日本视频| 亚洲国产你懂的| 久热精品视频| 久久久99免费视频| 亚洲一区精品电影| 亚洲另类自拍| 亚洲欧洲精品一区| 狠狠久久综合婷婷不卡| 国产精品乱子乱xxxx| 欧美精品99| 欧美电影免费网站| 蜜臀av国产精品久久久久| 欧美在线视频播放| 亚洲专区免费| 亚洲一级在线观看| 这里只有精品视频| 夜夜爽99久久国产综合精品女不卡| 欧美大片免费观看| 免费日韩精品中文字幕视频在线| 久久国产精品网站| 久久av资源网| 久久福利精品| 久久久国产精品一区| 欧美综合国产| 久久久久久久999精品视频| 欧美一区日韩一区| 欧美一区二区三区啪啪| 午夜精品美女自拍福到在线| 亚洲网站在线| 亚洲欧美国产日韩天堂区| 亚洲欧美国产视频| 欧美精品九九| 欧美影院成年免费版| 亚洲欧美日韩区| 欧美一区二区成人| 欧美有码视频| 久久字幕精品一区| 美玉足脚交一区二区三区图片| 久久一日本道色综合久久| 玖玖精品视频| 亚洲激情国产精品| 一本色道久久88综合亚洲精品ⅰ | 久久国产精品72免费观看| 欧美在线播放| 免费视频久久| 亚洲精品资源美女情侣酒店| 中文一区字幕| 久久精品视频99| 久久婷婷综合激情| 欧美日韩精品不卡| 国产欧美日韩专区发布| 在线高清一区| 亚洲一区二区三区成人在线视频精品| 亚洲综合激情| 牛牛精品成人免费视频| 亚洲美女视频在线观看| 亚洲欧美久久久| 免费在线观看成人av| 欧美视频一二三区| 国产一区自拍视频| 这里是久久伊人| 久久亚洲不卡| 一区二区日韩| 老司机精品视频一区二区三区| 欧美日韩一区在线播放| 精品成人一区二区三区| 一本色道久久加勒比精品| 久久黄金**| 亚洲人被黑人高潮完整版| 亚洲色图综合久久| 欧美成人午夜免费视在线看片| 国产精品视频久久一区| 亚洲人成欧美中文字幕| 欧美一区二区精品| 亚洲精品一二三区| 久久资源在线| 国产亚洲人成a一在线v站| 亚洲伦伦在线| 欧美成人免费在线观看| 新片速递亚洲合集欧美合集| 欧美日韩精品一区二区三区| 在线播放日韩专区| 久久精品九九| 亚洲永久免费视频| 欧美视频二区36p|