技术经验解读:作业4文法和语言总结与梳理

简介: 技术经验解读:作业4文法和语言总结与梳理

1.梳理第二章内容,写一篇理解与总结。


一、文法和语言的形式与定义。


(1)什么是文法?文法是对语言结构的定义与描述,即从形式上描述和规定语言结构,也称为语法。任何一个文法都可以表示为一个四元组G=(VN,VT,P,S)。


VN是一个非空的有限集合,它的每个元素称为非终结符号。


VT是一个非空的有限集合,的每个元素称为终结符号。


P是一个非空的有限集合,它的每个元素称为产生式。


S是一个特殊的非终结符号,称为文法的开始符号。


(2)什么是语言?在某一确定字母表上的特定符号串的集合。


(3)语法规则。通过产生一组规则(产生式),来描述句子的语法结构。


(4)由产生式推导句子。推导方法:从一个要识别的符号开始推导,即用相应产生式的右部来代替产生式的左部,每次仅用一条产生式进行推导。


(5)句型。由起始符推导出来的符号串。


(6)句子。仅含有终结符合的句型。


(7)语言。句子的集合。


二、符号和符号串


(1)字母表. 符号的非空有限集合。典型的符号是字母、数字、各种标点和运算符等。


(2)符号串.定义在某一字母表上,由该字母表中的符号组成的有限符号序列。


(3)符号串有关的几个概念。


①长度。符号串a的长度是指a中出现的符号的个数,记作|α|。


②空串。长度为0的符号串,常用ε表示。|α|=0


③前缀(头)。符号串α的前缀是指从符号串α的末尾删除0个或多个符号后得到的符号串。如:univ 是 university 的前缀。


④后缀(尾)。符号串α的后缀是指从符号串α的开头删除0个或多个符号后得到的符号串。如:sity 是 university 的后缀。


⑤子串。符号串α的子串是指删除了α的前缀和/或后缀后得到的符号串。如:ver 是 university 的子串。


⑥真前缀、真后缀、真子串 。如果非空符号串β是α的前缀、后缀或子串,并且β不等于α,则称b是α的真前缀、真后缀、或真子串。


⑦子序列。符号串α的子序列是指从α中删除0个或多个符号(这些符号可以是不连续的)后得到的符号串。如:nvst。


(4)符号串运算。


①连接。符号串α和符号串β的连接αβ是把符号串β加在符号串α之后得到的符号串,若α=ab,β=cd,则αβ=abcd,βα=cdba。对任何符号串α来说,都有εα=αε=α。


②幂。若α是符号串,α的n次幂是αn 。当n=0时,α0是空串。e假如α=ab,则有:α0=ε、α1=ab、α2=abab、α3=...


三、文法类型和语法树。


(1)文法分类。


①0型文法/无限制文法:α->β,其中α∈(Vn∪Vt)且至少含有一个非终结符,β∈(Vn∪Vt)


②1型文法/上下文有关文法:αAβ->αuβ,其中A∈Vn,α,β∈(Vn∪Vt),u∈(Vn∪Vt)+。


③2型文法/上下文无关文法:A->β,其中A∈Vn,β∈(Vn∪Vt)。常用于句法分析。


④3型文法/正规文法:常用于词法分析。


右线性文法:只能对推出式的右边展开,A->αB|α,A,B∈Vn,α∈Vt


左线性文法:只能对推出式的左边展开,A->Bα|α,A,B∈Vn,α∈Vt


(2)语法树。


①短语。是句型中的某个非终结符所能推出的符号串。


②直接短语。不能再推导出其他式子的符号串


③句柄。最左的直接短语。


④最左推导。每个推导过程都是从最左边的非终结符号的替换开始。


⑤最右推导。每个推导过程都是从最右边的非终结符号的替换开始。


(3)文法的二义性。如果一个文法的某个句子有不止一棵分析树,则这个句子是二义性的句子。含有二义性句子的文法是二义性的文法。


2. 尝试写出PL/0 语言的文法。


整数n


