操作语义学 代数语义学 公理语义学 程序设计语言 形式语义 指称语义学 函数式描述方法 理论基础

Slides:



Advertisements
Similar presentations
2.5 函数的微分 一、问题的提出 二、微分的定义 三、可微的条件 四、微分的几何意义 五、微分的求法 六、小结.
Advertisements

Tool Command Language --11级ACM班 金天行.
上課囉 職場甘苦談 小資男孩向錢衝 育碁數位科技 呂宗益/副理.
函数式编程语言、编程和程序验证 计算机科学与技术学院 陈意云
Oracle数据库 Oracle 子程序.
程設一.
主机DB2数据库应用与编程 任课老师:王湖南 四川大学计算机(软件)学院.
程序的形式验证 - 简介 中国科学院软件研究所 张文辉 1.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
第八章 符号表 符号表的作用: 一致性检查和作用域分析; 辅助代码生成..
課程名稱:程式設計 授課老師:________
第二章 C# 基础知识.
陳維魁 博士 儒林圖書公司 第七章 參數的傳遞 陳維魁 博士 儒林圖書公司.
C++Primer 3rd edition 中文版 Chap 5
程式語言 -Visual Basic 變數、常數與資料型態.
第一次随堂作业(10.16) 请用扩展的 BNF 描述 C语言里语句的结构; 请用扩展的 BNF 描述 C++语言里类声明的结构;
EBNF 请用扩展的 BNF 描述 C语言里语句的结构; 请用扩展的 BNF 描述 C++语言里类声明的结构;
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
笫11章指针 指针是现代程序设计语言中一个非常重要的概念,它使语言的功能大大加强。FORTRAN90以前的FORTRAN版本,没有指针这种数据类型,FORTRAN90对其作了重大改进,引入了指针的概念。但是值得注意的是,FORTRAN90的指针与C语言中的指针并不相同,因为它并不代表一个变量的地址,而是代表一个变量的别名,实质上它相当于C++里的引用,本章介绍指针的概念与应用。
第4章 程序控制结构与算法基础.
管理信息结构SMI.
走进编程 程序的顺序结构(二).
辅导课程六.
第四章 程序语言的性质.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Online job scheduling in Distributed Machine Learning Clusters
模型验证器VERDS Wenhui Zhang 31 MAY 2011.
泛型委托 泛型接口、方法和委托.
第2章 PL/0编译程序 2.1 PL/0语言和类pcode的描述 2.2 PL/0编译程序的结构 2.3 PL/0编译程序的语法语义分析
計數式重複敘述 for 迴圈 P
第七章 操作符重载 胡昊 南京大学计算机系软件所.
第11章 指称语义的原理与应用 指称语义学是Christopher Strachey和Dana Scott在1970年提出的。指称语义学是Christopher Strachey和Dana Scott在1970年提出的。指称语义学是Christopher Strachey和Dana Scott在1970年提出的。
若2002年我国国民生产总值为 亿元,如果 ,那么经过多少年国民生产总值 每年平均增长 是2002年时的2倍? 解:设经过 年国民生产总值为2002年时的2倍, 根据题意有 , 即.
第一章 函数与极限.
编译原理实践 11.语义分析与代码生成.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
数列.
實作輔導 2 日期: 3/24(星期六) 09:10~16:00 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口)
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C语言程序设计 主讲教师:陆幼利.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
第六章 语法制导的翻译 本章内容 介绍一种语义描述方法:语法制导的翻译,介绍语法制导的翻译的实现方法。
第二章、第三章错题分析.
陳維魁 博士 儒林圖書公司 第三章 變數與繫結 陳維魁 博士 儒林圖書公司.
保留字與識別字.
第4章 Excel电子表格制作软件 4.4 函数(一).
Oracle Database 10g基础教程 清华大学出版社
參數 實際參數(Actual parameter)與形式參數(Formal parameter)
第九节 赋值运算符和赋值表达式.
iSIGHT 基本培训 使用 Excel的栅栏问题
第9章 存储过程的创建和使用 9.1 存储过程简介 9.2 创建存储过程 9.3 修改存储过程 9.4 删除存储过程 9.5 执行存储过程.
3.16 枚举算法及其程序实现 ——数组的作用.
本节内容 Lua基本语法.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
第7章 模板 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
Ch07. 函式.
進階 WWW 程式設計 -- PHP Array 靜宜大學資訊管理學系 蔡奇偉副教授
Go 语言编程 —— 平台研发部 吴植民.
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第6章 PHP基本語法介紹.
判斷(選擇性敘述) if if else else if 條件運算子.
陳維魁 博士 儒林圖書公司 第六章 領域與範圍 陳維魁 博士 儒林圖書公司.
编译原理实践 6.程序设计语言PL/0.
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
Presentation transcript:

