编译原理小结——字符和字符串之间的游戏

本文介绍了编译原理中的词法分析和语法分析,重点讲解了字符流处理、单词符号分类、词法分析的作用,以及有穷自动机在识别正规集中的应用。此外,还探讨了上下文无关文法、二义性消除、自上向下与自下而上的语法分析方法,如LL(1)和LR分析法。
摘要由CSDN通过智能技术生成

前记:第一次使用LaTeX编辑公式,这个东西不错~让我意识到了转义符号’\’的强大威力!
吐槽:本人使用清华大学出版社的《编译原理》第二版,这本书真TM抽象,各种乱七八糟的形式化定义一个接着一个,看得我吐血了。考前突击,花了四天时间硬是把这本书的核心部分啃下来了,写下了8千字的”小”结~
《编译原理》(清华出版社)教材链接


1 词法分析 lexical analysis

词法分析是编译的第一个阶段:主要是从左至右逐个字符地对字符流的源程序(比如.c 和 .cpp)进行扫描,产生一个个单词(token)序列。简而言之:读入源程序,输出单词符号。单词符号是一个程序设计语言的基本语法符号,一般分为以下5种:

  1. 关键词:for, while, if, else, double, int
  2. 标识符:自己声明的变量、类/对象
  3. 常 数 :”hello, world”, 12345
  4. 运算符: >, =, ==, +
  5. 界 符 : 逗号,分号,花括号

按理说,词法也是语法的一部分。不过编译器把词法分析从语法分析中独立出来,是因为有些好处:

  1. 使整个编译程序的结构更加简洁、清晰、条理化
  2. 编译程序的效率会改进
  3. 增强程序的可移植性

词法分析做的一些细节工作:滤掉程序中的注释和空白(空白即空格、换行符、制表符) ;记录读入字符行的行号(比如编译器会提示error在第几行); 完成预处理,比如C/C++的#defile

正规集有两种表示工具:正规文法(3型文法)和正则式,正规集是正规文法所定义的语言和正规式所表示的集合。两种表示方法是等价的,可以互相转换。正则式即正则表达式,它由递归定义:首先设字母表是 ,辅助字母表是 ={   , ε ,  ,  , ( , ) }

  1. ε 都是 上的正规式,它们表示的正规集分别为 { ε}
  2. 任何 a ,a 是 上的一个正规式,它表示的正规集为 { a}
  3. 假定 e1e2 都是 上的正规式,它们表示的正规集分别为L( e1 )和L( e2 ),那么  (e1) , e1e2 , e1e2 , e1 也都是正规式,它们表示的正规集分别为 L(e1) , L(e1)L(e2) , L(e1)L(e2) , (L(e1))
  4. 仅由有限次使用上述三步而定义的表达式才是 上的正规式,仅由这些正规式所表示的字集才是 上的正规集。可以看出经过递归调用,正规集 L“越来越大”

有穷自动机是一种识别装置,可以准确的识别正规集。分为两类:NFA(Nondeterministic Finite Automata,不确定的有穷自动机) 和 DFA(Deterministic Finite Automata,确定的有穷自动机) ,它们都可以用五元组 M(K,,f,S,Z) 表示。K 表示状态的有穷集, 表示字母表,f 表示状态转移的方法,S 是初态,Z 是终态。NFA 和 DFA的差距主要体现在 f 上面:DFA的 f 是“确定的”函数,某一个状态,输入某个字符,可以确定转移到哪一个状态上面去;NFA 的 f 的状态转移是不确定的映射,某一个状态,输入某个字符,可能转移到很多个状态上面去,不确定到底转到哪一个状态去。S 也有一点区别,DFA的 S 是唯一的,NFA 的 S 可能有多个。

NFA通过子集法可以转换到DFA,子集法的要点是掌握两种运算:闭包运算和弧转换运算。这里必考大题:正则式 –> NFA –> DFA,主意事项:1.确定化的时候不重复,不遗漏;2.假设NFA中的终态是Z,Z可能出现在DFA的多个状态中,那么这些出现过Z的状态都是终态,所以DFA中的终态可能会有多个;3.在“填写表格”(确定化)的时候,别忘记闭包了(虽然一些题目没有涉及 ε ),DFA的初态就是NFA初态的闭包,后面是不断先弧转换再闭包;4.DFA的初态的前面,不要忘记 。可能会遇到DFA最小化的题目,此时采用分割法:首先分成终态和非终态两个状态两个子集,然后不断尝试分割这些子集,直到不能继续分割为止。


2 语法分析 grammar analysis

1 概念

一个程序设计语言是一个记号系统,它的完整定义应包括语法和语义两个方面。所谓语言的语法是指一组规则,用它可以形成和产生一个合适的程序。语法定义什么样的符号序列式合法的。

重要概念和定义:

  • 字母表:元素的非空有穷集和。字母表中的元素称为符号,字母表又称符号表,一般用 表示
  • 符号串:由字母表中的符号所组成的任何有穷序列。
  • 符号串集合:若集合A中的一切元素都是某字母表上的符号串,则称A为该字母表上面的符号串集合
  • 闭包: 上的所有有穷串的集合 。 =012...n...
  • 正闭包: + ,在 中去除 0 即可
  • 规则,又称产生式,形如 αβ 的有序对,读作“定义为”
  • 文法 G定义为四元组 (Vn,Vt,P
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值