编译原理(四) 语言及其文法的基本概念

简介: 编译原理(四) 语言及其文法的基本概念

1.字母表

字母表∑是一个有穷符号集合,符号可以是: 字母 数字 标点符号等

常见的字母表有

二进制字母表 {0 ,1}

ASCII字符集

Unicode 字符集

2.字母表的运算

1. 字母表∑1和∑2的乘积

∑1∑2 = {ab | a ∈ ∑1, b ∈ ∑2 }
{0 ,1} {a, b} = {0a, 0b, 1a, 1b}

2.字母表∑的n次幂

∑^0 = { ε }     表示空串
∑^n = {  ∑^n-1  ∑  }
{0 ,1}^3 = {0, 1} {0, 1} {0, 1} 
={000, 001, 010, 011, 100, 101, 110, 111}

3.字母表∑的正闭包

∑+ = ∑ ∪ ∑^2 ∪ ∑^3 ∪ ........
{a, b, c, d}+ 
= {a, b , c, d, aa, 
ab, ac, ad,.....
aaa, aab, aac, aad, .....}

正闭包就是长度为正数的字符串的集合

4.字母表∑的克林闭包

∑* = ∑^0 ∪ ∑+ = ∑^0 +  ∑^1 ∪  ∑^2 ∪  ∑^3 ∪.......

克林闭包是任意符号串(长度可以为零)构成的集合


3.串

设∑是一个字母表, 任意x∈ ∑*, 那么x称作∑上的一个串

串是字母表中符号的一个有穷序列

串s的长度,通常记作|s| 就是指s中符号的个数

空串就是长度为零的串


4.串上的运算

1.串的基本运算

如果x 和y是串,那么x 和 y的链接,就是把y追加到x的后边,记作xy

x = hello
y = world
xy = helloworld

任何串链接空串,结果都不变

设x,y,z是三个字符串,如果x = yz, 那么y是x的前缀,z是x的后缀

2.串s的幂运算

s^0 = ε
s^n = s^n-1 s
s^1 = s^0  s  
s = ε s
s ^ 2 = s s
s ^ 3 = s s s

例如:s = hello

则: s1 = hello

s ^ 2 = hellohello
s ^ 3 = hellohellohello

5.文法定义–句子的构成规则

G = (Vt, Vn, P, S)

1.Vt表示 终结符集合 是文法定义语言的基本符号,也称作 token

例:

Vt = {apple, boy, eat, little}

2.Vn表示 非终结符集合 用来表示语法成分的符号, 也称作 语法变量

Vn = {<句子>, <名词短语>, <动词短语>...}
Vt ∩ Vn = ∅
Vt ∪ Vn:  表示 文法符号集

3.p表示产生式集合

产生式描述了将终结符和非终结符组合成串的方法

一般形式 a -> b

读作 a 定义为b

a ∈ (Vt ∪ Vn)+ 且 a中至少包含一个非终结符 a也称为产生式的头或者左部

b ∈ (Vt ∪ Vn)* 称作产生式的体或者右部


4.s表示开始符号

开始符号表示的是该文法中最大的语法成分

例 : s = <句子>


5. 文法举例

G = ( Vt, Vn, P, E )
Vt = {id, +, *, (, ) }
Vn = {E}
P = {
    E -> E + E,
    E -> E * E,
    E -> (E),
    E -> id
}

我们约定在不引起歧义的情况下,可以只写产生式:

G:  E -> E + E,
    E -> E * E,
    E -> (E),
    E -> id

6.产生式简写

对于一组有相同左部的a产生式

a -> b1, a->b2 a->b3 a->b4

可以简写为

a -> b1 | b2 | b3 | b4

读作a定义为b1 或者b2 或者b3 或者b4

b1 b2 b3 b4为候选式


7.符号约定

下述符号是终结符

字母表中的排在前边的小写字母比如 a, b, c

运算符 ,比如 + - *

标点符号 逗号,括号

数字 0, 1, 2, … 9

粗体字符串 id if等


下述符号为非终结符

字母表中排在前面的大写字符 A, B, C

字母S 通常表示开始符号

小写斜体的名字 比如 expr stmt等

代表程序够早的大写字母 E(表达式) T(项) F(因子)


下述是文法符号

字母表中排在后边的大写字母 (X, Y, Z)

即可以表示终结符,又可以表示非终结符


下述是终结符号串

字母表中排在后边的小写字母(u, v, …z)表示终结符号串(包括空串)


下述是文法符号串

小写希腊字母 α β 等 表示 文法符号串 也包括空串


若无特殊说明,第一个产生式的左部就是开始符号


相关文章
|
SQL 移动开发 算法
MySQL 8.0.23 Hypergraph Join Optimizer代码详解
MySQL Join MySQL本身没有常规意义上的执行计划,一般情况就是通过JOIN和QEP_TAB这两个结构组成。QEP_TAB 的全称是Query Execution Plan Table,这个“Table“可以是物理表、内存表、常量表、子查询的结果表等等。作为整个单独JOIN执行计划载体之前还承担着整个执行路径的调用和流转,但是从8.0.20后,全面的生成了独立的
1890 0
MySQL 8.0.23 Hypergraph Join Optimizer代码详解
|
缓存 前端开发 Java
使用http-server搭建静态文件服务器
本文介绍几种搭建静态文件服务器的方式,着重介绍基于node的http-server用法。
使用http-server搭建静态文件服务器
详尽分享电脑win键没有反应(最全方案)
详尽分享电脑win键没有反应(最全方案)
725 0
|
存储 Java Spring
深入理解org.springframework.web.context.request.RequestContextHolder
`RequestContextHolder`是Spring提供的一个便捷工具类,用于在非Controller层访问请求上下文信息。通过理解其工作原理和应用场景,可以更好地在Spring应用中管理和使用请求信息,提升代码的可维护性和扩展性。
510 0
Spring Boot 一个接口同时支持 form 表单、form-data、json 优雅写法
网上很多代码都是千篇一律的 cvs,相信我只要你认真看完我写的这篇,你就可以完全掌握这个知识点,这篇文章不适合直接 cvs,一定要先理解。
|
SQL 缓存 测试技术
RESTful API设计的最佳实践:构建高效、可维护的Web服务接口
【6月更文挑战第11天】构建高效、可维护的RESTful API涉及多个最佳实践:遵循客户端-服务器架构、无状态性等REST原则;设计时考虑URL结构(动词+宾语,使用标准HTTP方法)、使用HTTP状态码、统一响应格式及错误处理;确保数据安全(HTTPS、认证授权、输入验证);实施版本控制;并提供详细文档和测试用例。这些实践能提升Web服务接口的性能和质量。
|
JSON JavaScript 前端开发
Qt 5.14.2 深度解析:打造高效JSON处理利器
Qt 5.14.2 深度解析:打造高效JSON处理利器
928 0
|
监控 安全 Java
深入OAuth 2.0:常见过滤器及其重要性
深入OAuth 2.0:常见过滤器及其重要性
248 0
|
Linux
无敌解决GitHub无法ping通也无法登录的问题无敌解决idea连接GitHub提示Invalid authentication data. Connection reset
无敌解决GitHub无法ping通也无法登录的问题无敌解决idea连接GitHub提示Invalid authentication data. Connection reset
828 1
|
Linux 网络虚拟化
Centos 7 环境实现内网服务访问2
Centos 7 环境实现内网服务访问
553 0