精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

F#中DSL原型設計:語法檢查和語義分析

原創
開發 后端
為了構建領域特定語言,你需要一個快速而有效的原型設計流程,它能夠對你的語言進行語法分析并執行語義檢查。本文將為大家介紹F#中DSL原型設計:語法檢查和語義分析。

【51CTO獨家特稿】最近,人們對于領域特定語言F#中DSL原型設計的興趣卷土重來。這些語言不僅能夠為特定領域提供更好等級的提煉,從而有助于減少在通用語言中因低等級構造而造成的錯誤;而且通過提供額外配置、定制的業務邏輯等,它們為用戶提供了一種有效的機制,用于細調你的應用程序。總之,DSL能夠讓你的應用程序更加多樣化并具有更好的伸縮性。51CTO向您推薦Visual Studio 2010中F#的一些資源

大致來講,領域特定語言的工作方式有兩種——你可以通過對以源DSL編寫的源文本進行轉譯來實施,或者通過將源文本編譯為可執行代碼。這兩種方式都有著獨特的優點和缺點。對于解釋器和編譯器的實施階段,很多都是類似的,甚至一模一樣;例如,語法和語義檢查在兩種方式中是共同的。在獲得合適的內部重現(inner representation)之后,編譯器實施包括幾個階段,逐步將這種重現分解為低等級的指令,生成匯編語言原生碼,或管理代碼(取決于目標平臺)。解釋器與之相反,很少執行這些階段。作為替代,你可以實施所謂的DSL 的“操作語義”(operational semantic);例如,為內部重現編寫一個評估器。

運行中的 Simply

圖1. 運行中的Simply

你可以在Simply上進行構建,來創建新的DSL并將其嵌入到你自己定制的開發外科中。此處演示的應用程序 SimplyLogo從零開始構建,F# 代碼少于500 行。

在本文介紹的F#中DSL原型設計,我們將為一個小型的DSL(由于其類似 C 語言的語法和簡潔,我將其稱為“Simply”)編寫一個解釋器,然后使用與Logo 那種語言類似的內置函數將其實例化。你可以通過在表達式語法器上來構建以完成實例化。之前我們已經在相關文章中進行講述,在這篇文章中,你可以看到活躍模式(active pattern)提供了一個***的機制(雖然付出了一點速度的小代價),能夠用于構建符合類型安全規則的語法器,它與用戶語法中的正規的 BNF 句法非常相似;并且能夠在增強的AST 重現上實施語言檢查(本文)和評估器(下一篇文章)。使用這種語言,你可以快速生成圖像,這些圖像能夠使用簡單的畫圖命令來定義——并且你可以在所有你需要的語境中使用這個核心評估器。在圖 1 中所示為該 DSL 的一種可能的嵌入。在本文中,我們主要關心的是構建 Simply 的語法器和檢查源程序以確認語法的正確性。

51CTO譯者注:為了學習這個系列的文章,你需要下載 F# May 2009 CTP 或Visual Studio 2010 Beta 1

Simply 概述

Simply 是本文的DSL,它是一個具有靜態作用域、嵌套變量(nested variable)和函數聲明,以及簡單循環構造的小型編程語言。下面是一個很短的 Simply 程序:

  1. var x = 2   
  2. fun x(a b) { a + b + x }   
  3. fun x(y) { y + x(1 2) }   
  4. repeat 100 as i { x(i) } 

這段程序很容易讀懂,它包含四條命令,定義了一個變量、兩個函數和一個循環。為了分析這些命令的語法,你需要對上文中講述的語法器進行擴展。

對具有循環構造、變量和函數的Simply進行擴展

前文中實施的語法器使用函數調用對算術表達式進行語法分析并將其翻譯為定制的 AST 類型。對于 Simply,你需要一個稍微更為高級的內部重現來對表達式進行語法分析,這些表達式包含了簡單變量以及與其密切關聯的少量語言擴展,用于定義變量和函數,以及用簡單的循環構造(循環區塊)來表達循環。