操作语义学 代数语义学 公理语义学 程序设计语言 形式语义 指称语义学 函数式描述方法 理论基础 执行 公理语义学 程序设计语言 形式语义 代数 逻辑 关系 模型 功能 指称语义学 函数式描述方法 理论基础

程序设计语言 编译原理 程序设计语言 形式语义 离散数学 语法形式化 语义形式化 程序设计语言 形式语义 理论基础 离散数学

程序设计语言理解 程序设计方法 抽象能力 程序设计语言 形式语义 软件开发方法 Formal Method 程序设计语言理解 程序设计方法 抽象能力 程序设计语言 形式语义 Formal Verification 软件开发方法 Formal Specification

第九章 指称语义的原理与应用 指称语义学是Christopher Strachey和Dana Scott在1970年提出的。 指称语义学的一个显著特征是: 程序中的每一个短语(表达式、命令、声明等)都有其意义。它是与语言的语法结构平行的。每个短语的语义函数就是短语的指称意义。其现代名称为指称语义学。 16.1 指称语义原理 从数学的观点,一个程序可以看作是从输入到输出的映射P(I)→O,即输入域(domain)上的值,经过程序P变为输出域(range)的值。 φ〖p〗→d (p∈P,d∈D)。 语义域D中的数学实体d, 或以辅助函数表达的复杂数学实体d',称为该短语的数学指称物,即短语在语义函数下的指称语义。 指称语义描述的是语义函数映射的后果,不反映如何映射的过程,更没有过程的时间性。而程序设计语言的时间性只能反映到值所表达的状态上。

我们给出求值的语义函数:将Numeral集合中的对象映射为自然数: valuation: Numeral→Natural (16.2) ● 语义函数和辅助函数 描述二进制数的语义 二进制数 Numeral ::= 0 (16.1-a) | 1 (16.1-b) | Numeral 0 (16.1-c) | Numeral 1 (16.1-d) 我们给出求值的语义函数:将Numeral集合中的对象映射为自然数: valuation: Numeral→Natural (16.2) 按语法的产生式,我们给出以下语义函数: valuation 〖0〗= 0 valuation 〖1〗 = 1 valuation 〖N0〗 = 2 × valuation 〖N〗 ∥N∈Numeral valuation 〖N1〗 = 2 × valuation 〖N〗+ 1

valuation〖1101〗 = 2 × valuatioin 〖110〗+ 1 = 2 × (2 ×(2 ×1 + 1)) + 1 = 13 计算器命令的语义描述 计算器命令的抽象语法: Com ::= Expr= (16.3) Expr ::= Num (16.4-a) | Expr + Expr (16.4-b) | Expr - Exp (16.4-c) | Expr * Expr (16.4-d) Num ::= Digit|Num Digit (16.5) Digit ::= 0|1|2|3|4|5|6|7|8|9 (16.6) execute : Com →lnteger evaluate: Expr →lnteger sum : Integer × Integer → Integer difference : Integer × Integer → Integer product : Integer × Integer → Integer

以下定义每个短语的语义函数: execute 〖C〗 = execute 〖E=〗 = evaluate 〖E〗 其中C∈Com,E∈Expr。 evaluate 〖N〗= valuation 〖N〗 (N∈Num) evaluate 〖E1 + E2〗 = sum (evaluate 〖E1〗,evaluate 〖E2〗) evaluate 〖E1 - E2〗 = difference (evaluate 〖E1〗,evaluate〖E2〗) evaluate 〖E1 * E2〗 = product (evaluate 〖E1〗, evaluate 〖E2〗) 再定义Num的两个表达式: valuation 〖D〗 = D’ (D∈Digit,D’∈Natural) valuation 〖ND〗= 10 × valuation 〖N〗+ D’ execute 〖40-3*9=〗 =evaluate 〖40-3*9〗 =product (evaluate〖40-3〗,evaluate〖9〗) =product (difference (evaluate 〖40〗,evaluate 〖3〗), evaluate〖9〗) =product (difference (valuation〖40〗,valuation〖3〗), valuation〖9〗) =product (difference (40,3),9) =333

