F#中DSL原型设计:语法检查和语义分析

最近,人们对于领域特定语言F#中DSL原型设计的兴趣卷土重来。这些语言不仅能够为特定领域提供更好等级的提炼,从而有助于减少在通用语言中因低等级构造而造成的错误;而且通过提供额外配置、定制的业务逻辑等,它们为用户提供了一种有效的机制,用于细调你的应用程序。总之,DSL能够让你的应用程序更加多样化并具有更好的伸缩性。

大致来讲,领域特定语言的工作方式有两种——你可以通过对以源DSL编写的源文本进行转译来实施,或者通过将源文本编译为可执行代码。这两种方式都有着独特的优点和缺点。对于解释器和编译器的实施阶段,很多都是类似的,甚至一模一样;例如,语法和语义检查在两种方式中是共同的。在获得合适的内部重现(inner representation)之后,编译器实施包括几个阶段,逐步将这种重现分解为低等级的指令,生成汇编语言原生码,或管理代码(取决于目标平台)。解释器与之相反,很少执行这些阶段。作为替代,你可以实施所谓的DSL 的“操作语义”(operational semantic);例如,为内部重现编写一个评估器。

图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 程序:

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

这段程序很容易读懂,它包含四条命令,定义了一个变量、两个函数和一个循环。为了分析这些命令的语法,你需要对上文中讲述的语法器进行扩展。

对具有循环构造、变量和函数的Simply进行扩展

前文中实施的语法器使用函数调用对算术表达式进行语法分析并将其翻译为定制的 AST 类型。对于 Simply,你需要一个稍微更为高级的内部重现来对表达式进行语法分析,这些表达式包含了简单变量以及与其密切关联的少量语言扩展,用于定义变量和函数,以及用简单的循环构造(循环区块)来表达循环。

如果你已经将AST 定义放在其自身模块中,下面你可以看到新的扩展版本:

namespace IntelliFactory.Simply
module Ast =
    type var = string
    type Expr =

 | Number of float
 | BinOp of (float -
>
 float -
>
 float) * Expr * Expr
 | Var of var
 | FunApply of var * Expr list

 static member Sum (e1, e2) = BinOp (( + ), e1, e2)
 static member Diff (e1, e2) = BinOp (( - ), e1, e2)
 static member Prod (e1, e2) = BinOp (( * ), e1, e2)
 static member Ratio (e1, e2) = BinOp (( / ), e1, e2)

时间: 2024-10-02 11:30:23

F#中DSL原型设计:语法检查和语义分析的相关文章

以原型设计为基础分析可视化内容设计

在风起云涌的互联网浪潮中,产品迭代的速度越来越快.随着用户需求的激增,也不断带来了对设计师能力要求的提高.初入交互设计领域几年来,明显发现可视化的内容远比文档的更易于被用户(以至我们的客户)所接受,就像用户研究项目中常说的一句话:"用户怎么说的,并不代表他们怎么想."今天以"原型设计"为基点,与大家展开几点做简要的分析. 一.什么是原型设计? 首先,让我们看看在体验设计的过程中的"原型设计". 以下结合个人对UCD理解和项目经验,梳理和简化的传统

原型设计中一个按钮的“哲学”故事

什么是原型设计? 比较全面的解释是这样的: 产品原型可以概括的说是整个产品面市之前的一个框架设计图, 以网站产品举例,整个前期的交互设计流程图完成之后,就是进入到原形开发的设计阶段,简单的来说是将页面的模块.原素.人机交互的形式.甚至一些简单的特效,利用线框描述的方法,将产品脱离概念状态下更加具像跟生动的表达出来. 原型设计是交互设计师与PD.PM.网站开发工程师沟通的最好工具.而该块的设计在原则上必须是交互设计师的产物,交互设计以用户为中心的理念会贯穿整个产品. 解释完了它的概念我们就要来说一

设计师经验之谈:AXURE在原型设计中的应用

