代码编织梦想

CHAPTER 2 Formalizing Program Syntax

2.1 Concrete Syntax 具体语法

程序的定义是从编程语言的定义开始,而编程语言的定义是从它的语法开始,语法涵盖了哪些种类的短语基本上是格式化的。

具体语法决定了哪些字符序列是可以被接受的。

以简单的算术表达式语言为例,下面的字母串是有效的(valid):

3

x

3 + x

y x (3 + x)

以下字符串是无效的(invalid):

1 + + 2

x y z

这不是简单靠对算术的直觉去评判的,这里遵循一种叫作“巴科斯范式(Backus-Naur Form, BNF)”的语法。

巴科斯范式Backus-Naur Form, BNF

以美国人巴科斯(Backus)和丹麦人诺尔(Naur)的名字命名的一种形式化的语法表示方法,用来描述语法的一种形成体系,是一种典型的元语言。
它有一些语法规则:
· 在双引号中的东西代表它本身
· 双引号外的字代表语法
· <必选项> # 尖括号内表示必选项
· [可选项] #方括号内表示可选项
· {0次或多次} #大括号内表示可重复0次至多次的项
· | 代表 or
· ::= 读作定义为

换句话说,我们先假设常数 (Constants)和变量 (Variables)的集合,分别基于自然数 (N)和字符串 (Strings)的集合,然后定义表达式 (Expression),包含了常数、变量、加法和乘法。

fedb04f87b5812a8e1aeedd48b821f01.png

加法和乘法是递归指定的语法。巴科斯范式用递归来表达一个或多个符号。

举个例子,我们想表达“单词是有字母组成的”,这是日常语言;

那用数学的语言说就是,单词 = 一个字母或多个字母”;

用巴科斯范式的语法表达就是,单词::=<字母>|<字母><单词>,这个表达式里就有了递归。

再例如,“一个正整数是由一个或多个数字构成的”,寻常的表达式无法表达任意位数字构成的正整数,但通过递归可以完美地诠释出来:

<number> ::= <digit>|<digit><number>

<digit> ::= 0|1|2|3|4|5|6|7|8|9

归纳定义法 Inductive Definitions

归纳定义法是一个非常重要的工具,它解释了如何从一个较小的集合建立更大的集合。上面语法中的递归性质隐含地运用了归纳定义。用更通用的话来解释归纳定义就是,它提供了一系列定义集合的推理规则 (inference rules) ,在形式上,这个集合被定义为“满足所有规则的最小集合”。

每个规则都有前提 (premises)和结论 (conclusion),我们用四条规则来诠释上面的BNF语法,两者是完全等价的。

用于定义表达式 (Expressions)的一个集合Exp

045b258ae8572a6ca010831a15c4e680.png

这个推理规则这样来解读:

如果横线以上的所有事实都是真的,那么横线以下的事实也是真的。可以将这个表达式看作“if P then Q”的逻辑,分子是前提条件P,分母是Q。这条规则隐晦地表达出需要对其中出现的所有的元变量的值都成立(n, e1, e2称为元变量, metavariables)。

刚接触语义学的人往往会对这种定义风格产生消极的情绪,但很快就会发现它是一种非常紧凑的符号,可以用来表达很多概念,也可以把它看作是数学定义的特定领域的编程语言,这么说会比较抽象,但在Coq代码中可以具体体现出来。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ChantelleZ2019/article/details/128859380

计算机顶级会议排名以及英文投稿的一点经验-爱代码爱编程

转自:http://chl033.woku.com/article/2893317.html   1. 首先一定要注意杂志的发表范围, 超出范围的千万别投,要不就是浪费时间;另外,每个杂志都有他们的具体格式要求,一定要按照他们的要求把论文写好,免得浪费时间,前些时候,我的一个同事向一个著名的英文杂志投稿,由于格式问题,人家过两个星期就退回来了,而且说了

计算机各类会议及投稿文章总结,个人感觉入门超级有用!_七七啊的博客-爱代码爱编程