如果你已經將AST 定義放在其自身模塊中,下面你可以看到新的擴展版本:

  1. namespace IntelliFactory.Simply   
  2. module Ast =  
  3.     type var = string   
  4.     type Expr =  
  5.  
  6.  | Number of float   
  7.  | BinOp of (float -> float -> float) * Expr * Expr  
  8.  | Var of var  
  9.  | FunApply of var * Expr list  
  10.  
  11.  static member Sum (e1, e2) = BinOp (( + ), e1, e2)  
  12.  static member Diff (e1, e2) = BinOp (( - ), e1, e2)  
  13.  static member Prod (e1, e2) = BinOp (( * ), e1, e2)  
  14.  static member Ratio (e1, e2) = BinOp (( / ), e1, e2) 

你可能已經注意到,我對這個模塊的代碼格式進行了細小的調整,以便符合 F# 編碼語法指南。我們的理想是用最少的代碼實現最多的功能,同時在需要增加代碼以及所表達的功能時仍然能夠進行快速建模(prototyping)并且修改最小化。現在,你可以在代碼中添加 AST 增強,其指向不再是那些普通的算術表達式:

  1.    type Command =  
  2. | VarDef of var * Expr  
  3. | FunDef of var * var list * Command  
  4. | Repeat of Expr * var * Command  
  5. | Sequence of Command list  
  6. | Yield of Expr type Prog = Program of Command list 

這些F#中DSL原型設計的代碼定義了:

一個 Command 類型,可以對變量定義繼續編碼(利用一個值進行初始化) 函數定義(具有函數名稱、常規的參數列表和一個體現函數主體的 Command 值) 循環區塊(具有控制變量、循環程度表達式和一個用于體現循環區塊主體的 Command 變量) Command 排序(對于定義需多個簡單表達式的函數主體或循環區塊非常有用) 簡單表達式執行。一列這樣的表達構成了一個程序。利用這些類型,你現在可以擴展你支持創建的表達式語法器。為了更加方便,你可以再次使用 Listing 1 中代碼,然后對其進行稍微的增強:

這個核心語法器中唯一的更改(格式更改除外)位于(|Factor|_|)活躍模式在:這個版本添加了簡單的變量變量引用(第三條規則),以滿足增強的 AST 表達式語言中的相應的附加規則。

到這里,你就可以真正地開始加速,快速寫下 DSl 語法器的其余部分。首先添加關鍵字和特定字符的規則:

  1. let (|LBRACE|_|) s = "{" |> MatchSymbol s  
  2. let (|RBRACE|_|) s = "}" |> MatchSymbol s  
  3. let (|EQ|_|) s = "=" |> MatchSymbol s  
  4. let (|VAR|_|) s = "var" |> MatchSymbol s  
  5. let (|FUN|_|) s = "fun" |> MatchSymbol s  
  6. let (|REPEAT|_|) s = "repeat" |> MatchSymbol s  
  7. let (|AS|_|) s = "as" |> MatchSymbol s 

語法分析命令的規則是語法規則轉換為之前地定義的活躍模式的一種簡單的翻譯。

  1. let rec (|Command|_|) = function 
  2. | VAR (ID (v, EQ (Expression (expr, rest)))) 
  3. -> (Ast.Command.VarDef (v, expr), rest) 
  4. |> Some | FUN (ID (f, LPAREN (Star (|ID|_|) [] ( pars, RPAREN (Command (body, rest)))))) 
  5. -> (Ast.Command.FunDef (f, pars, body), rest)
  6.  |> Some | REPEAT (Expression (i, AS (ID (v, Command (body, rest))))) 
  7. -> (Ast.Command.Repeat (i, v, body), rest) 
  8. |> Some | LBRACE (Star (|Command|_|) [] (commands, RBRACE rest)) 
  9. -> (Ast.Command.Sequence commands, rest)
  10.  |> Some | Expression (e, rest) 
  11. -> (Ast.Command.Yield e, rest) |> Some | _ -> None 

例如,讓我們看看上面(|Command|_|)活躍模式中的***條規則。它字母的意思是:

“批評‘var’關鍵字,然后是標識符并將其與‘v’捆綁,然后是等于符號,然后是一個綁定到‘expr’的表達式;然后返回帶有變量及其初始值的 Command.VarDef 值,還有其余的輸入字符串,作為一個成功的匹配。”

