编译原理

C# 词法分析器(三)正则表达式

你离开我真会死。 提交于 2020-01-05 00:46:10
系列导航 (一)词法分析介绍 (二)输入缓冲和代码定位 (三)正则表达式 (四)构造 NFA (五)转换 DFA (六)构造词法分析器 (七)总结 正则表达式是一种描述词素的重要表示方法。虽然正则表达式并不能表达出所有可能的模式(例如“由等数量的 a 和 b 组成的字符串”),但是它可以非常高效的描述处理词法单元时要用到的模式类型。 一、正则表达式的定义 正则表达式可以由较小的正则表达式按照规则递归地构建。每个正则表达式 $r$ 表示一个语言 $L(r)$,而语言可以认为是一个字符串的集合。正则表达式有以下两个基本要素: $\epsilon$ 是一个正则表达式, $L( \epsilon ) = { \epsilon }$,即该语言只包含空串(长度为 0 的字符串)。 如果 $a$ 是一个字符,那么 $\bf{ a }$ 是一个正则表达式,并且 $L( \bf{a} ) = \{ a \}$,即该语言只包含一个长度为 $1$ 的字符串 $a$。 由小的正则表达式构造较大的正则表达式的步骤有以下四个部分。假定 $r$ 和 $s$ 都是正则表达式,分别表示语言 $L(r)$ 和 $L(s)$,那么: $(r)|(s)$ 是一个正则表达式,表示语言 $L(r) \cup L(s)$,即属于 $L(r)$ 的字符串和属于 $L(s)$ 的字符串的集合( $L(r) \cup L(s) =

词法分析器:代码注释

我的梦境 提交于 2020-01-04 23:54:55
前沿:词法分析器是将一段程序的代码按照类别分开. 一般来说是将关键字, 变量名 , 常数 运算符( + _ * / )和界符分类 词法分析算是编译的基础把 今天上编译原理的实验课, 看了看 老师给的代码 添加了一些注释 大致的流程是这样的: 规定关键字的符号是10 数字的符号是数字本身 + - * = 这些符号代码中的case里面有(分别是13 14 ...),可以看懂的 首先, 把程序存到制定的内存区域, 这里是划出了一个连续的空间(放到字符数组); 然后再按字节读取里面的内容 , 当读到空格(" ")或者是换行符号(\n)的时候,就默认是一个单词啦,() 把这个单词放进一个另外一个数组里面,美其名曰token[]; 获得这个token之后 , 首先判断token中的每一个字符是不是属于a-z的字符里面(需要一个while循环遍历) 如果在读取的字符不是一个字母, 那在看看是不是数字(0-9),如果是的话,那就写成相应的标识符 如果读取的是+ 那么将syn(表示代号)为13 每次识别出来之后,都以 ("syn " , string )的形式输出 /**C语言的词法分析 **/ #include<stdio.h> #include<string.h> /** 程序规定: 1、关键字:"function","if","then","while","do","endfunc"; 2

编译原理——编译器结构

南笙酒味 提交于 2019-12-30 17:41:20
综述 编译器是具有高度模块化的一种结构,说白了就是编译的任务被划分为一个个小的子任务,交付给不同的小模块来执行。这些小模块的串行(顺序)执行,对应的就是小任务的串行实现,最终就实现了编译这个总任务。 所以说编译器也可以看成由多个阶段构成的流水线结构 如图所示,一种简单的"流水线“式的编译器结构 一种简单的编译器实现 被我们编译的源语言: 加法表达式sum,他的语言只有两种形式①直接就是整型数,比如 3 ②两个整数的加法形式 比如 3+4 目标机器,也就是编译器所在的那个机器: 它为栈式计算机,它上面主要有两条指令①push n,也就是将操作数压栈②add;他负责将栈顶元素和次栈顶元素弹出并相加,然后将相加后的结果再压入栈中(是的,你就当这条指令完成了这么多复杂的功能就行了) 我们的任务:编译1+2+3这个源语言写成的代码到我们的目标机器(栈式计算机)上 一: 将1+2+3这个字符序列送到词法分析部件(说是部件,其实就是一个软件模块)中,生成记号序列。然后将记号序列送至语法分析部件,生成抽象语法树(一种数据结构)。如下图所示 二: 然后语义分析(这里面简化就不写了),最后再代码生成,我们代码生成的方法是后序遍历这棵抽象语法树,当遍历到整数n时,生成push n的代码(我们这里说的代码是汇编语言代码),当遍历到+时,生成add代码,所以我们最后生成的目标代码为 push 1 push

编译原理上机实习

你离开我真会死。 提交于 2019-12-28 19:47:37
一、实习目的 理解编译程序的构造原理,掌握编译程序的构造方法与技术。通过实习,使学生既加深对编译原理基础理论的理解,又提高动手能力,特别是提高软件设计能力。 二、实习要求 在理解编译原理基本思想的基础上,选择一个自己熟悉的程序设计语言,完成编译程序的设计和实现过程。 编译程序的设计可以采用自顶向下和自底向上两种不同的方法。由于许多高级语言(如PASCAL,C)中的语法成分都是递归定义的,所以本实习要求学生 采用递归下降分析技术 ,这是一种自顶向下的的编译方法,其基本思想是对语言的每个(或若干个)语法成分编制一个处理子程序,从处理<程序>这个语法成分的子程序开始,在分析过程中调用一系列过程或函数,对源程序进行语法和语义分析,直到整个源程序处理完毕为止。 本上机实习是为C语言(子集)设计一个编译程序,完成词法分析、语法分析、语义分析等功能,并生成某种机器上的目标代码(汇编语言)或中间代码(四元式)。 三、实习步骤 1.阅读《上机实习指导书》。 2.根据设计要求写算法,画程序框图 3.根据框图编写编译程序 4.输入编译程序并上机调试 5.撰写上机实习报告 四、实习内容 1、题目:C语言小子集编译程序的实现 2、C语言小子集的文法规则: 1.<程序>::=main(){<分程序>} 2.<分程序>::=<变量说明部分>;<语句部分> 3.<变量说明部分>::=<变量说明><标识符表> 4.

编译原理实验---语法分析器

对着背影说爱祢 提交于 2019-12-28 01:44:25
编译原理实验—语法分析器 一、算术表达式文法 VN = { E, T, E’, F, T’ } 其中:E为开始符号; VT = { +, -, , /, (, ), id, num } 其中:id代表标识符,要求是长度不超过10的字母序列;num代表常数,要求是正整数; 文法规则集如下: E→TE’ E’→+TE’| -TE’ |ε T→FT’ T’→ FT’| /FT’ |ε F→(E) | id | num 二、文法中每个非终结符的First集和Follow集 三、由产生式F→(E) | id | num构造的递归下降分解程序示例: PROCEDURE F IF SYM = ` id ` THEN ADVANCE ELSE IF SYM = ` num ` THEN ADVANCE ELSE IF SYM = ` ( ` THEN BEGIN ADVANCE ; E IF SYM = ` ) ` THEN ADVANCE ELSE ERROR END ELSE ERROR 其中,SYM代表输入串指针所指的符号;ADVANCE代表把输入指针调至下一输入符号。 四、程序代码 # include <iostream> # include <stdio.h> # include <cctype> # include <string.h> # include <iomanip> #

编译原理学习笔记

强颜欢笑 提交于 2019-12-27 01:51:57
机器语言:可以被计算机直接理解 汇编语言:引入助记符,依赖特定机器,编写效率低 高级语言:类似于数学定义或自然语言的简洁形式,编写效率高 编译:将高级语言翻译成汇编语言或机器语言的过程。 源程序——>(预处理器)——>经过预处理的源程序——>(编译器)——>汇编语言程序——>(汇编器)——>可重定位的机器代码——>(链接器/加载器)——>目标机器代码 预处理器: 1、把存储在不同文件中的源程序聚合在一起 2、把被称为宏的缩写语句转换为原始语句 可重定位:在内存中存放的起始位置不是固定的 连接器: 1、将多个可重定位的机器代码文件(包括库文件)连接到一起 2、解决外部内存地址问题 加载器: 1、修改可重定位地址 2、将修改后的指令和数据放到内存中适当的位置 编译分为两个阶段: 1、词法分析 2、语法分析:语法分析器从词法分析器输出的token序列中识别出各类短语,并构造语法分析树,语法分析树描述了句子的语法结构 语义分析的主要任务: 1、手机标识符的属性信息 2、语义检查 (1)变量或过程未经声明就使用 (2)变量或过程名重复声明 (3)运算分量类型不匹配 (4)操作符与操作数之间的类型不匹配 1)数组下标不是整数 2)对非数组标量使用数组访问操作符 3)对非过程名使用过程调用操作符 4)过程调用的参数类型或数目不匹配 5)函数返回类型有误 常用的中间表示形式: 1、三地址码

