编译原理

编译原理(词法分析)

…衆ロ難τιáo~ 提交于 2020-01-22 09:05:09
文章目录 1.编译原理概述 2.词法分析 正规集 正规式 正规文法 自动机 已知集合求正规式、DFA; 已知正规式求DFA、集合; 已知DFA求正规式、集合; DFA的确定化、最小化。 1.编译原理概述 程序设计语言的翻译模式:编译、汇编;转换(预处理);反汇编、反编译;交叉编译、交叉汇编 静态语义错误(如分母不为0)在语义分析阶段可以被检测出来 词法分析里的坑点,因为词法分析只是识别记号,它并不会排查声明变量结构性错误,这个错误要到语法分析之中才可以被检查出来 动态语义错误编译过程中一般不会处理,只有到程序执行时才会发现 几个错误的典型实例 对程序语句的翻译主要考虑两类语句:声明语句和可执行语句,其中,对声明语句,主要是将所需要的信息正确地填入合理组织的 符号表 中;对可执行语句,则是 翻译成中间代码 在以阶段划分的编译器中, 符号表管理 和 出错处理 两个阶段的工作贯穿于编译器工作始终。 有两个因素使得有限自动机是不确定的,一个是 具有ε状态转移 ,另一个是对同一字符, 可能有多于一个的下一状态转移 词法分析器有四个作用,请给出其中的任意两个: 识别记号并交给语法分析器 / 滤掉源程序中的无用成分 / 处理与具体平台有关的输入 / 调用符号表管理器或出错管理器 语法分析器根据语法规则 识别出记号流中的结构 ,并 构造一棵能够正确反映该结构的语法树 。 检查输入中的错误

LEX和YACC的使用三

我是研究僧i 提交于 2020-01-21 03:27:52
2.4.3 yacc解决二义性和冲突的方法 在2.3.8中已涉及到二义性和冲突的问题,这里再集中介绍一下,这在写Yacc源程序时会经常碰到。二义性会带来冲突。在2.3.8中我们介绍了yacc可以用为算符确定优先级和结合规则解决由二义性造成的冲突,但是有一些由二义性造成的冲突不易通过优先级方法解决, 如有名的例子: stat:IF bexp THEN stat |IF bexp THEN stat ELSE stat ; 对于这样的二义性造成的冲突和一些不是由二义性造成的冲突,Yacc提供了下面两条消除二义性的规则: A1.出现移进/归约冲突时,进行移进; A2. 出现归约/归约冲突时,按照产生式在yacc源程序中出现的次序,用先出现的产生式归约。 我们可以看出用这两条规则解决上面的IF语句二义性问题是合乎我们需要的。所以用户不必将上述文法改造成无二义性的。当Yacc用上述两条规则消除了二义性,它将给出相应信息。 下面再稍微严格地介绍一下Yacc如何利用优先级和结合性来解决冲突的。 Yacc源程序中的产生式也有一个优先级和结合性.这个优先级和结合性就是该产生式右部最后一个终结符或文字字符的优先级和结合性,当使用了%Prec子句时,该产生式的优先级和结合性由%Prec子句决定。当然如果产生式右部最后一个终结符或文字字符没有优先级或结合性,则该产生式也没有优先级或结合性。 根据终结符

编译原理学习指导 - ★★★TINYUE的专栏★★★ - CSDNBlog