其他規則一樣易于理解和構造。有一個細節需要進一步解釋,在函數定義或排序規則中如何使用(|Star|_|)活躍模式。記住,這是一個參數化(parameterized)的活躍模式,在它被應用到你再次匹配的值之前,它具有了兩個變量。***個變量是一個活躍模式,你可以“運行”零次或多次(名稱 Star,它反映了常規語言如 BNF 或常規表達式中的 star 操作符),第二變量是初始累加器,用于收集請求結果。由于該累加器的初始值通常是一個空列表,因此你可能會選擇以一種不需要初始值的方式重寫這個活躍模式;因此這就給了你一直更為緊湊的方式來指定“零次或多次”這種類型的規則。

***,你可以編寫定義了這個程序語法的規則:

  1. let (|Prog|_|) = function   
  2. | Star (|Command|_|) [] (commands, rest) -> (Ast.Prog.Program commands, rest)   
  3. |> Some | _ ->             None 

或者,編寫一個格式稍微有點冗長的規則:

  1.    let (|Prog|_|) s = match s with   
  2. | Star (|Command|_|) [] (commands, rest) -> (Ast.Prog.Program commands, rest)   
  3. |> Some | _ ->             None 

你可以在 Simply 程序上快速檢驗你的語法器——只需通過選取代碼并按 Alt+Enter 鍵將 AST 和語言模塊載入到 F# Interactive 中,然后測試一個 Simply 小程序:

  1. open Language " var x=1 var x=2 var x=3 fun foo(y)   
  2. { fun bar(foo) { var xx=x+1 foo+x } bar(y*2)   
  3. }   
  4. repeat 1000 as x { foo(x) }" |> (|Prog|_|) |> printf "Result=%A\n";;  
  5.  > Result=Some (Program [VarDef ("x",Number 1.0);   
  6. VarDef ("x",Number 2.0); VarDef ("x",Number 3.0);  
  7. FunDef ("foo",["y"], Sequence [FunDef ("bar",["foo"], Sequence [VarDef ("x",BinOp (,Var "x",Number 1.0));   
  8. Yield (BinOp (,Var "foo",Var "x"))]);   
  9. Yield (FunApply ("bar",[BinOp (,Var "y",Number 2.0)]))]);   
  10. Repeat (Number 1000.0,"x",Sequence [Yield (FunApply ("foo",[Var "x"]))])], "") > 

你將看到,對于送入到識別 Simply 程序的主活躍模式中這個程序,輸出結果是 AST 值的轉存。

F#中DSL原型設計:語法檢查和語義分析就到這里

原文標題:Prototyping DSLs in F#: Parsing and Semantic Checking

原文作者:Adam Granicz

【編輯推薦】

  1. F#入門:基本語法,模式匹配及List
  2. C# Actor的尷尬與F#美麗外表下的遺憾
  3. 函數式編程語言F#:基于CLR的另一個頭等編程語言
  4. Visual Studio 2010爆F#二進制兼容性問題
  5. 推薦Visual Studio 2010中F#的一些資源
責任編輯:彭凡 來源: 51CTO
相關推薦

2010-01-26 08:25:06

F#語法F#教程

2009-08-13 17:25:21

F#入門

2010-01-15 08:33:13

F#F#類型推斷F#教程

2010-03-26 19:22:08

F#代理

2010-01-07 10:04:18

F#函數式編程

2010-04-07 16:51:59

F#

2009-08-13 17:39:48

F#數據類型Discriminat

2011-06-09 09:52:41

F#

2009-08-19 09:42:34

F#并行排序算法

2010-07-05 10:08:52

Netstat TCP

2010-04-07 09:46:05

2023-10-29 09:11:03

DSL語法

2009-09-10 14:18:59

Functional F#

2012-11-06 10:01:35

ContinuatioF#

2009-12-14 09:04:10

F#運算符

2009-12-04 09:16:44

Visual Stud

2009-11-16 09:05:46

CodeTimer

2010-03-26 19:03:19

F#異步并行模式

2009-05-25 09:11:34

Visual StudF#微軟

2010-03-16 09:09:04

F#
點贊
收藏

51CTO技術棧公眾號

