空符号串:无任何符号的符号串,记为ε1.符号串的长度:|abc|=3 |abcc|=42.符号串的相等:依次相等(有序),符号串x和符号串y相等,记作x=y3.符号串的前缀和后缀前缀,从后删除。 后缀是:abc,bc,c,ε4.子串前缀+后缀,去掉重复的5.字符串的连接:按序连接6.字符串集合A与B的乘积:依次排序,不重不漏。 7.符号串的幂运算:即把x重复写n次,记作z=x^n^8.集合的幂运算:跟符号串的幂运算相对比,注意,集合得排列,符号串不需要。 元符号|,如:<数字>→0|1|2|3|4|5|6|7|8|9元符号< >,表示多个非终结符或多个字母组成的符号,如:<数字>元符号{ },表示可重复连接,{t}^m^~n~,表示符号串t可连接n-m次 [],[]里表示可有可无5.(),()括号内成分优先,可以提取公因式
优化 5. 目标代码生成 6. 表格管理和错误处理 1. 分界符 (,{,[, ],},)… 5. 数值型常量 10,3,… 2. 语法分析 输入单词符号串根据语言的语法规则对单词符号串进行扫描和分解识别出各类语法单位。 5. 目标代码生成 输入优化后的中间代码变换成特定机器上的低级语言代码,实现最后的翻译,产生目标代码。 6. 表格管理: * 在完成以上5个过程的同时必须随时对符号表进行管理 * 记录源程序中使用的名字 * 收集每个名字的各种属性信息 如类型、作用域、存储分配信息等 * 例 count 变量 类型 float 符号串集合:集合中的一切元素都是某字母表上的符号串。
如E(表达式)、T(项)、F(因子) C:文法符号 ① 字母表中排在后面的大写字母(如X、Y、Z) D:终结符号串 ① 字母表中排在后面的小写字母(u、v、…、z) (包括空串) E:文法符号串 (2) 句型和句子 一个开始符号 S 通过若干步,可以推导出 α,则称 α 是G的一个句型 α 是一个文法符号串 如果 α 中的每一个 都是终结符,经过若干部可以推导出一个终结符号串 w,称 w 是 产生式的一般形式:A --> β 上下文无关语言 由上下文无关文法G构成的语言L D:3型文法 正则文法 右线性文法:A --> wB 或 A --> w 左线性文法:A --> Bw 或 A --> w (5) 句子 5、若文法G定义的语言是无限集,则文法必然是( ) 正确答案(A) A. 递归的 B. 上下文无关的 C. 二义性的 D. 10、文法E→E+E|EE|i的句子ii+i*i有( )棵不同的语法树 正确答案(C) A. 1 B. 3 C. 5 D. 7 11、文法 S→aaS|abc 定义的语言是( ) 正确答案(C) A.
以定义描述英语句子的文法为例:He gave me a book 文法的规则如下: (1)<句子>→<主语><谓语><间接宾语><直接宾语> (2)<主语>→<代词> (3)<谓语>→<动词> (4)<间接宾语>→<代词> (5) C语言是C程序的集合,C程序是在C基本字符集上定义的,按一定规则构成的符号串。 2.2 符号串 定义:由字母表中的符号所组成的任何有穷序列称为该字母表上的符号串。 空串: (ε—空字) 长度为0的符号串,|ε|=0。 2.2.2 字符串集合 定义:若集合A中的一切元素都是某字母表上的符号串,则称A为该字母表上的符号串的集合。 符号串集V的闭包 V^+ =V^1 ∪ V^2 ∪ V^3 ∪… ,,即 V 上的所有非空符号串(包括空字ε)的集合。
P是生成式的有穷集合,生成式的基本形式是:A→β,其中A和β都是由变元和终结符组成的符号串,但A至少含有一个非终结符 。 定义 符号串由字母表中的符号组成的序列 例如abc就是上述字母表V上的一个符号串,它的长度为3,例如ɑ=abc,那么用|ɑ|=3表示该符号串的长度。 空符号串,口语表述经常为空串:不含任何符号的字符串通常用ɛ表示,显然|ɛ|=0。 “连接"运算"∘” 当然,这只是一种连接表达,你用别的符号表达也行,这里先这么写。 v-由v中长度为1的符号串的集合。 v2-由v中长度为2的符号串的集合。 句型是由终极符串和非终极符串组成的符号串 推导 推导是从开始符号开始,按照产生式进行推导,直到产生终极符串为止。
1.2 符号串 相关定义: 符号串是对于字母表来说的一个概念,字母表的符号串指的就是由字母表中各个字符组成的一个有穷序列。 注意这里的“有穷”,指的是符号串本身是由有穷个符号组成,但是符号串的个数是无穷多的(组合方式不同)。以字母表 ∑={0,1} 为例,它的符号串就有:0,1,00,01,10,11,000 等等。 符号串的长度指的是符号串符号的个数,以 m = 000 为例,|m|= 3。 空符号串 ε 长度为 0,表示不包含任何符号,类似于编程中的空字符串 ""。所以有 εm = mε= m。 连接、方幂 符号串的连接:连接就是两个字符串顺序拼接,比如 x = abc,y = def,那么 xy = abcdef。 符号串的方幂:如果一个符号串由多个重复符号构成,如何方便地表示它呢? 5. 文法和上下文 上下文实际上是在替换非终结符的时候给予的一个限制条件。也就是说,如果文法是上下文有关的,那么进行替换的时候需要考虑上下文,反之则不必。
另一台设备的 能力 3、引入不确定性:设备做出任意选择的能力 下推自动机:1、这些设备与语法有关,它们描述了编程(和自然)语言的结构 形式语言:语言是有限长度的句子的集合,1、所有句子均由有限的符号构成的符号串 2、所有符号都来自于一个有限的字母表 3、语法是枚举语言中所有句子的装置 4、如果一个句子属于该语言,则一定可以枚举出来 5、如果枚举出一个句子,则一定属于该语言 课程大纲 有穷自动机和正则语言 有穷自动机 语言到DFA,举例构造{0,1}上DFA接受所有已101结尾的符号串 解法1:构建所有状态,选取指定的状态作为终态 ---- 有穷自动机引论 什么·是FA? (Σ, typically) 3、转移函数:A transition function(δ, typically) 4、初始状态:A start state(q0, in Q, typically) 5、 4、形式化: L(A) = 满足δ(q0, w)属于F的符号串w 的集合 正则语言 一个语言L能被DFA接受,则称他是正则的(此DFA无法识别非L中字符,且正则无法识别无穷数列) 证明题:证明一个语言非正则
2.3 空符号串 我们已经消除了左递归和回溯,这样文法是不是就真的确定了呢?其实不是,因为我们还得考虑空符号串的问题。 ② 空符号串的处理 有没有注意到 Follow 集的定义刚好与我们谈到的空符号串的处理有相关的地方? 假定有文法: S → aA|d A → bAS|ε 若输入符号串为 abd,尝试推导该符号串是否符合给定的文法: 第一个输入符号是 a,程序经过判断,决定使用 S → aA 开始构造语法树,这样就处理了第一个输入符号 也可以用语法图表示改写后的结果,这会更加直观: 基于改写后的文法或者是语法图,可以构造如下的递归下降分析程序(ADVANCE 表示扫描下一个输入符号,SYM 表示当前输入符号,ERROR 表示出错纠察处理程序): 5. 假设给定如下文法和输入符号串: // 文法 E → E + T|T T → T * F|F F → i|(E) // 输入符号串 i + i * i 符号串是否符合给定文法呢?
因此它等同于同样长度的全零符号串的汉明距离。在最为常见的数据位符号串中,它是1的个数。 2.
这样的符号串的特点是,中间要么是 aa ,要么是 bb,所以首先确定中间是 (aa|bb)。 由于 aa 和 bb 都可以独立存在,说明 (aa|bb)的前面和后面必须可以是空符号串,说到空符号串,我们会想到闭包,所以它的前面后面必定会分别出现一个闭包。 这里的 I 是 {5,3,4},所以空闭包集合一定包含了5,3,4。 从 1 出发,经过 a 弧能够到达 5 和 4,所以 5,4 属于 Ia。 这样的集合,因为 A 自由组合形成的符号串是可以用一个 A 的自循环来表示的,所以中间有一个自循环,而 ε 则可以用 εε 来表示,所以考虑在前后各加一个 ε,对于 A 的符号串不影响。
符号串的前缀是指该符号串的任意首部,包括空串ε。例如,对于符号串abc,其前缀有ε,a,ab,abc。如果输入串没有错误的话,一个规范句型的活前缀是该句型的一个前缀,但它不含句柄之后的任何符号。 (3)A→.β 刻划没有句柄的任何符号在栈顶,此时期望A→β的右部所推出的符号串。 (4)对于A→ε的LR(0)项目只有A→.。 的第j个产生式; (3)若项目S’→S.属于Ik, 则置ACTION[k, #]为“接受”,简记为“acc”; (4)若GO (Ik, A)= Ij, A为非终结符,则置GOTO[k, A]=j; (5) the grid # (100 rows and 10 columns in this example) grid.CreateGrid(len(LR0TABLE)+5, grid.SetCellValue(0, 3, '-') grid.SetCellValue(0, 4, '-') grid.SetCellValue(0, 5,
“(”) 3 i (1,指向i的符号表项的指针) 4 >= (4,>=) 5 10 (2,“10”) 6 ) (5,“)”) 7 image-20210917104940523.png 二、 单词的描述工具(理解) 正规集(正规语言):某字母表上,我们感兴趣的符号串的集合。 3.3.3 NFA确定为DFA的原因 使用NFA判定某个输入符号串的时候,可能出现不确定的情况:不知道下面选择哪个状态。如果选择不好,该输入符号串可能不能到达终止状态。 但是,我们不能说该输入符号串不能被该NFA接受。如果通过尝试的方法,不断试探来确定输入符号串是否可被接受,那么判定的效率将降低。解决的方法是将NFA转换为等价的DFA。 最终共分成4组:{0}{1}{2} {3,4,5,6}。 保留一组中的任意一个,比如保留3,删除4,5,6,2经b到4 改为2经b到3,4经b到4 改为3经b到3,其它重复以上修改。
4.1.2 求first集和follow集合不带回溯的分析方法:first集合和follow集合关于first集和follow集的求法已经放到了另一篇博客中编译原理必考大题:first集和follow集的求法5. 练习:给定LR分析表和文法,分析((a))方法步骤:初始化,状态栈为0,符号栈为#,输入符号串为(题目待分析字符串,以#结束)紧盯状态栈和输入符号串栈顶,通过状态栈和符号串栈顶来查表一般来说查表结果有三个 S或R或ACC,当查表是S什么时,需要进行移进操作,将输入符号串栈顶元素放入符号栈中,将S的下标数字压入状态栈,再进行下一步.若是R,就是规约操作,规约操作需要我们填写goto这一项,根据R下标的值,看对应的文法
sum) ^{n-1}\sum(∑)n−1∑} 例如:{0,1}的3次方={0,1}{0,1}{0,1}={000,001,010,011,100,101,110,111} 字母表中的n次幂:长度为n的符号串构成的集合 字母表的正闭包:长度正数的符号串构成的集合 字母表的克林闭包 (∑)∗=(∑)0U(∑)U(∑)2U(∑)3.... 字母表的克林闭包:任意符号串(长度可以为0)构成的集合。 串 设∑\sum∑是一个字母表,对于任意的x属于(∑)∗(\sum)^*(∑)∗,x称为是∑\sum∑上的一个串。 A就是非终结符 3型文法 w是终结符号串,A,B都是非终结符 四种文法的关系 上下文无关文法(CFG)分析树 短语 给定一个句型,其分析树中的每一棵子树的边缘称为该句型的一个短语。
2.3.1 直接推导/直接规约简言之,一步直接退换例如:有文法GS:S→0S1,S→01有直接推导 0S1⇒0011有直接推导 0S1⇒00S11有直接推导S⇒0S12.3.2 推导/规约若存在直接推导序列,符号串一直进行直接推导 ,直到没有非终结符号时,推导就必须终止推导例题:2.3.3 规范推导规范推导也叫最右推导,每步只变换符号串中最右边的非终结符,直到推导结束2.4 句型和句子1.句型 有文法GZ,若Z 0步以上推导出x, 1.画出句型语法树2.找出所有子树3.子树叶子结点组成的符号串为该句型针对子树根节点的短语4.去掉重复的短语找短语的关键还是找子树简单短语与句柄所有短语中,一步推导得来的即为简单短语。 人为避免产生二义性2.9.1 有关文法的实用限制多余规则:指文法中任何句子的推导都不会用到的规则,若有则删去- 不可到达:非终结符不再任何规则的右部出现,称该非终结符为不可到达- 不可终止:由它不能退出终结符号串
例:求下述二元函数的最大值: (1) 个体编码 遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为一种 符号串。 本题中。 比如,基因型 X=101110 所相应的表现型是:x=[ 5。6 ]。 个体的表现型x和基因型X之间可通过编码和解码程序相互转换。 (5) 交叉运算 交叉运算是遗传算法中产生新个体的主要操作过程,它以某一概率相互交换某 两个个体之间的部分染色体。
image-20210903112514512.png 2.1.2 语法分析 输入单词符号串 根据语言的语法规则对单词符号串进行扫描和分解 识别出各类语法单位 语法单位内部表示:语法树 image image-20210908141401139.png 2.1.6 表格管理和出错处理 表格管理(符号表): 在完成以上5个过程的同时必须随时对符号表进行管理 记录源程序中使用的名字 收集每个名字的各种属性信息
例:求下述二元函数的最大值: (1) 个体编码 遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为一种 符号串。 比如,基因型 X=101110 所相应的表现型是:x=[ 5,6 ]。 个体的表现型x和基因型X之间可通过编码和解码程序相互转换。 (5) 交叉运算 交叉运算是遗传算法中产生新个体的主要操作过程,它以某一概率相互交换某 两个个体之间的部分染色体。
没有被空格间开的符号串,都算作单词。 输入一行单词序列,最少1个单词,最多300个单词,单词之间用至少1个空格间隔。单词序列总长度不超过1000。输出依次输出对应单词的长度,之间以逗号间隔。 样例输出 3,3,4,2,10,3,4,7,5 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath > 5 using namespace std; 6 char a[10001]; 7 char b[10001]; 8 int main() 9 { 10 int flag=0; 11
整个编译过程一般可以划分为 5 个阶段:词法分析、语法分析、语义分析及中间代码生成、中间代码优化和目标代码生成。我们以一个简单的程序段为例,分别介绍这 5 个阶段所完成的任务。 语法分析语法分析的任务是在词法分析的基础上,根据语言的语法规则,从单词符号串中识别出各种语法单位(如表达式、说明、 语句等)并进行语法检查,即检查各种语法单位在语法结构上的正确性。 上述源程序通过语法分析,根据语言的语法规则识别单词符号串 s = 2 3.1416 r (h + r),其中 s 是 <变量>,单词符号串 2 3.1416 r (h + r) 组合成 < 编译程序编译过程的这 5 个阶段的任务分别由 5 个程序完成,这 5 个程序分别称为词法分析程序、语法分析程序、语义分析及中间代码生成程序、中间代码优化程序和目标代码生成程序,另外再加上表格管理程序和出错处理程序 例如,可以将前述 5 个阶段的工作结合在一起,对源程序从头到尾扫描一遍来完成编译的各项工作,这种编译程序称为一遍扫描的编译程序。