房东的猫 提交于 2020-01-21 02:53:18
编译原理学习指导 编译原理是计算机专业课程中最难同时也是最有挑战性的一门,理论上高度抽象,而且要求扎实的数学功底,在实践上也对数据结构的知识要求比较高.但是编译原理又是计算机科学中最为基础和重要的,类似于高等数学在理工科中的地位,所以今天粗略的跟大家谈谈这门课程的学习. 一、为什么学编译原理? 1、 编译原理蕴涵着计算机学科中解决问题的思路、抽象问题和解决问题的方法; 2、 编译原理课程的学习有利于加深对程序语言的理解,可以帮助你更加快速的掌握新的语言工具; 3、 课程中包含了很多软件技术,这对于以后从事软件设计是很有帮助的. 二、编译原理主要内容提要 (一)编译程序的功能、工作过程、结构以及构造方法 计算机只能读懂0或者1,而我们用高级语言编写的程序(原程序)是抽象的符号化了的东西,为了让计算机读懂我们写的程序,必须把我们 书写的程序翻译成某台机器能够读懂的(机器)语言(目标程序),这就是翻译程序的作用.翻译程序进行的是等价的翻译,意思就是说目标程序 和原程序在功能上是等价的;翻译程序有两种方式:“编译”、“解释”,区别在于是否生成目标代码,解释方式下,是直接执行源程序本身的 或者与源程序等价的中间程序,并不生成目标代码,而编译方式下,必须生成目标代码. 编译方式的特点①源程序的执行是分阶段的:编译阶段和执行阶段(若编译生成的目标程序是汇编语言程序,则在两者之间还有一个汇编 阶段

词法与文法简介

喜欢而已 提交于 2020-01-15 19:27:05
https://zhuanlan.zhihu.com/p/19878087 https://segmentfault.com/a/1190000015568992 词法简介 所谓的源代码,我们可以将其视为一段长长的字符串。所谓字符串,即是字符的有序集。但是,字符本身作为编译器的输入单位,粒度实在太小了,因此,我们往往需要对编译器进行第一层封装,即分割出一个称之为 Tokenizer (词法分析器)的部分。 Tokenizer 的作用即是将字符序列翻译成 Token(单词)的一个过程,这一过程称之为 单词化 (Tokenization)。很容易理解单词化这一步骤在整个编译过程中的价值,举个例子,如下这么一个英语句子。 It’s understandable that we share some common values as we are living in the same world. 实际上,这个句子倘若以字符串的形式存在,即以 字符 作为最小单位来解析,则看起来形式如下。实际上,我们很难从中提取出有价值的信息。 ['I', 't', '\'', 's', ' ', 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 'a', 'b', 'l', 'e', ' ', 't', 'h', 'a', 't', ' ', 'w',

编译原理之预处理、编译与链接

余生颓废 提交于 2020-01-14 04:46:09
先上一张图吧,完美表示出了,一个编辑好的程序变成可运行文件经过的过程(可以把编译和汇编统称为编译)。 一、预处理(预编译、编译预处理) 主要处理源代码文件中的以“#”开头的预编译指令 1.删除所有的#define,展开所有的宏定义。 2.处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。 3.处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。 4.删除所有的注释,“//”和“/**/”。 5.保留所有的#pragma 编译器指令,编译器需要用到他们,如:#pragma once 是为了防止有文件被重复引用。 6.添加行号和文件标识,便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是能够显示行号。 C语言中源代码文件的文件扩展名为.c,头文件的文件扩展名为.h,经预编译之后,生成xxx.i文件。 在C++,源代码文件的扩展名是.cpp或.cxx,头文件的文件扩展名为.hpp,经预编译之后,生成xxx.ii文件。 二、编译 把预编译之后生成的xxx.i或xxx.ii文件,进行一系列词法分析、语法分析、语义分析及优化后,生成相应的汇编代码文件(语法查错)。 编译期仅仅知道内存分配的位置和大小,不做具体的分配操作 三、汇编 将汇编代码转变成机器可以执行的指令

编译原理 语义分析

故事扮演 提交于 2020-01-14 02:28:20
文章目录 1. 语义与语法的区别 重点:语义分析的两个作用 <3> 语义分析的方法 2. 中间代码 重点:要求中间代码具有如下特性,以便于编译器的开发移植和代码的优化: 3.后缀式 定义 算法实现 4.后缀式的计算 5.三地址码 6.四元式主要由四部分组成: 三地址代码 例题有文法 G 和 G 的语法制导翻译如下: 7.符号表 8. 数组元素的引用 9. 布尔表达式 10. 控制语句 11.过程的定义与声明 左值和右值 拉链回填 1. 语义与语法的区别 <1> 语法与语义的关系 语法是指语言的结构、即语言的“样子”;语义是指附着于语言结构上的实际含意 ,即语言的“意义”。 对于语法和语义: 语义不能离开语法独立存在; 语义远比语法复杂; 同一语言结构可包含多种含意,不同语言结构可表示相同含意; 语法与语义之间没有明确的界线。 重点:语义分析的两个作用 1.检查是否结构正确的句子所表示的意思也合法; 2.执行规定的语义动作,如: 表达式求值 符号表填写 中间代码生成等 <3> 语义分析的方法 语法制导翻译 2. 中间代码 重点:要求中间代码具有如下特性,以便于编译器的开发移植和代码的优化: 便于语法制导翻译; 既与机器指令的结构相近,又与具体机器无关。 3.后缀式 定义 一个表达式E的后缀形式可以如下定义: (1)如果E是一个变量或常量,则E的后缀式是E本身。 (2)如果E是E1

编译原理:此法分析,基本字,用户自定义标识符,字符串,字符,浮点数,数字

点点圈 提交于 2020-01-13 19:23:05
实验一 源程序的预处理及词法分析程序的设计与实现 使用方法:主程序的代码放到一个主程序cpp文件里,其他代码放到.h文件夹里,不知道如何建立头文件可以查看我的其他博客 一、实验目的 设计并实现一个包含预处理功能的词法分析程序,加深对编译中词法分析过程的理解。 二、 实验要求 1、实现预处理功能 源程序中可能包含有对程序执行无意义的符号,要求将其剔除。 首先编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依次存入输入缓冲区(字符型数据);然后编制一个预处理子程序,去掉输入串中的回车符、换行符和跳格符等编辑性文字;把多个空白符合并为一个;去掉注释。 2、实现词法分析功能 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。其中, syn为单词种别码。 Token为存放的单词自身字符串。 Sum为整型常量。 具体实现时,可以将单词的二元组用结构进行处理。 3、待分析的C语言子集的词法(可以自行扩充,也可以按照C语言的词法定义) 1)关键字 main if then while do static int double struct break else long switch case typedef char return const float short continue for void default sizeof do