16.1.2 语义域 · 基本域 · 笛卡儿积域 · 不相交的联合域 Character / lnteger / Natural / Truth-Value / Unit 用户可定义枚举域,以及以基本域构造的复合域。 · 笛卡儿积域 D×D' 元素为对偶(x,x')其中x∈D,x'∈D'。 D1×D2×…Dn元素为n元组(x1,x2,…,xn),其中xi∈Di。 · 不相交的联合域 D+D' 元素为对偶(left x,right x')其中x∈D,x'∈D'。 shape=rectangle( Real×Real ) + circle Real + point

· 函数域 D→D' 例如lnteger→Even。 f(v) →⊥ 偏函数,v∈V f(⊥)→⊥ 严格的偏函数 f(⊥)→v 非严格函数 偏函数域上元素间具有偏序关系,偏序关系‘≤’的性质是: · D域若具偏序性质,它必须包含唯一的底元素,记为⊥,且⊥≤d,d为D中任一元素。通俗解释是d得到的定义比⊥多。⊥是不对应任何值的‘值’。 · 若 x,y ∈D,x≤y此二元素具有偏序关系‘≤’,即y得到的定义比x多。这一般就复合元素而言,即x中包含的⊥比y多。 · 若x,y,z∈D,则偏序关系‘≤’必须是: [1] 自反的,即有x≤x; [2] 反对称的,即若x≤y,y≤x,必然有x=y; [3] 传递的,即若x≤y,y≤z,必然有x≤z。

· 序列域 序列域D*中的元素是零个或多个选自域D中的元素有限序列,或为nil元素,或为x·s的序列 nil ∥ 一般写法是“ ” ‘a’·nil ∥ 一般写法是“a” ‘B’·‘u’·‘s’·‘y’· nil ∥一般写法是“Busy” 16.1.3 命令式语言的特殊域 · 存储域 Store = Location → ( stored Storable + undefined + unused) (16.15)

empty-store : Store (16.16) allocate : Store →Store × Location (16.17) deallocate : Store ×Location → Store (16.18) update : Store × Location × Storable→Store (16.19) fetch : Store × Location→Storable (16.20) empty_store = λloc.unused allocate sto = let loc = any_unused_location (sto) in (sto [loc→ undefined],loc) deallocate (sto,loc) = sto [loc → unused] update (sto,loc,stble) = sto [loc→stored stble] fetch (sto,loc) = let stored_value (stored stble) = stble stored_value (undefined) = fail stored_value (unused) = fail in stored-value (sto(loc))

