
编译原理
星雨晨曦
不是你不够幸运,只是你不够强。
展开
-
4.4 算 符 优 先 分 析 法
4.4 算 符 优 先 分 析 法4.4.1 方法概述所谓算符优先分析法就是依照算术表达式的四则运算过程而设计的一种语法分析方法。这种分析方法首先要规定运算符之间(确切地说是终结符之间)的优先关系和结合性质,然后借助这种关系,比较相邻运算符的优先级来确定句型的可归约串并进行归约。下面,以表达式的文法为例,说明采用这种分析法分析符号串 id + id * id 的分析过程。例如,文法 G [ E ]为E → E + E | E * E | ( E ) | id这个文法是一个二义性文法,因而对原创 2020-08-07 15:34:17 · 4525 阅读 · 1 评论 -
回溯的消除
回溯的消除在自上而下分析过程中,由于回溯需要推翻前面的分析,包括已做的一大堆语义工作,重新去进行试探,这样大大降低了语法分析器的工作效率,因此,需要消除回溯。从 4.2.1 节中我们已经发现引起回溯的原因是,在文法中某个非终结符 A 有多个候选式,遇到用 A 去匹配当前输入符号 a 时,无法确定选用唯一的一个候选式,而只能逐一进行试探,从而引起回溯,这具体表现为下面两种情况。第一种情况是相同左部的规则,其右部左端第一个符号相同而引起回溯。例 4.1 即是这种情况。第二种情况是相同左部的规则,其中某一右部原创 2020-08-07 10:20:25 · 3987 阅读 · 1 评论 -
递归下降分析法
递归下降分析法4 递归下降分析法递归下降分析法是确定的自上而下分析法,这种分析法要求文法是 LL ( 1 )文法。它的基本思想是,对文法中的每个非终结符编写一个函数(或子程序),每个函数(或子程序)的功能是识别由该非终结符所表示的语法成分。由于描述语言的文法常常是递归定义的,因此相应的这组函数(或子程序)必然以相互递归的方式进行调用,所以将此种分析法称为递归下降分析法。构造递归下降分析程序时,每个函数名是相应的非终结符,函数体则是根据规则右部符号串的结构编写。(1 )当遇到终结符 a 时,则编写语句原创 2020-08-07 10:17:18 · 6944 阅读 · 0 评论 -
4.2.5 预测分析法与预测分析表的构造
4.2.5 预测分析法与预测分析表的构造预测分析法也称为 LL ( 1 )分析法。这种分析法是确定的自上而下分析的另一种方法,采用这种方法进行语法分析要求描述语言的文法是 LL ( 1 )文法。一个预测分析器由一张预测分析表(也称为 LL ( 1 )分析表)、一个先进后出分析栈和一个总控程序三部分组成,见图 4.3 。图中输入缓冲区 T [j ]中存放待分析的输入符号串,它以右界符 $ 作为结束。分析栈S [ k ]中存放替换当前非终结符的某规则右部符号串,句子左界符“ $ ”存入栈底。预测分析表是一原创 2020-08-07 10:16:38 · 5092 阅读 · 0 评论 -
自 下 而 上 分 析 法 的 一 般 原 理
自 下 而 上 分 析 法 的 一 般 原 理编译中存在着多种自下而上的分析法,但不管哪种自下而上的分析法都是按照“移进 - 归约”法的原理建立起来的一种语法分析方法。这种分析法的基本思想是用一个寄存文法符号的先进后出栈,将输入符号一个一个地按从左到右扫描顺序移入栈中,边移入边分析,当栈顶符号串形成某条规则右部时就进行一次归约,即用该规则左部非终结符替换相应规则右部符号串,我们把栈顶被归约的这一串符号称为可归约串。重复这一过程直到整个输入串分析完毕。最终若栈中剩下句子右界符“ $ ”和文法的开始符号,则所原创 2020-08-07 10:11:07 · 1423 阅读 · 0 评论 -
某些非 LL ( 1 )文法到 LL ( 1 )文法的改写
某些非 LL ( 1 )文法到 LL ( 1 )文法的改写前面已经指出,构造确定的自上而下分析程序要求给定语言的文法必须是 LL ( 1 )文法,但是,并不是每个语言都有 LL ( 1 )文法。由 LL ( 1 )文法定义可知,若文法中含有左递归或含有公共左因子,则该文法不是 LL ( 1 )文法,因此,对某些非 LL ( 1 )文法而言,可通过消除左递归和反复提取公共左因子对文法进行等价变换,将其改造为 LL ( 1 )文法。这里所说的提取公共左因子是指当文法中含有形如 A → αβ 1 | α β原创 2020-08-07 10:17:57 · 5409 阅读 · 0 评论 -
文法的左递归性和回溯的消除
文法的左递归性和回溯的消除1. 文法左递归的消除当一个文法是左递归文法时,采用自上而下分析法会使分析过程进入无穷循环之中。文法左递归是指文法中的某个非终结符 A 存在推导 A ⇒+ Aα ,而自上而下分析法是施行最左推导,即每次替换都是当前句型中的最左非终结符,当试图用非终结符 A 去匹配输入串时,结果使当前句型的最左非终结符仍然为 A ,也就是说,在没有读进任何输入符号的情况下,又重新要求 A 去进行新的匹配,于是造成无穷循环。所以采用自上而下分析法进行语法分析需要消除文法的左递归性。对含直接左递归原创 2020-08-07 10:20:41 · 4689 阅读 · 0 评论 -
自 上 而 下 分 析 法
自 上 而 下 分 析 法非确定的自上而下分析法的思想非确定的自上而下分析法的基本思想是,对任何输入串 W 试图用一切可能的办法,从文法的开始符号出发,自上而下地为它建立一棵语法树。或者说,为输入串寻找一个最左推导。如果试探成功,则 W 为相应文法的一个句子,否则 W 就不是文法句子。这种分析过程本质上是一种穷举试探过程,是反复使用不同规则,谋求匹配输入串的过程。下面用一个简单例子来说明这种分析过程。【例 4.1 】设有文法 G [ S ]:S → aAbA → de | d若当前的输入串为原创 2020-08-06 14:48:29 · 1319 阅读 · 0 评论 -
语 法 分 析 程 序 的功能
语 法 分 析 程 序 的功能语法分析程序(语法分析器)的功能是以词法分析器生成的单词符号序列作为输入,根据语言的语法规则(描述程序语言语法结构的上下文无关文法),识别出各种语法成分(如表达式、语句、程序段乃至整个程序等),并在分析过程中进行语法检查,检查所给单词符号序列是否是该语言的文法的一个句子。若是,则以该句子的某种形式的语法树作为输出;若不是,则表明有错误,并指出错误的性质和位置。目前,语法分析的方法分为两大类,即自上向下的分析方法和自下向上的分析方法,或称自上而下的分析法和自下而上的分析法。原创 2020-08-06 14:20:21 · 3702 阅读 · 0 评论 -
词 法 分 析 程 序 的 编 写方法
词 法 分 析 程 序 的 编 写 方法在图 3.26 中,状态 0 为初态,凡带双圈者均为终态;状态 17 是识别不出单词符号的出错情况。 l 代表任一字母,d 代表任一数字。在例中我们规定,对所有关键字用户不得使用它们作为自己定义的标识符,这样可以把关键字作为一类特殊的标识符来处理,不再专设对应的转换图。但需把它们预先安排在一个表格中,此表叫关键字表。当利用图 3.26 识别出一个标识符时,就去查关键字表,以确定它是否为一关键字。其次,规定若关键字、标识符和常数之间没有确定的运算符或界符作间隔原创 2020-08-06 12:57:55 · 803 阅读 · 0 评论 -
有穷自动机到正规文法的转换方法
有穷自动机到正规文法的转换方法给定有穷自动机 M = ( Q ,Σ , f , q 0 , Z )。按照下述方法可以从 M 构造出对应的正规文法G = ( V N , V T , P , S ),使得 L ( M ) = L ( G )。(1 )令 V N = Q , V T = Σ , S = q 0 。(2 )若 f ( A , a ) = B 且 B ∉ Z 时,则将规则 A → aB 加到 P 中。(3 )若 f ( A , a ) = B 且 B ∈ Z 时,则将规则 A → aB |原创 2020-08-06 12:43:23 · 2713 阅读 · 0 评论 -
左线性正规文法到有穷自动机的转换方法
左线性正规文法到有穷自动机的转换方法设给定一个左线性正规文法 G = (V N , V T , P , S ),则相应的有穷自动机 M = ( Q , Σ , f , q 0 , Z )。(1 )将 V N 中的每一个非终结符视作 M 中的一个状态,并增加一个初始状态 q 0 且q 0 ∉ V N ,令 Q = V N ∪ { q 0 },并将文法 G 的开始符号 S 看成终结状态,即 Z = { S }, Σ = V T 。(2 )对 G 中每一形如 A → Ba 的产生式( A , B ∈ V N原创 2020-08-06 12:34:43 · 3556 阅读 · 2 评论 -
右线性正规文法到有穷自动机的转换方法
右线性正规文法到有穷自动机的转换方法设给定一个右线性正规文法 G = (V N , V T , P , S ),则相应的有穷自动机 M = ( Q , Σ , f , q 0 , Z )。(1 )将 V N 中的每一个非终结符视作 M 中的一个状态,并增加一个状态 D 且 D ∉ V N ,令Q = V N ∪ { D }, Z = { D }, Σ = V T , q 0 = S 。(2 )对 G 中每一形如 A → aB 的产生式( A , B ∈ V N , a ∈ V T ∪ { ε }),令原创 2020-08-06 12:09:06 · 2920 阅读 · 0 评论 -
有穷自动机到正规式的转换
有穷自动机到正规式的转换将转换图的概念加以拓广,令其中的每条弧都可以用一个正规式标记,具体方法如下。首先,在 M 的转换图上添加两个结点: X 结点和 Y 结点,从 X 结点用 ε 连线连接到 M 的所有初态结点,从 M 的所有终态结点用 ε 连线连接到 Y 结点,从而构成一个新的非确定有穷自动机 M’ ,它只 有一个初态结点 X 和一个终态结点 Y 。显然,L ( M ) = L ( M’ ),即这两个 NFA 是等价的。然后,逐步消去 M’ 中的其他结点,直至只剩下 X ,Y 结点。在消除结点过程中原创 2020-08-06 10:58:42 · 2441 阅读 · 0 评论 -
DFA 的化简
DFA 的化简对于一个 NFA ,当把它确定化之后,得到的 DFA 可能含有较多的状态,还应该对其进行化简。任何正规语言都有一个唯一的状态数目最少的 DFA 。而且,对于同一个语言,可以存在多个识别该语言的 DFA 。从任意一个接受相同语言的 DFA 出发,通过分组合并等价的状态,总可以得到这个状态数最少的 DFA 。1.DFA 的化简所谓一个 DFA M 的化简是指寻找一个状态数比 M 少的 DFA M’ ,使得 L ( M ) = L ( M’ )。化简了的 DFA M’ 满足两个条件:(1原创 2020-08-06 10:46:50 · 13863 阅读 · 0 评论 -
NFA 确定化为 DFA 的方法
NFA 确定化为 DFA 的方法NFA 的确定化是指对任给的 NFA ,都能相应地构造一 DFA ,使它们接受相同的语言。前面提到, NFA 允许 ε 边的状态转换。现在假设一个 NFA 当前是 q1 状态,它遇到的输入符号是 a ,而它在不消耗输入符号 a 的情况下,可以通过 ε 边转换到 q2 状态。那么,如果要问 NFA在使用输入符号 a 之前处于哪种状态,就会有点混乱,难以回答。我们最好描述成:该 NFA 当前的状态可能是状态集合{q 1 , q 2 }中的某个状态。或者将 NFA 想象成同一时原创 2020-08-06 10:25:20 · 10383 阅读 · 1 评论 -
3.4 正 规 式 与 有 穷 自 动 机
正 规 式 与 有 穷 自 动 机有穷自动机是具有离散输入与输出系统的一种抽象数学模型。有穷自动机有“确定的”和“非确定的”两类,确定的有穷自动机和非确定的有穷自动机都能准确地识别正规集。确定有穷自动机( DFA )一个确定有穷自动机 M 是一个五元组 M = ( Q ,Σ , f , S , Z ),其中Q 是一个有穷状态集合,每一个元素称为一个状态;Σ 是一个有穷输入字母表,每个元素称为一个输入字符;f 是一个从 Q × Σ 到 Q 的单值映射,f ( q i , a ) = q j (原创 2020-08-06 09:33:15 · 1875 阅读 · 0 评论 -
3.3 语 言 单 词 符 号 的 两 种 定 义方式
语 言 单 词 符 号 的 两 种 定 义方式目前,多数程序设计语言的单词符号都能用正规文法(左线性文法或右线性文法)或正规式来定义。例如,高级程序设计语言中“标识符”这个单词符号,其单词结构是一个以字母开头的字母数字串,那么定义“标识符”单词符号的左线性文法为<标识符> → l | <标识符> l | <标识符> d或右线性文法为<标识符> → l | l <字母数字><字母数字> → l | d | l <字母数原创 2020-08-05 16:47:33 · 1768 阅读 · 0 评论 -
3.1 词 法 分 析 程 序 的 功 能 3.2 单 词 符 号 及 输 出 单 词 的 形
词 法 分 析 程 序 的 功 能编译过程的第一步是进行词法分析,词法分析的任务是对字符串表示的源程序从左到右地进行扫描和分解,根据语言的词法规则识别出一个一个具有独立意义的单词符号。执行词法分析的程序称为词法分析程序,或称词法分析器或扫描器。单 词 符 号 及 输 出 单 词 的 形词法分析程序是以字符串形式的源程序作为输入,以单词符号或单词符号表示的源程序作为输出。3.2.1 语言的单词符号语言的单词符号是指语言中具有独立意义的最小语法单位,即单词符号是程序语言的基本语法单位。程序语言的单.原创 2020-08-05 16:05:44 · 2237 阅读 · 0 评论 -
2.6 文 法 和 语 言 的 分 类
文 法 和 语 言 的 分 类著名的语言学家乔姆斯基(Chomsky )将文法和语言分为 4 大类,即 0 型、1 型、 2 型和 3 型。划分的依据是对文法中的规则施加不同的限制。1.0 型文法(无限制文法)若文法 G = (V N , V T , P , S )中的每条规则 α → β 是这样一种结构:α ∈ ( V N ∪ V T )**且至少含一个非终结符,而 β ∈ (V N ∪ VT )*,则称 G是 0 型文法。0 型文法描述的语言是 0 型语言。由定义可见,α 和 β 均是文法的.原创 2020-08-05 15:49:27 · 1188 阅读 · 0 评论 -
2.5.3 文法二义性的消除
2.5.3 文法二义性的消除(1 )不改变文法中原有的语法规则,仅加进一些语法的非形式规定。例如,对于上例文法 G [ E ],不改变已有的 4 条规则,仅加进运算符的优先顺序和结合规则,即 * 优先于 + ; + , * 服从左结合。这样,对于文法 G [ E ]中的句子 i * i + i 只有唯一的一棵语法树(见图 2.6 ),从而避免了文法的二义性.(2 )构造一个等价的无二义性文法,即把排除二义性的规则合并到原有文法中,改写原有的文法。例如,对于上例文法 G [ E ],将运算符的优先顺序原创 2020-08-05 15:02:38 · 10012 阅读 · 0 评论 -
2.5.2 文法的二义性
2.5.2 文法的二义性设有文法 G [ E ]:E → E + E | E * E | ( E ) | i句子 i * i + i 有两个不同的最左推导,对应两棵不同的语法树,见图 2.6 和图 2.7 。最左推导 1 E ⇒ E + E ⇒ E * E + E ⇒ i * E + E ⇒ i * i + E ⇒ i * i + i 最左推导 2E ⇒ E * E ⇒ i * E ⇒ i * E + E ⇒ i * i + E ⇒ i * i原创 2020-08-05 14:45:45 · 5845 阅读 · 0 评论 -
2.5.1 推导和语法树
2.5.1 推导和语法树1. 语法树的生成对句型的推导过程给出一种图形表示,这种表示称为语法树,也称推导树。设文法G = ( V N , V T , P , S ),对 G 的任何句型都能构造与之关联的、满足下列条件的一棵语法树。(1 )每个结点都有一个标记,此标记是 V = V N ∪ V T ∪ { ε }中的一个符号。(2 )树根的标记是文法的开始符号 S 。(3 )若某一结点至少有一个分支结点,则该结点上的标记一定是非终结符。(4 )若 A 的结点有 k 个分支结点,其分支结点的标原创 2020-08-05 14:29:12 · 7995 阅读 · 2 评论 -
2.4 短 语 、 直 接 短 语 和 句 柄
2.4 短 语 、 直 接 短 语 和 句 柄2.4.1 短语和直接短语令 G 是一个文法, S 是文法的开始符号,假定 αβδ 是文法 G 的一个句型,如果有S ⇒* αAδ且 A ⇒+ β则称 β 是相对于非终结符 A 的句型 αβδ 的短语。特别是,如果有S ⇒* αAδ且 A ⇒ β则称 β 是直接短语。注意体会短语这个概念的定义,仅有 A ⇒+ β ,不一定意味着 β就是句型 αβδ 的一个短语,因为,还需要有 S ⇒* αAδ这一个条件。例如,考虑文法 G [ N 1 ]:原创 2020-08-05 12:43:40 · 1555 阅读 · 0 评论 -
2.3.5 递归规则与文法的递归性
2.3.5 递归规则与文法的递归性1. 递归规则所谓递归规则,是指在规则的左部和右部具有相同非终结符的规则。如果文法中有规则 A → A … 称为规则左递归。如果文法中有规则 A → … A 称为规则右递归。如果文法中有规则 A → … A … 称为规则递归。2. 文法的递归性文法的递归性是指对文法中任一非终结符,若能建立一个推导过程,在推导所得的符号串****中又出现了该非终结符本身,则文法是递归性的,否则是无递归性的。若文法中有推导 A ⇒+ A … 称文法左递归。若文法中有推导 A原创 2020-08-04 16:23:02 · 4429 阅读 · 0 评论 -
2.3.4 规范推导和规范归约
2.3.4 规范推导和规范归约例如,设有文法 G [ N 1 ]:N 1 → NN → ND | DD →0|1|2该文法所定义的语言是由数字 0 ,1 , 2 组成的所有无符号整数。符号串 12 是该文法的一个句子,该句子可以通过下列 3 个不同的推导序列推导出来:① N 1 ⇒ N ⇒ ND ⇒ N 2⇒ D 2⇒12② N 1 ⇒ N ⇒ ND ⇒ DD ⇒1 D ⇒12③ N 1 ⇒ N ⇒ ND ⇒ DD ⇒ D 2⇒12所谓最左(最右)推导,是指对于一个推导序列中的每一步直原创 2020-08-04 16:15:46 · 16358 阅读 · 0 评论 -
2.3.3 语言的形式定义
2.3.3 语言的形式定义1. 直接推导令 G 是一文法,我们从 xAy 直接推出xαy ,即 xAy⇒xαy ,仅A → α 是 G 的一个规则且x , y ∈ ( V N ∪ V T )* 。也就是说,从符号串 xAy 直接推导出xαy仅使用一次规则。例如,设有文法 G [ S ](符号 G [ S ]表示 S 为文法 G 的开始符号):G [ S ] = ({ S },{ 0 , 1 }, P , S )其中,P 为S →01|0 S 1有如下直接推导:S ⇒01 使用规则 S →0原创 2020-08-04 16:05:05 · 1345 阅读 · 0 评论 -
2.3 文 法 和 语 言 的 形 式 定义
2.3 文 法 和 语 言 的 形 式 定义2.3.1 形式语言序列的集合称为形式语言。具体地说,每个形式语言都是某个字母表上按某种规则构成的所有符号串的集合,反之,任何一个字母表上符号串的集合均可定义为一个形式语言对每个具体语言,都有语法和语义两个方面,形式语言是指不考虑语言的具体意义,即不考虑语义。例如,C 语言是其基本符号字母表上的符号串的集合,而每个 C 语言程序是基本符号的符号串。对形式语言的描述有两种方法,一种方法是当语言为有穷集合时,用枚举方法来表示语言。例如,设有字母表 A = {a原创 2020-08-04 15:25:09 · 2520 阅读 · 0 评论 -
2.2 字 母 表 和 符 号 串 的 基 本 概 念
2.2 字 母 表 和 符 号 串 的 基 本 概 念2.2.1 字母表和符号串字母表字母表是元素的非空有穷集合。例如, Σ = {a , b , c }。根据字母表的定义,Σ 是字母表,它由 a , b , c 3 个元素组成。需要注意的是,字母表中至少包含一个元素。字母表中的元素,可以是字母、数字或其他符号。例如,Σ’ = { 0 , 1 }是一个字母表,由 0 和 1 两个元素组成。符号(字符)字母表中的元素称为符号,或称为字符。例如,前述例子中 a ,b , c 是字原创 2020-08-03 15:40:15 · 3373 阅读 · 0 评论 -
2.1 概 述
2.1 概 述编译程序,它的功能是将高级语言所写的源程序翻译成与之等价的机器语言或汇编语言的目标程序。对程序设计语言的描述是从语法、语义和语用 3 个因素来考虑的。所谓语法是对语言结构的定义;语义是描述了语言的含义;语用则是从使用的角度去描述语言。例如,对于赋值语句 s=23.1416r* (r+h )的非形式化的描述如下:语法———赋值语句由一个变量、一个后随赋值号“ = ”及其后跟一个表达式构成。语义———首先计算语句右部表达式的值,然后把所得结果送入左部变量中。语用———赋值语句可用来计算原创 2020-08-03 15:11:26 · 172 阅读 · 0 评论 -
1.2 编 译 过 程 和 编 译 程 序 的 基 本 结 构
1.2 编 译 过 程 和 编 译 程 序 的 基 本 结 构编译程序的功能是把用高级语言编写的源程序翻译成等价的机器语言或汇编语言表示的目标程序。编译程序是将一种语言形式翻译成另一种语言形式,因此其工作过程一般可划分为下列 5 个阶段:词法分析、语法分析、语义分析及中间代码生成、代码优化和目标代码生成。下面,我们以一个简单的程序段为例,分别介绍这 5 个阶段所完成的任务。例如,计算圆柱体表面积的程序段如下:float r , h , s ;s=23.1416r* ( h+r )第 1 阶原创 2020-08-03 13:36:41 · 1260 阅读 · 0 评论 -
翻译程序和编译程序
翻译程序和编译程序机器语言对计算机的依赖性强、直观性差、编写程序工作量大、程序的结构也欠清晰。翻译程序:所谓翻译程序是指这样一种程序,它把一种语言(称作源语言)所写的程序(源程序)翻译成与之等价的另外一种语言(目标语言)。其功能如图所示如果源语言是高级语言,如Pascal,C,C++,Ada,Java语言等,目标语言是是诸如汇编语言或者机器语言之类的低级语言,那么称这样的翻译程序为编译程序,它所进行的转换工作如图简单一点说就是,翻译程序就是将源语言写的源程序翻译成目标语言。编译程序就是将高级语言翻原创 2020-08-03 13:13:41 · 6691 阅读 · 0 评论