Atitit.词法分析的理论原理 part2

谁说胖子不能爱 提交于 2020-01-12 16:54:33
Atitit. 词法分析的理论原理 part2 1 . 转换图 1 1 .1. 转换图是由程序流程图改进而成的。同样,转换图也可以等价地转换为程序流程图 3 1 .2. 2.2.3 构造词法分析器(2)流程 程序2-1虽然只有26行,却是词法分析器的核心 4 1 .3. 单词存储形式就是三元组(单词 ID ,单词备注,单词行号)。 4 1 .4. 单词流是如何传递给语法分析器的。 5 1 .5. 词法定义 5 1 .6. 词法分析器主要包括:构造转换图与转换表、设计词法分析器算法。 6 1 .7. 超前搜索几个字符与词法定义有关,有些设计不精良的语言可能需要超前搜索三个甚至四个字符才能正确识别单词 7 1. 转换图 从图2-2中,不难发现,其中只有"搜索指针后移一个字符"一种处理动作(方框)。那么,读者不妨想象一下,词法分析器是否就只有这种处理动作呢?仔细分析手工识别单词的过程后,就可以发现事实确实如此。既然词法分析器的流程中条件判断(菱形框)比较复杂,而处理动作非常单一,因此,可以将普通流程图改造成一种专门用于描述条件判断的流程图。具体改造步骤如下: 1)把图2-2中所有上、下菱形(判断)之间的箭头用圆表示。 2)把图2-2中所有的菱形直接用箭头线表示,箭头上写上原菱形的判断成立与否的条件,即可得到图2-3。 图2-3 识别Pascal标识符的状态转换图 这里省略了出错处理

Atitit.词法分析的理论原理 part2

99封情书 提交于 2020-01-12 07:46:18
Atitit. 词法分析的理论原理 part2 1 . 转换图 1 1 .1. 转换图是由程序流程图改进而成的。同样,转换图也可以等价地转换为程序流程图 3 1 .2. 2.2.3 构造词法分析器(2)流程 程序2-1虽然只有26行,却是词法分析器的核心 4 1 .3. 单词存储形式就是三元组(单词 ID ,单词备注,单词行号)。 4 1 .4. 单词流是如何传递给语法分析器的。 5 1 .5. 词法定义 5 1 .6. 词法分析器主要包括:构造转换图与转换表、设计词法分析器算法。 6 1 .7. 超前搜索几个字符与词法定义有关,有些设计不精良的语言可能需要超前搜索三个甚至四个字符才能正确识别单词 7 1. 转换图 从图2-2中,不难发现,其中只有"搜索指针后移一个字符"一种处理动作(方框)。那么,读者不妨想象一下,词法分析器是否就只有这种处理动作呢?仔细分析手工识别单词的过程后,就可以发现事实确实如此。既然词法分析器的流程中条件判断(菱形框)比较复杂,而处理动作非常单一,因此,可以将普通流程图改造成一种专门用于描述条件判断的流程图。具体改造步骤如下: 1)把图2-2中所有上、下菱形(判断)之间的箭头用圆表示。 2)把图2-2中所有的菱形直接用箭头线表示,箭头上写上原菱形的判断成立与否的条件,即可得到图2-3。 图2-3 识别Pascal标识符的状态转换图 这里省略了出错处理

编译原理(清华大学出版社)-- 文法和语言 -- 句型的分析

不想你离开。 提交于 2020-01-11 10:40:36
句型分析 句型分析是一个 识别输入符号串是否为语法上正确 的程序的过程 在语言的编译实现中,把完成句型分析的程序称为 分析程序 或 识别程序 , 分析算法 又称 识别算法 该书介绍的都是 从左到右 的分析算法,从左到右地识别输入符号串 两大类分析算法 自顶向下,从文法开始符号出发, 反复使用各种产生式 ,寻找"匹配"于输入符号串的推导 ( 正着推 ) 自底向上,从输入符号串开始, 逐步进行"归约" ,直至归约到文法的开始符号 ( 反着推 ) 从构造语法树的角度看,自顶向下,从树根开始构造;自底向上,从末端结点开始构造 自顶向下的分析方法 例题2.9 考虑文法G[S] S→sAd A→ab A→a S=>cAd=>cabd 自底向上的分析方法 例题2.9中的文法来为输入符号 cabd 构造语法树 句型分析的有关问题 在自顶向下分析方法中, 回溯 从各种可能的选择中随机挑选一种,并希望它是正确的 如果它是错误的,必须退回去,再试另外的选择 在自底向上分析方法中, 句柄 需要精确定义"可归约串",称为句柄 令G是一个文法,S是文法的开始符号,αβδ是文法G的一个句型 若有S αAδ 且 A β,则称β是句型αβδ相对于非终结符号A的 短语 如果有 A=>β,则称β是句型αβδ相对于规则 A→β 的 直接短语(简单短语) 一个 右句型 的直接短语,称为该句型的 句柄