n :: = 【-】{[span style="font-family: 宋体">非零数字数字

[span style="font-family: 宋体">非零数字

[span style="font-family: 宋体">数字

标识符i


i::=[span style="font-family: 宋体">字母字母数字

[span style="font-family: 宋体">字母

[span style="font-family: 宋体">数字

表达式e


e ::= 【+|-】[span style="font-family: 宋体">项加减运算符项

[span style="font-family: 宋体">项因子乘除运算符因子

[span style="font-family: 宋体">加减运符

[span style="font-family: 宋体">因子标识符无符号整数表达式

[span style="font-family: 宋体">乘除运算符

[span style="font-family: 宋体">标识符字母字母数字

[span style="font-family: 宋体">无符号整数数字数字

[span style="font-family: 宋体">数字

[span style="font-family: 宋体">字母

条件语句


[span //代码效果参考:http://www.jhylw.com.cn/212028435.html

style="font-family: 宋体">条件语句条件语句

[span style="font-family: 宋体">条件表达式关系运算符表达式表达式

[span style="font-family: 宋体">表达式项加减运算符项

[span style="font-family: 宋体">项因子乘除运算符因子

[span style="font-family: 宋体">加减运符

[span style="font-family: 宋体">因子标识符无符号整数表达式

[span style="font-family: 宋体">乘除运算符

[span style="font-family: 宋体">标识符字母字母数字

[span style="font-family: 宋体">字母

[span style="font-family: 宋体">无符号整数数字数字

[span style="font-family: 宋体">数字

[span style="font-family: 宋体">关系运算符=


[span style="font-family: 宋体">语句赋值语句条件语句当型循环语句过程调用语句读语句写语句复合语句空语句

[span style="font-family: 宋体">赋值语句标识符表达式

[span style="font-family: 宋体">当型循环语句条件语句

[span style="font-family: 宋体">过程调用语句标识符

[span style="font-family: 宋体">读语句标识符标识符

[span style="font-family: 宋体">写语句表达式表达式

[span style="font-family: 宋体">复合语句语句语句

[span style="font-family: 宋体">空语句

赋值语句、复合语句如上所述。


函数


[span style="font-family: 宋体">函数类型说明函数名复合语句

程序


[span style="font-family: 宋体">程序分程序

[span style="font-family: 宋体">分程序常量说明部分变量说明部分过程说明部分语句

[span style="font-family: 宋体">常量说明部分常量定义常量定义

[span style="font-family: 宋体">常量定义标识符无符号整数

[span style="font-family: 宋体">变量说明部分标识符标识符

[span style="font-family: 宋体">过程说明部分::=[/span>过程首部分程序过程说明部分

[span style="font-family: 宋体">过程首部标识符

相关文章
|
1月前
|
存储 算法 Java
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)(一)
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)
52 1
|
1月前
|
Java API
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)(三)
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)
46 0
|
1月前
|
存储 设计模式 监控
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)(二)
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)
47 0
|
1月前
|
存储 C语言
深入浅出 C 语言:学变量、掌控流程、玩指针,全方位掌握 C 编程技能
C 语言介绍 C 语言的特性 C 语言相对于其他语言的优势 C 程序的编译 C 中的 Hello World 程序
56 2
|
8月前
|
敏捷开发 算法 安全
如何写出高质量代码:特征、编程实践技巧和软件工程方法论
如何写出高质量代码:特征、编程实践技巧和软件工程方法论
|
敏捷开发 测试技术 开发者
以始为终,高效澄清需求| 学习笔记
快速学习以始为终,高效澄清需求
356 0
以始为终,高效澄清需求| 学习笔记
|
监控 数据可视化 测试技术
软工导第一节课 计算机软件工程学作一个简短的概述,回顾计算机系统发展简史 软件工程的基本原理和方法有概括的本质的认识,详细讲解生命周期相关知识讲解8种典型的软件过程模型
软工导第一节课 计算机软件工程学作一个简短的概述,回顾计算机系统发展简史 软件工程的基本原理和方法有概括的本质的认识,详细讲解生命周期相关知识讲解8种典型的软件过程模型
215 0
软工导第一节课 计算机软件工程学作一个简短的概述,回顾计算机系统发展简史 软件工程的基本原理和方法有概括的本质的认识,详细讲解生命周期相关知识讲解8种典型的软件过程模型
|
IDE 测试技术 开发工具
ALPD学习笔记 4:高效高质量编码,测试先行和意图导向的编程
# 由外而内:发现和形成设计职责 设计是一种信息不完全情况下的决策:从最开始我们并不知道要用什么数据结构可能是最好的,如果一开始就从底层数据结构开始写,需要耗费更多脑力。 我们首先应该写确定的功能性代码,一般来说外层功能相对确定,但是底层数据结构我们不一定知道。 延迟决策到最后时刻关键信息经常会自然显现 由外而内的变成允许暂时忽略不重要的细节,“意图导向编程 Programming By Inte
201 0
ALPD学习笔记 4:高效高质量编码,测试先行和意图导向的编程
|
测试技术
软件测试面试题:自动化中有哪三类等待?他们有什么特点?
软件测试面试题:自动化中有哪三类等待?他们有什么特点?
147 0
|
存储 自然语言处理 索引
掌握Python语法篇:核心编程能力基础第一阶段
掌握Python语法篇:核心编程能力基础第一阶段
138 0