· 环境域 Environ = ldentifier→(bound Bindable + unbound) empty-environ : Environ bind : ldentifier×Bindable → Environ overlay : Environ×Environ → Environ find : Environ×ldentifier→Bindable enpty-environ = λI. unbound bind (I,bdble) = λI'. if I'=I then bound bdble else unbound overlay (env',env) = λI. if env' (I)/=unbound then env' (I) else env (I) find (env,I) = let bound_value (bound bdble) = bdble bound_value (unbound) = ⊥ in bound_value (env (I))

16.2 指称语义示例 · 过程式小语言 IMP 抽象语法是: Command ::= Skip 16.2 指称语义示例 · 过程式小语言 IMP 抽象语法是: Command ::= Skip | ldentifier := Expression | let Declaration in Command | Command; Command | if Expression then Command else Command | while Expression do Command Expression ::= Numeral | false | true | Ldentifier | Expression + Expression | Expression < Expression | not Expression | ... Declaration ::= const ldentifier = Expression | var ldentifier : Type_denoter Type_denoter ::= bool | int

Value = truth_value Truth_Value + integer lnteger · IMP的语义域、语义函数和辅助函数 Value = truth_value Truth_Value + integer lnteger Storable = Value Bindable = value Value + variable Location execute: Command →(Environ→Store→Store) execute〖C〗 env sto = sto’ evaluate: Expression → (Environ→Store →Value) evaluate 〖E〗 env sto= … elaborate: Declaration→ (Environ→Store→ Environ×store) elaborate 〖D〗 env sto =

辅助函数有如前所述的empty-environ,find,overlay,bind,empty-store,allocate,deallocate,update,fetch。以及sum,less,not等辅助函数。此外,再增加一个取值函数: coerce: Store×Bindable→Value coerce (sto,find (env,I)) = val = fetch (sto,loc) · IMP的指称语义 execute 〖Skip〗 env sto = sto execute 〖I:= E〗 env sto = let val = evaluate E env sto in let variable loc = find (env,I) in update(sto,loc,val) execute 〖let D in C〗 env sto = let (env',sto') = elaborate D env sto in execute C (overlay (env',env)) sto’

execute 〖C1; C2〗 env sto = execute C2 env (execute C1 env sto) execute 〖 if E then C1 else C2〗 env sto = if evaluate E env sto = truth_value true then execute C1 env sto else execute C2 env sto execute 〖while E do C〗= let execute_while env sto = then execute_while env (execute C env sto) else sto in execute_while

elaborate 〖 const I = E 〗 env sto = let val = evaluate E env sto in (bind (I,value val),sto) elaborate 〖 var I:T〗 env sto = let (sto',loc)= allocate sto in (bind (I,variable loc),sto')

16.3 程序抽象的语义描述 · 函数抽象 Function = Argument→Value Function = Argument→Store→Value bind_parameter: Formal_Parameter→(Argument→Environ) give_argument : Actual_Parameter→(Environ→Argument) · 扩充IMP语法 Command ::= … | Identifier (Actual_Parametor) Expression ::= … | Identifier (Actual_Parmenter) Declaration ::= … | func Identifier (Formal_Parameter) is Expression | proc ldentifier (Formal_paramenter) is Command Formal_Parameter ::= const Identifier: Type_Denoter Actual_parameter ::= Expression

Argument = Value Bindable = value Value + variable Location + function Function · 写IMP函数的指称语义 bind-parameter 〖I:T〗 arg = bind (I,arg) give-argument 〖E〗 env = evaluate E env 函数调用的语义等式如下: evaluate 〖I(AP)〗 env = let function func = find (env,I) in let arg = give_argument AP env in func arg

elaborate 〖fun I(FP) is E 〗 env = let func arg = let parenv = bind_parameter FP arg in evaluate E (overlay (parenv,env )) in (bind (I,function func)) · 过程抽象 Procedure = Argument→Store→Store Argument = Value Bindable = value Value + variable Location+functionFunction +procedure Procedure execute 〖 I(AP) 〗 env sto=

let procedure proc = find (env,I) in let arg = give_argument AP env sto in proc arg sto elaborate 〖proc I(FP) is C 〗 env sto = let proc arg sto' = let parent = bind-parameter FP arg in execute C (overlay (parenv env)) sto' in (bind (I,procedure proc),sto) · 参数机制的语义描述 --- 常量和变量参数 先细化参数定义语法 Formal-Parameter ::= const Identifier: Type_denoter | var Identifier : Type_denoter Actual-P arameter ::= Expression | var Identifier

bind_parameter : Formal_parameter→(Argument→Environ) give_parameter : Actural_Parameter→(Environ→Store→Argument) 形参的语义等式是: bind_parameter 〖const I:T〗 (value val) = bind (I,value val) bind_parameter 〖var I:T〗 (variable loc)= bind(I,variable loc) 实参的语义等式是: give_argument 〖E〗 env sto = value (evaluate E env sto) give_argument 〖var I〗 env sto = let variable loc = find (env,I) in variable loc

--- 复制参数机制 Formal_Parmeter ::= value Identifier: Type_denoter | result Identifier : Type_denoter Actual_Parameter ::= Expression | var Identifier copy_in: Formal_Parameter→(Argument→Store→Environ×Store) copy_in 〖value I:T〗 (value val) sto = let (sto',local) = allocate sto in (bind (I,variable local),update (sto',local,val)) copy-in 〖 result I:T〗 (variable loc) sto= let (sto',local)= allocate sto in (bind (I,variable local),sto') copy_out: Formal_Parameter→(Environ→ Argument→Store→Store)

copy_out 〖 value I:T〗 env (vlaue val) sto = sto copy_out 〖result I:T〗 env (variable loc) sto = let variable local = find (env,I) in update (sto,loc,fetch (sto,local)) 过程声明的语义等式作以下修改: elaborate〖proc (FP) is C 〗 env sto= let proc arg sto'= let (parenv,sto") copy_in FP arg sto' in let sto''' = execute C (overlay (parenv,env )) sto" in copy_out FP parenv arg sto''' in (bind (I,procedure proc),sto)

--- 多参数 Function = Argument*→Store→Value Procedure = Argument* →Store→Store bind_parameter : Formal_Parameter_List→(Argument* →Environ) give_argument:Acrual_Parameter_List→(Environ →Store →Argament*) --- 递归抽象 递归函数声明的语义等式如下: elaborate〖 fun I (FP) is E〗 env= let func arg = let env'=overlay (bind (I,function func),env) in let parenv = bind-parameter FP arg in evaluate E (overlay (parenv,env')) in bind (I,function func)