前言 什么是原型呢? 产品原型简单的说就是产品设计成形之前的一个简单框架,对网站来讲,就是将页面模块.元素进行粗放式的排版和布局,深入一些,还会加入一些交互性的元素,使其更加具体.形象和生动. 就我个人而言,目前使用频率最多,最高效,交互效果最好的原型工具是axure.今天给大家介绍一些我在工作中使用axure的经验.主要从交互设计中涉及的三个主要步骤进行说明: 一.主要页面原型 在进行主要页面原型设计之前,交互设计师需要: 一份主要的任务流程图(此处指的不是"业务逻辑流程图",而是根

移动应用开发过程中的迭代式原型设计

主要结论 移动应用原型创建过程中采用迭代式快速开发方法的重要性. 可以从对手身上学到什么,如何从他们的失误中获益. 如何为你的应用定义USP,如何通过故事板(Storyboarding).用户场景和故事图(Story-mapping)为自己挑选出最理想的用户. 如何使用纸面原型匹配团队的预期,并专注于共享的最终交付成果. 如何使用原型工具收集.管理和验证需求,进而在无需进行太多文案工作的情况下让产品解决方案具象化. 根据Yahoo Flurry提供的数据,消费者使用手机的时间中有超过90%用于各

AXURE在原型设计中的应用

前言 什么是原型呢? 产品原型简单的说就是产品设计成形之前的一个简单框架,对网站来讲,就是将页面模块.元素进行粗放式的排版和布局,深入一些,还会加入一些交互性的元素,使其更加具体.形象和生动.就我个人而言,目前使用频率最多,最高效,交互效果最好的原型工具是axure.今天给大家介绍一些我在工作中使用axure的经验.主要从交互设计中涉及的三个主要步骤进行说明: 一.主要页面原型 在进行主要页面原型设计之前,交互设计师需要: 一份主要的任务流程图(或是用例,一般由产品经理提供)一份主要功能列表(一

JavaScript中的原型和继承详解(图文)_javascript技巧

请在此暂时忘记之前学到的面向对象的一切知识.这里只需要考虑赛车的情况.是的,就是赛车. 最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事.最快的车被称为 Le Mans 原型车.这些车虽然是由"奥迪"或"标致"这些厂商制造的,可它们并不是你在街上或速公路上所见到的那类汽车.它们是专为参加高速耐力赛事而制造出来的. 厂家投入巨额资金,用于研发.设计.制造这些原型车,而工程师们总是努力尝试将这项工程做到极致.他们在合金.生物燃料.制动技术

屏幕纸原型设计:如何制作屏幕纸原型

文章描述:不止是纸上谈兵-屏幕纸原型. 作为一个从事用户体验研究的人来说,对于原型都应该不会感到陌生,不论是设计物理设备,网站还是应用程序,我们都会用到原型.在互联网领域,设计师经常会使用Flash,HTML等等的代码来实现原型的制作,这使得原型更加真实,更能收集到有价值的反馈. 但是,像这样的原型却不适用于产品设计周期之初,因为设计这样高保真度的原型,可能会减缓整个产品的设计进程,有时候还需要有程序员的协助,并且任何对于原型的修改都显得比较麻烦.换句话说,这样的高保真模型,不够灵活. 低保真度

交互设计总结:原型设计方法

根据Standish Group的"Chaos Chronicles Report ",大约 66% 的软件开发项目不是失败,就是超出预算.超出项目时间,或是交付缩水的功能. 项目失败或亏损的前三大原因为: 缺乏使用者的参与 需求或规格不完整 需求或规格变更 白大哥在上一回的<我们的UED设计流程及方法>中也提到,一些需求管理工具或者上百页的文档已经不合时宜,不能作为我们跟客户讨论交流的介质和核心.所以我们需要制作原型,用来提高与客户沟通的效率.让客户参与到设计中来并且帮助

分享比较热门的原型设计工具

交互设计师的一项重要工作就是进行产品原型设计(Prototype Design).而产品原型设计最基础的工作,就是画出站点的大体wireframe(框架图)并结合批注.大量的说明以及流程图等,将自己的产品原型完整而准确的表述给产品.UI.重构/开发工程师等等,并通过沟通反复修改prototype 直至最终确认,然后进入后续的设计开发流程. 要完成以上复杂的设计和沟通工作,需要一个好的原型设计工具.这里就目前常用的和比较热门的工具来分享一下:Word(产品经理比较常用)Fireworks(交互组内