超碰成人在线观看| 在线观看国产精品一区| 亚洲高清视频在线播放| 欧美色一级片| 亚洲欧美国产日韩中文字幕| 久久黄色免费看| 麻豆视频网站在线观看| 国产成人丝袜美腿| 日韩av快播网址| 欧美一区二区三区爽爽爽| 校花撩起jk露出白色内裤国产精品 | 国产精品日韩久久久久| 欧美国产日韩在线观看成人| 人妖一区二区三区| 777欧美精品| 欧美 激情 在线| 日韩少妇视频| 国产精品久久久久久久久快鸭 | 一区二区导航| 欧美一级欧美三级| 无码人妻丰满熟妇区毛片18| 91香蕉在线观看| 国产亚洲自拍一区| 性欧美视频videos6一9| 成人精品一二三区| 婷婷综合一区| 欧美精品一区二区久久婷婷| 国产视频1区2区3区| 蜜臀久久精品| 一区二区日韩电影| 欧美日韩在线免费观看视频| 免费a在线观看| 成人午夜免费视频| 亚洲综合av影视| 中文天堂在线视频| 三级不卡在线观看| 欧美在线播放视频| 久久久精品人妻无码专区| 麻豆精品久久| 午夜免费久久看| 黑人巨茎大战欧美白妇| 日本在线视频站| 国产日韩欧美精品一区| 久久天天狠狠| 完全免费av在线播放| 久久精品国产免费看久久精品| 在线视频一区二区| 中国美女乱淫免费看视频| 成人自拍在线| 亚洲黄色免费网站| 在线免费观看成人| 97人人在线| 欧美激情一区不卡| 欧美最大成人综合网| 三级毛片在线免费看| 99精品欧美一区二区三区小说| 欧美专区福利在线| 日韩久久久久久久久| 影音先锋亚洲电影| 久久久久中文字幕| 一级黄色性视频| 亚洲小说图片视频| 国产亚洲免费的视频看| 国产精品国产三级国产专业不| 少妇精品久久久一区二区三区| 日韩av综合中文字幕| 亚洲av片不卡无码久久| 欧美男男gaytwinkfreevideos| 亚洲欧洲成视频免费观看| 五月天精品视频| 成人看的羞羞网站| 久久久精品国产| yy6080午夜| 亚洲狼人综合| 色综合天天综合狠狠| a级黄色片网站| a级影片在线观看| 国产性色一区二区| 亚洲一区二区自拍偷拍| bestiality新另类大全| 亚洲国产cao| 午夜精品久久久内射近拍高清 | 欧美日一区二区在线观看| 欧美劲爆第一页| 日本成人免费视频| 国产精品成人a在线观看| 欧美另类在线观看| 99精品视频99| 看电视剧不卡顿的网站| 成人国产1314www色视频| 日本一区二区三区久久| 韩国v欧美v日本v亚洲v| 国产精品二区三区| 成人在线免费视频| 尤物av一区二区| 精品人妻一区二区三区四区在线 | 色综合天天在线| 两性午夜免费视频| 亚洲精品国产动漫| 久久天天躁狠狠躁夜夜躁2014| 日韩欧美一区二区一幕| 日本不卡中文字幕| 国产精品视频免费一区二区三区| 国产日本在线观看| 亚洲一区二区三区在线| 97公开免费视频| 亚洲性视频在线| 欧美丰满嫩嫩电影| 水蜜桃av无码| 亚州av乱码久久精品蜜桃| 8050国产精品久久久久久| 在线中文字幕网站| 麻豆91精品91久久久的内涵| 国产66精品久久久久999小说| 成年人在线视频| 亚洲va中文字幕| 一级 黄 色 片一| 精品国产一区二区三区四区| 欧美激情极品视频| 91国产免费视频| 久久先锋影音av鲁色资源| 天天做天天躁天天躁| 成人国产一区二区三区精品麻豆| 7777精品伊人久久久大香线蕉 | 91精品国产免费久久久久久| 国产精品伦一区二区三区| 久久久久久久久久久电影| 精品国偷自产一区二区三区| 欧美性受ⅹ╳╳╳黑人a性爽| 欧美专区日韩专区| 3d动漫精品啪啪一区二区下载| 国产精品theporn| 91久久久久久| 精品孕妇一区二区三区| 在线观看日韩电影| 国产在线观看h| 老妇喷水一区二区三区| 蜜桃视频在线观看91| 国产传媒在线| 精品电影一区二区三区| 久久成人国产精品入口| 国产精品一区二区在线观看网站| 亚洲 国产 欧美一区| 麻豆网站免费在线观看| 欧美精品一区视频| 国产午夜精品无码| 成年人国产精品| 日韩av高清在线看片| 范冰冰一级做a爰片久久毛片| 欧美va在线播放| 欧美黄色免费在线观看| 国产成人亚洲精品青草天美| 亚洲一区 在线播放| 奇米一区二区| 欧美日韩福利在线观看| 成人小说亚洲一区二区三区| 亚洲二区在线视频| 国产精品一区二区人妻喷水| 一本色道久久综合| 国产日韩欧美自拍| 欧美午夜电影一区二区三区| 91精品国产综合久久精品| 欧美黑人性猛交xxx| 成人一道本在线| 成人毛片视频网站| 国产最新精品| 国产啪精品视频网站| 成人影院在线观看| 精品国产亚洲在线| 国产高清中文字幕| 中文字幕第一页久久| 成年人网站国产| 秋霞在线一区| 国产精品久久久久久久久粉嫩av | 九九久久久久久久久激情| 亚洲va欧美va| 色综合中文综合网| 黄色一级片一级片| 懂色av一区二区在线播放| 欧美日韩在线一| 久久国产成人精品| 国产91精品入口17c| 大胆人体一区二区| 久久久国产一区| 欧洲天堂在线观看| 欧美情侣在线播放| 国产性70yerg老太| 中文字幕欧美三区| 18禁一区二区三区| 日本中文字幕一区二区有限公司| 潘金莲一级淫片aaaaa免费看| 日韩免费电影| 久久精品中文字幕| 色综合成人av| 欧美一级在线观看| 成人免费毛片视频| 99国产精品国产精品毛片| 狠狠热免费视频| 欧美激情在线| 污视频在线免费观看一区二区三区| 精品视频一区二区三区在线观看| 555www成人网| 69xxx在线| 亚洲天堂av在线播放| 国内爆初菊对白视频| 欧美在线视频不卡| 中文字幕一区二区三区手机版| 日本一区二区三区视频视频| 特级特黄刘亦菲aaa级| 另类中文字幕网| 干日本少妇首页| 国产在线不卡| 91社在线播放| 欧美一级精品| 就去色蜜桃综合| 成人h动漫精品一区二区器材| 国产欧美精品久久久| 波多视频一区| 78色国产精品| av电影在线地址| 精品中文字幕乱| 在线免费看av| 一区二区欧美在线| 全色精品综合影院| 亚洲高清一区二| 丰满肥臀噗嗤啊x99av| 欧美精品亚洲二区| 一区二区视频网站| 一本大道久久a久久精品综合| 国产精品成人网站| 一级做a爱片久久| 午夜免费激情视频| 亚洲日本一区二区三区| 午夜激情福利电影| 中文字幕av不卡| 欧美巨胸大乳hitomi| 日本一区二区久久| 极品人妻videosss人妻| 久久精品男人天堂av| 中文字幕在线免费看线人| av网站一区二区三区| 亚洲精品乱码久久久久久蜜桃图片| 国产精品一区二区在线播放 | 久久久久久麻豆| a视频免费观看| 久久综合999| 国产免费看av| 国产日韩欧美电影| 女人黄色一级片| 国产精品久久久久久久久动漫| 1024手机在线观看你懂的| 日本一区二区三区四区在线视频 | 成人在线免费观看视频| 亚洲欧美丝袜| 日韩中文在线电影| 在线观看亚洲视频啊啊啊啊| 国产精品久久久久蜜臀| 亚洲区成人777777精品| 欧美精品一区二区三区久久久竹菊| 天堂а√在线中文在线| 国产精品videosex极品| 男女超爽视频免费播放| 亚洲在线黄色| 日本久久久久久久久久久久| 六月丁香婷婷久久| 亚洲熟妇一区二区| 97精品视频| 天天人人精品| 正在播放日韩欧美一页| a天堂资源在线观看| 国产精品日韩久久久| 久久人妻精品白浆国产 | 欧美日韩午夜剧场| 亚洲 欧美 成人| 欧美嫩在线观看| 亚洲国产精彩视频| 亚洲视频欧美视频| h片在线免费| 欧美一级电影在线| 国产亚洲人成a在线v网站| 91在线精品播放| 欧美高清视频看片在线观看| 日韩妆和欧美的一区二区| 天天超碰亚洲| 蜜桃传媒一区二区三区| 美国av一区二区| 欧美熟妇精品一区二区| 久久精品一区四区| caoporn91| 色就色 综合激情| wwwav国产| 精品女同一区二区三区在线播放| 五月婷婷激情五月| 欧美不卡一区二区三区| 国产黄色片在线观看| 九九热这里只有在线精品视 | 亚洲a级在线播放观看| 欧美综合精品| 色一情一乱一乱一区91| 久久一区中文字幕| 中文字幕1区2区| 中文文精品字幕一区二区| 日韩欧美三级在线观看| 制服.丝袜.亚洲.另类.中文| 婷婷综合激情网| 欧美成aaa人片免费看| 日本欧美一区| 精品免费国产| 欧美日韩免费观看一区=区三区| 国产精彩免费视频| 99精品国产视频| 九九热精品免费视频| 欧美日韩国产高清一区二区三区 | 你懂的一区二区三区| 欧美视频在线第一页| 久久66热偷产精品| 熟女少妇内射日韩亚洲| 激情久久av一区av二区av三区| 国产人妖一区二区三区| 91精品欧美久久久久久动漫| 日韩一二三四| 97色在线播放视频| 精品国产亚洲一区二区在线观看| 日韩啊v在线| 噜噜爱69成人精品| 在线观看国产免费视频| 亚洲午夜激情网站| 99久久精品日本一区二区免费 | 精品国产一区二区三区不卡| 精品国产丝袜高跟鞋| 国产精品美女免费视频| 亚洲精品亚洲人成在线观看| 日韩伦理在线免费观看| 国产suv精品一区二区三区| 四虎精品免费视频| 91麻豆精品国产| 国产激情在线| 成人亲热视频网站| 日本少妇精品亚洲第一区| 亚洲人一区二区| 老色鬼精品视频在线观看播放| 国产精品国产三级国产专业不| 91久久一区二区| 番号集在线观看| 国产精品久久激情| av资源久久| 九九九九九九九九| 亚洲男帅同性gay1069| 精品国产九九九| 欧美肥婆姓交大片| 精品久久对白| 久久久999免费视频| 久久久久久久久久看片| 波多野结衣视频观看| 最近2019中文字幕在线高清| 日韩亚洲国产免费| 路边理发店露脸熟妇泻火| 国产精品99久久久久久久vr| 欧美日韩中文视频| 日韩精品高清视频| 高清成人在线| 国产亚洲自拍偷拍| 国产精品一级| 老熟妇一区二区| 欧美欧美午夜aⅴ在线观看| 欧美69xxx| 国产精品久久久久av福利动漫| 在线午夜精品| 亚洲欧美va天堂人熟伦| 91精品婷婷国产综合久久| 国产蜜臀在线| 日本黑人久久| 国内精品自线一区二区三区视频| 久久99久久久| 亚洲色图25p| 97久久中文字幕| 僵尸世界大战2 在线播放| 久久精品视频免费| 99在线无码精品入口| 午夜精品久久久久久久99热浪潮| 欧美美女在线| 免费黄视频在线观看| 日韩欧美一区二区三区久久| 日本www在线观看视频| 国产一区不卡在线观看| 蜜臀av性久久久久av蜜臀妖精| 欧美性猛交xxxxx少妇| 日韩精品欧美激情| 亚洲欧洲二区| 日韩中文字幕在线视频观看| 国产精品美女一区二区在线观看| 午夜精品久久久久久久99| 国产成人鲁鲁免费视频a| 亚洲天堂免费| 第一次破处视频| 亚洲精品在线观看视频| 欧美综合社区国产| 国产免费黄色av| 亚洲激情自拍视频| 大片免费播放在线视频|