编译原理--引论(一)

瘦欲@ 提交于 2019-12-27 00:42:31
在一个程序可以运行之前,它首先被翻译成一种能够被计算机执行的形式 完成这项翻译工作的软件系统称为编译器 语言处理器   编译器 一个编译器 是一个程序 ,它可以把以源语言编写的程序,把该程序翻译成为一个等价的 编译器的重要任务之一是报告它在 翻译过程中发现的源程序中的错误      运行目标程序 若目标程序是一个可执行的机器语言程序,那么它就可以被用户调用,处理输入并产生输出      解释器 常见的语言处理器,不通过翻译方式生成目标程序 从用户角度看,解释器直 接利用用户提供 的输入执行源程序中指定的操作     编译器与解释器优劣比较   在把用户输入映射成为输出的过程中 由一个 编译器 产生的机器语言目标程序通常 比一个解释器快很多 解释器的错误诊断效果通常比编译器更好 ,因为它逐个语句执行源程序   Java语言处理器结合了编译和解释过程 一个Java源程序首先被编译成一个称为 字节码(bytecode) 的中间表示形式 然后由一个虚拟机对得到的字节码加以 解释执行 好处是可以在 一台机器上编译得到的字节码 在 另一台机器上解释执行 通过网络 就可以完成机器之间的迁移    为了更快地完成输入到输出地处理,有些被称为 即时编译器 地Java编译器在运行中间程序处理输入的 前一刻首先把字节码翻译成为机器语言 ,然后再执行程序 一个源程序可能被 分割成为多个模块