我是搬运工:http://chl033.woku.com/article/2893317.html   1. 首先一定要注意杂志的发表范围, 超出范围的千万别投,要不就是浪费时间;另外,每个杂志都有他们的具体格式要求,一定要按照他们的要求把论文写好,免得浪费时间,前些时候,我的一个同事向一个著名的英文杂志投稿,由于格式问题,人家过两个星期就退回来了,而

计算机各类会议及投稿文章总结(快速入门)-爱代码爱编程

1. 首先一定要注意杂志的发表范围, 超出范围的千万别投,要不就是浪费时间;另外,每个杂志都有他们的具体格式要求,一定要按照他们的要求把论文写好,免得浪费时间,前些时候,我的一个同事向一个著名的英文杂志投稿,由于格式问题,人家过两个星期就退回来了,而且说了很多难听的话,说投稿前首先就应该看清楚他们的格式要求; 2. 论文写作一定要言简意赅,特别是摘要,引言

A Few Useful Things to Know About Machine Learning 中英文对比和笔记-爱代码爱编程

A Few Useful Things to Know About Machine Learning 原文/翻译0. Introduction / 简介1. Learning = Representation + Evaluation + Optimization / 学习=表示+评价+优化2. It's Generalization that C

A002-185-2502-李林-爱代码爱编程

作业A002-185-2502-李林 课程名称 软件需求分析与建模 班级 18软件工程5班 教导教师 董瑞生 李林 1814080902502 日期 2020.12.15 目录 作业内容 目录1、Excel查找结合项目主题说明1.1第一次查词1.1.1 判定表(Decision table)1.1.2指导委员会(Steering commit

A002-185-2521-李子泓-爱代码爱编程

课程名称 软件建模与分析 班级 18软工5班专题名称 个人的需求分析与建模读书心得与对你组项目的发展建议 教导教师 董瑞生姓名 李子泓 学号 1814080902521 日期 2020年12月19号 一、个人的需求分析与建模读书心得 Function requirement 1)词语解说 {#词语解说 .list-paragraph} A Func

软件工程(三)——需求工程、需求开发、需求定义-爱代码爱编程

目录 一、需求定义 二、需求验证 三、需求管理 1.定义需求基线 2.需求跟踪  3.变更控制 四、软件系统建模 一、需求定义         把已经分析好的需求,落成文档,把东西记录下来,成为《需求规格说明书》。需求定义的方法有严格定义法 以及 原型法。严格定义法认为所有需求都能够被预先定义 ,开发人员和用户能够准确和清晰的沟

测试工程师笔试题整理01-爱代码爱编程

来源: https://vt.quark.cn/blm/quark-doc-ssr-293/preview?id=C2946438A278541B6C1284E5C22269AB 难度:⭐(简单) 一、基础题 1、对于软

2023年软考报哪门比较好?-爱代码爱编程

2023年软考报名还有一个月左右就会启动了,大家有想好报考哪门吗?不妨看看下文,让你的思路更加清晰。 软考科目汇总: (1)高级资格:网络规划设计师、系统规划与管理师、系统架构设计师、信息系统项目管理师、系统分析师;

【读书笔记】formal reasoning about programs -adam chlipala-爱代码爱编程

这本书可以翻译成《程序的形式推理》,近期导师推荐了这本书作为形式化验证方向的入门,在网上没看到什么关于这方面的中文资料,决定自己一边看一边写点笔记,大家一块学习讨论指教吧。 简单来说,这本书是关于一种方法,使软件工程能像其他更传统的工程学科一样,为现实计算机系统的严格分析提供数学基础。这么说可能有点抽象,举个例子,正如土木工程师会运用他们的数学准则来

设计模式-爱代码爱编程

目录 1.设计模式概述 1.1 软件设计模式的产生背景 1.2 软件设计模式的概念 1.3 学习设计模式的必要性 1.4 设计模式分类 设计模式中的重点: 1.设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中。 1977年美国著名建筑大师、加利福尼亚大学伯克利分校环

设计模式-爱代码爱编程

目录 2.UML图 2.1 类图概述 2.2 类图的作用 2.3 类图表示法 2.3.1 类的表示方式 2.3.2 类与类之间关系的表示方式 2.UML图 统一建模语言(Unified Modeling Language,UML)是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。 UM