暂不考虑函数和过程抽象,只增加最简单的复合量对偶(A:T1,B:T2).先扩充抽象语法: 16.4 复合类型 最简单的复合变量的语义描述 暂不考虑函数和过程抽象,只增加最简单的复合量对偶(A:T1,B:T2).先扩充抽象语法: Command ::= … |V_name := Expression | … Expression ::= … |V_name | (Expression,Expression) V-name ::= Identifier |fst V_name ∥相当于V(1) |snd V_name ∥相当于V(2) Type_denoter ::= bool |int |(Type_denoter,Type_denoter) 对偶值本身是一个域: Pair_Value = Value×Value 对偶变量的域: Pair_Variable = Variable×Variable

fetch_variable: Store×Variable→ Value Value = truth_value Truth_Value + integer Integer + pair_value Pair_Value Storable = truth_value Truth_Value + integer Integer Variable = simple_variable Location + pair_variable Pair_Variable 辅助函数: fetch_variable: Store×Variable→ Value update_variable: Store×Variable×Value→ Store fetch_variable(sto,simple_variable loc) = fetch(sto,loc) fetch_variable(sto,pair_variable (var1,var2)) = pair_value(fetch_variable(sto,var1),fetch-variable (sto,var2)) update_variable(sto,simple_variable loc,stble ) = update (sto,loc,stble) update_variable (sto,pair_variable (var1,var2), pair_value (val1,val2))= let sto'=update_variable (sto,var1,val1) in update_variable (sto',var2,val2)

增加识别(identify)和分配变量存储(allocate_variable)的语义函数: identify: V-name → (Environ→ Value_or_Variable) Value_or_Variable = value Value + variable Variable identify〖I〗 env = find(env,I) identify〖fst V 〗env = let first (value (pair_value (val1,val2))) = value val1 | first (variable (pair_variable (var1,var2))) = variable var1 in first (identify V env)//辅助函数first将对偶值或对偶变量映射为它的第一子域。 赋值语句语义等式: execute 〖V:= E〗 env sto = let val = evaluate E env sto in let variable var = identify V env in update_variable (sto,var,val) evaluate 〖V〗 env sto= coerce (sto,identify V env) coerce: Store ×Value_or_Variable→Value coerce (sto,value val ) = val coerce (sto,variable var) = fetch_variable (sto,var)