山东大学编译原理2019-2020期末考试题目

丶灬走出姿态 提交于 2019-12-26 01:15:23
一、五个小题(25分) 1.判断一个文法是否二义 2.编译的前端,后端,什么是一遍扫描 3.什么是S属性 4.什么是语法制导翻译 5.在语法制导翻译中,空返产生式的作用(M->e) 二、自动机(15分) 一个单词表由a,b组成,请写出代表偶数个a的正规式,NFA,并确定化、最小化 三、判断一个文法是不是LL(1)的,如果是就写出预测分析表,不是就说明原因(15分) 四、判断一个文法是不是SLR(1)的,如果是就写出预测分析表,不是就说明原因(15分) 五、中间代码生成程序(15分) while a<c and b<d do if c==1 then c:=c+1 else c:=c+2; 六、代码优化(15分) DAG优化,最后写出四元式的形式(这个是一个坑,四元式是目标代码,也就是此时要做目标代码生成) 同时目标代码生成要列表(Rvalue 寄存器描述,Avalue地址描述) 来源: CSDN 作者: LifeMaker 链接: https://blog.csdn.net/qq_41207620/article/details/103704226

侃一侃编译原理的“文法”

落花浮王杯 提交于 2019-12-22 02:30:10
如果你敲累了代码,想喝喝咖啡,顺便看点儿可以当佐料的文章那本文应该比较适合现在的你。(•̀ᴗ•́)و ̑̑ 我们一天天都在和代码打交道,但是你了解代码的运行原理么?为什么你的一行代码就能被执行出五花八门的效果嘞? 其实代码这玩意儿就是一门语言。是的,你可以看成和中文、英文等语言平等的存在。是语言就得有语言的解析规则,不懂得规则自然无法理解语言的意思。就跟看没字幕的美剧一样,真是痛苦。╮(╯﹏╰)╭ 中文有中文的语义、语法、句子、句法、文法,那么编程语言也有自己的语言系统。 我们知道,我们写的代码被编译器或者解释器所执行,那它们是按照什么文法来理解你的代码呢?这就是文法。 本文也不会深入去解析文法,不然可以直接转语言学了(笑~)。本文只是简单介绍文法的一些概念。如果您喝着咖啡,看完之后,能有些许收获,微微一笑,那本文的目的也就达到了。^_^ 工欲善其事必先利其器。在谈文法之前,我们先介绍几个概念。 一.文法涉及的几个简单概念 假设Σ是一个有限的 字母表集合 ,它的每一元素都是一个 符号 。Σ上的一个 符号串 就是指由Σ中的符号组成的一个有限序列。如果一个符号串不包含任何符号,就叫它 空串 ,记为ε。现在再定义一个集合U和V的 连接积 的概念:          UV = {αβ | α∈U,β∈V} 比如A = {a,b},B = {1,2},则AB={a1,a2,b1,b2}

编译原理-词法分析器,语法分析器-课程设计

為{幸葍}努か 提交于 2019-12-20 00:27:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 这是偶然翻出来的一段大学时的代码——词法分析器又称扫描器。词法分析是指将我们编写的文本代码流解析为一个一个的记号,分析得到的记号以供后续语法分析使用。词法分析器的工作是低级别的分析:将字符或者字符序列转化成记号.。在谈论词法分析时,我们使用术语“词法记号”(简称记号)、“模式”和“词法单元”表示特定的含义。 在分析时,一是把词法分析器当成语法分析的一部分,另一种是把词法分析器当成编译程序的独立部分。在前一种情况下,词法分析器不断地被语法分析器调用,每调用一次词法分析器将从源程序的字符序列拼出一个单词,并将其Token值返回给语法分析器。后一种情况则不同,词法分析器不是被语法分析器不断地调用,而是一次扫描全部单词完成编译器的独立一遍任务。 词法分析器主要特点是不依靠语法,而只依靠词法,即处理一个单词时不依赖于外部单词的信息,因此词法分析器一般都很简单。当然,对某些语言在作词法分析时,在有些情况下不得不往前查看多个字符,有时还要做一些特殊处理,还有一些在词法分析中处理不了的,要留到语法分析中进行处理。 本算法主要利用状态转换图生成一个词法分析器,对输入的程序进行词法分析,并将分析得到的单词造表。其中关键字表和界限符表的大小是由高级语言的子集决定的,可以用数组装载