allocate_variable: Type_denoter→Allocator Allocator = Store→ Store×Variable 例:为类型指明符bool分配存储的语义是: allocate_variable 〖bool〗 sto= let (sto',loc) = allocate sto in (sto',simple_variable loc) 为对偶指明符分配存储的语义是: allocate_variable〖(T1,T2)〗 sto= let (sto',var1) = allocate_variable T1 sto in let (sto’,var2) = allocate_variable T2 sto' in (sto’,pair_variable (var1,var2)) 变量声明的语义: elaborate〖var I:T〗 env sto= let (sto',var) = allocate_variable T sto in (bind(I,var),sto') 数组变量的语义描述(参考教材)

16.5 程序失败的语义描述 sum: Integer × Integer→ Integer sum (int1,int2) = if abs(int1+int2) <=maxint then int1+int2 else ⊥ sum (⊥,int2)= ⊥ sum (int1,⊥) = ⊥ evaluate 〖E1 + E2〗 env sto = let integer int1 = evaluate E1 env sto in let integer int2 = evaluete E2 env sto in integer (sum (int1,int2))

16.6 指称语义应用 · 指称语义用于设计语言 为一个程序设计语言写指称语义的步骤是: ·分析(所设计的)程序设计语言的规格说明写出抽象语法。 ·定义该语言的指称域,并为这些域定义洽当的辅助函数以模型值上的操作。 建立语义函数。为抽象语法中的每个短语(即短语类)指定一个域(语义函数的 输入域),定义输入域到其指称域的语义函数。 ·为每一短语类写出语义等式。

16.6.2 指称语义用于程序性质研究 · 上下文约束的静态描述 在程序设计语言的文法产生的所有句子之中只有一部分是良定义的。语法往往不能给出明确的表示,要依靠上下文约束。 用指称语义的方法描述程序设计语言的上下文约束要建立类型环境的概念。语言中各类型之总称即为Type域。例如,在前述IMP语言中类型域是: Type=truth_type + integer_type + var_type + error_type Type_Environ = Identifier→(bound Type + unbound) equivalent: Type×Type→Truth_Value

可测试两种类型是否等价。 constrain: Command→(Type_Environ→Truth_Value) 检查命令在类型环境中是否遵从约束,即是否良定义的。 typify: Expression→(Type_Environ→Value_Type) 验明表达式的类型,即在类型环境中的具体类型。 declare : Declaration→(Type_Environ→Truth_Value×Type_Environ) 在类型环境中给出声明是良定义的真值, 以及所产生的类型束定。 type_denoted_by: Type_Denoter→Value_Type 产生类型指明符的真实类型。类型环境域有以下辅助函数: empty_environ : Type_Environ bind : ldentifier × Type →Type_Environ overlay: Type_Environ×Type_Environ→Type_Environ find: Type_Environ×Identifier→Type · 程序推理 C; ship ≡ C。要证明相等,即指出两端指称一样即可: execute 〖C; skip〗 env sto = execate 〖skip〗 env (execute C env sto) = execute C env sto

将域的各等式也转成ML的datatype定义: type Location = int; datatype Value= truthvalue of bool |integer of int; type Stroeable = Value; datatype Bindable = value of Value | variable of Location; 再写出具体函数定义: fun execute (skip) env sto = sto |execute (IbceomesE(I,E)) env sto = let val val' = evaluate E env sto in let val variable loc = find (env,I) in update (sto,loc,val') end | execute (letDinC (D,C)) env sto = let val (env',sto') = elaborate D env sto in execute C (overlay (env',env)) sto'

16.6.3 语义原型 先将抽象语法改写为ML的datatype 定义: type Identifier = string and Num eral = string; datatype Command = skip |IbecomesE of Identifier * Expression |letDinC of Declaraton * Command |CsemicolonC of Command * Command |ifEthenCelseC of Expressiion * Command * Command |whileEdoC of Expression * Command and Expression = num of Numeral |flase' |true' |ide of Identifier |EplusE of Expression * Expression and Declaration= constIisE of Ldentifier * Expression |varIcolonT of Ldentifier* Typerdenoter and Typedenoter= bool' |int'

将域的各等式也转成ML的datatype定义: type Location = int; datatype Value= truthvalue of bool |integer of int; type Stroeable = Value; datatype Bindable = value of Value | variable of Location; 再写出具体函数定义: fun execute (skip) env sto = sto |execute (IbceomesE(I,E)) env sto = let val val' = evaluate E env sto in let val variable loc = find (env,I) in update (sto,loc,val') end | execute (letDinC (D,C)) env sto = let val (env',sto') = elaborate D env sto in execute C (overlay (env',env)) sto'

| execute (CsemicolonC (C1,C2)) env sto = execute C2 env (execate C1 env sto) | execute (if E then C else C (E,C1,C2)) env sto = if valuate E env sto = truthvalue true then execute C1 env sto else execute C2 env sto | execute (whileEdoC (E,C))= let fun executewhile env sto = if evaluate E env sto = truthvalue true then executewhile env (execute C env sto ) else sto in executewhile end and evaluate (num N) env sto = integer (valuation N) |evaluate (false') env sto = truthvalue false |evaluate (true') env sto = truthvalue true |evaluate (ide I) env sto = coerce (sto,find (env,I ))

|evaluate (EplusE( E1,E2 )) env sto = let val integer int1 = evaluate E1 env sto in let val integer int2 = evaluate E2 env sto in integer (sum ( int1,int2 ) ) end |... and elaborate (constIisE ( I,E )) env sto= let val val'=evaluate E env sto in (bind (I,value val’),sto) |elaborate (varIcolonT( I,T )) env sto= let val (sto',loc)=allocate sto in ( bind ( I,variable loc ),sto') valuation (N) = integer (stringtoint N)

以上按IMP 抽象语法套写语义函数execute, evaluate,elaborate. 还要把辅助函数改写为ML: fun coerce ( sto,value val')= val' |coerce ( sto,vatiable loc ) = fetch ( sto,loc ) 设置初始条件运行ML程序 有了以上定义,即可运行抽象语法树的ML解释器,例如: val env0=...; //初始环境 val sto0=...; //初始存储 val prog=...; //一条IMP命令的抽象语法树 execute prog env0 sto0;