当前位置:文档之家› 编译原理

编译原理

编译原理
编译原理

第一章概述

1、编译程序:是现代计算机的基本组成部分之一。是一种翻译程序,它将高级语言所写的

源程序翻译成等价的机器语言或汇编语言的目标程序。

2、编译程序的五个阶段:(表格管理程序和错误处理程序涉及到编译程序的每个阶段)

(1)词法分析:词法分析阶段的任务是对构成源程序的字符串从左到右进行扫描和分解,根据语言的词法规则,识别出一个一个具有独立意义的单词。

(2)语法分析:语法分析的任务根据语法规则(即语言的文法),分析并识别出各种语法单位(如表达式、说明、语句等)并进行语法检查,即检查各种语法单位在语法结构上的正确性。

(3)语义分析及中间代码生成:定义一种语言除要求定义语法外,还要求定义其语义,即对语言的各种语法单位赋予具体的意义。

(4)代码优化:代码优化的任务是对前阶段产生的中间代码进行等价变换或改造,以期获得更为高效的,即省时间和空间的目标代码。

(5)目标代码生成:目标代码生成的任务是将中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。

3、自动构造工具:LEX、YACC、GCC

第二章文法和语言的基本知识

1、字母表:是元素的非空有穷集合。

符号(字符):字母表中的元素称为符号,或称为字符。

符号串(字):符号的有穷序列称为符号串。

不包含任何符号的符号串,称为空符号串,用ε表示。

A的正闭包表示A上元素a,b构成的所有符号串的集合,集合A的闭包比正闭包多含一个空符号串ε。

2、形式语言:序列的集合称为形式语言。每个形式语言都是某个字母按某种规则构成的所

有符号串的集合,反之,任何一个字母表上符号串的集合均可定义为一个形式语言。3、规则:也称产生式,它是一个符号与另一个符号串的有序对(A,β),通常写作A→β或

A::=β。一组规则规定了一个语言的语法结构。

4、文法是规则的非空有穷集合,通常表示成四元组G=(V N,V T,P,S)。其中:

V N是规则中非终结符号的集合。

V T是规则中终结符号的集合。V N∩V T=Ф。通常用V表示V N∪V T,称为文法G的字汇表P是文法规则的集合

S是一个非终结符号,称为文法的开始符号或文法的识别符号。

对于一个给定的语言,描述该语言的文法不是唯一的。

5、直接推导:=>

推导:α0=>(+)αn,表示从α0出发,经一步或若干步或使用若干次规则可推导出αn 广义推导:α0=>(*)αn,表示从α0出发,经0步或若干步,可推导出αn

直接推导的长度为1,推导的长度大于等于1,而广义推导的长度大于等于0.

6、语言:文法G[S]产生的所有句子的集合称为文法G所定义的语言,记为L(G[S])。

7、当文法给定时,语言也就确定;L(G)是V T*的子集,即属于V T*的符号串x不一定属于L(G)。

8、已知文法确定语言的中心思想是:从文法的开始符号出发,反复连续地使用规则,对非

终结符号施行替换和展开,找出句子的规律,用式子或自然语言描述出来。

9、(1)给定一个文法,就能从结构上唯一地确定其语言

(2)给定一种语言,能确定其文法,但这种文法不是唯一的。

10. 最右推导也称为规范推导,用规范推导推导出的句型称为规范句型。

规范推导的逆过程,称为最左规约,也称为规范规约。

11. 递归规则:是指在规则的左部和右部具有相同非终结符的规则(规则左递归、规则右递归、规则递归)

文法的递归性:指对文法中任一非终结符,若能建立一个推导过程,在推导所得的符号串中又出现了该非终结符本身,则文法是递归性的。(文法左递归、文法右递归、文法递归)12. 短语:子树的末端节点形成的符号串是相对于子树根的短语。

直接短语:简单子树的末端结点形成的符号串是相对于简单子树根的直接短语。

句柄:最左简单子树的末端节点形成的符号串是句柄。

13. 文法的二义性:如果一个文法存在某个句子对应两棵不同的语法树。则说这个文法是二义性的。或者说,若一个文法中存在某个句子,它有两个不同的最左(最右)推导,则这个文法是二义性的。

14. 消除文法的二义性

(1)不改变文法中原有的语法规则,仅加进一些语法的非形式规定。

(2)构造一个等价的无二义性文法,即把排除二义性的规则合并到原有文法中,改写原有的文法。

15. 文法和语言的分类:0型文法(无限制文法),1型文法(上下文有关文法),2型文法(上下文无关文法),3型文法(正规文法)。

第三章词法分析与有穷自动机

1、单词符号是程序语言的基本语法单位,分为5种:关键字、标识符、常数、运算符、界符。

(关键字、运算符、界符的个数有上限;标识符、常数个数无上限)

2、语法分析程序所输出单词符号通常表示成如下的二元式:(单词种别,单词自身的值)

3、对任意一个正规文法,存在定义同一语言的正规式;反之,对每个正规式存在一个生成

同一语言的正规文法。

4、正规文法到正规式的转换:(1)将正规文法中的每个非终结符表示成关于它的一个正规

式方程,获得一个连立方程组;(2)依照求解规则:若x=ax|β(或x= ax+β),则解为x=a*β;若x=xa|β(或x= xa+β),则解为x=βa*.

5、不确定的有穷自动机NFA和确定的有穷自动机DFA区别:DFA没有输入空串之上的转换

动作;对于DFA,一个特定的符号输入,有且只能得到一个状态,而NFA就有可能得到一个状态集。

6、化简了的DFA满足:没有多余状态;它的状态集中,没有两个状态是互相等价的。

第四章语法分析

1、非确定的自上而下分析法,即带回溯的自上而下分析法,实际上是一种琼剧的额试探方

法,其分析效率极地,代价很高,在实用的编译程序中是不常用的。

2、确定的自上而下分析法,要求描述语言的文法是无左递归的和无回溯的。

3、文法左递归的消除:

(1)引进一个新的非终结符,把含左递归的规则改写成右递归。

一般情况下,设文法中关于A的规则为A→Aα1|Aα2|…|Aαm|β1|β2|…|

βn;其中每个α都不等于ε,而每个β都不以A开头,消除直接左递归后改写

成:A→β1A’|β2A’|…|βnA’ ; A’→α1A’|α2A’|…|αmA’|ε(2)采用扩充BNF表示法改写含直接左递归的规则。

1)使用花括号{α}表示符号串α的出现可0次或多次,即表示α*;

2)使用方括号[α]表示α的出现可有可无,它用来表示可供选择的符号串;

3)使用圆括号可在规则中提取因子。

4、在自上而下分析过程中,为了避免出现回溯,要求描述语言是LL(1)文法。

一个上下文无关文法G是LL(1)文法,当且仅当对G中每个非终结符A的任何两个不同的规则A→α|β,满足SELECT(A→α)∩SELECT(A→β)=Ф。(其中α,β中至多只有一个能退出ε串)

这里,LL(1)文法中的第一个L表明自上而下的分析是从左到右扫描入串,第二个L表明分析过程中使用最左推导,1表示分析时每一步只需向前看一个符号即可决定所选用的规则,而且这种选择是准确无误的。

5、非LL(1)文法到LL(1)文法的改写:通过消除左递归和反复提取公共左因子对文法进行

等价变换。(并非一切非LL(1)文法都能改写成LL(1)文法)

6、自下而上分析法:基本思想是用一个寄存文法符号的先进后出栈,将输入符号一个一个

地按从左到右扫描顺序移入栈中,边移入边分析,当栈顶符号串形成某条规则右部时就进行一次归约,即用该规则左部非终结符替换相应规则右部符号串,我们把栈顶被归约的这一符号串称为可规约串。重复这一过程直到整个输入串分析完毕。最终若栈中剩下句子右界符和文法的开始符号,则分析的输入符号串是文法的正确句子,否则,就不是文法的正确句子,报告错误。

7、在规范归约分析法中,是用句柄来刻画可归约串,而在算符优先分析法中,是用最左素

短语来刻画可归约串。

8、算符优先分析法:所谓算符分析优先法就是依照算术表达式的四则运算过程而设计的一

种语法分析方法。这种分析方法首先要规定运算符之间的优先关系和结合性质,然后借助这种关系,比较相邻运算符的优先级来确定句型的可规约串并进行规约。

9、算符优先分析法借助优先关系矩阵(也称优先关系表,简称优先表)寻找句型的可归约

串。(只有描述语言的文法是算符优先文法,才能采用算符优先分析法进行语法分析)10. 算符文法:性质:(1)在算符文法中任何句型都不含两个相邻的非终结符;(2)若Ab 或bA出现在算符文法的句型β中,其中A∈V N,b∈V T,则β中任何含b的短语比含有A。11. 算符优先文法:设有一个不含ε规则的算符文法G,如果任意两个终结符对(a,b)在<、>、=(符号都少个点)3种关系中只有一种关系成立,则称G是算符优先文法,也称OPG文法。

12. 素短语:是指一种短语,它至少包含一个终结符,并且除自身之外,不再含其他的素短语。最左素短语:句型最左边的素短语称为最左素短语。

13. 算符优先分析法的局限性:由于忽略非终结符在归约过程中的作用,可能导致把本来不是句子的输入串误认为是文法句子。

14. LR分析法是一种自下而上进行归约的语法分析法。这里L是指从左到右扫描输入符号串,R是指构造最右推导的逆过程。

15. LR(0)分析就是在分析的每一步,只需根据当前栈顶状态而不必向前查看输入符号就能确定应采取的分析动作。

16. LR分析表的基本思想是从给定的上下文无关文法直接构造识别文法所有规范句型活前缀的DFA,然后再将DFA转换成一张LR分析表。

17.前缀:字符串的前缀是指字符串的任意首部

18. 活前缀:是指规范句型的前缀,这种前缀不包含句柄右边的任何符号。(注意:活前缀可以是一个或者是若干个规范句型的前缀)

19. LR(0)项目:把文法G中右部标有圆点的规则称为G的一个LR(0)项目。

LR(0)项目可分为:归约项目、移进项目、待约项目、接受项目。

20. LR(0)项目集:构成识别文法规范句型活前缀DFA的每一个状态是由若干个LR(0)项目是所组成的集合,称为LR(0)项目集。

21.语法分析器中错误处理程序的基本目标是:

(1)清楚、准确地报告错误的出现;

(2)快速地从错误中恢复,继续检查后面的错误;

(3)尽可能少地增加处理正确程序的开销。

22. 语法分析器采用四种语法错误恢复策略:

(1)紧急方式恢复策略。发现错误时,语法分析器开始抛弃输入符号,每次抛弃一个符号,直到发现某个指定的同步符号为止。

(2)短语级恢复策略。发现错误时,语法分析器对剩余的输入符号进行局部纠正,用一个能使语法分析器继续工作的符号串代替剩余输入的前缀。

(3)出错产生式策略。扩充语言的文法,增加产生错误结构的生产式。然后由这些包含错误产生式的扩展文法构造语法分析器。

(4)全局纠正策略。希望编译器在处理有错误的输入字符串时做尽可能少的改动。23. 4种LR文法的判别方法:

首先判别文法是否为二义性文法,因为任何二义性文法都不是LR类文法。若文法不是二义性文法,则可根据项目集中是否含冲突项目或相应分析表中是否含多重定义元素进行判断:(1)LR(0)文法是所有的LR(0)项目集中没有“移进-归约”冲突或“归约-归约”冲突。(2)SLR(1)文法是LR(0)项目集中所有含冲突的项目集都能用SLR规则解决冲突。

(3)LR(1)项目集中无“移进-归约”冲突或“归约-归约”冲突(LR(1)分析表中不含多重定义),注意搜索符只对归约项目起作用。

(4)LALR(1)项目集中无“归约-归约”冲突(LALR(1)分析表中不含多重定义)

24. 4种LR类文法之间的关系:一个文法是LR(0)文法一定是SLR(1)文法,也是LR(1)和LALR(1)文法,反之则不一定成立。即LR(0)∈(包含于)SLR(1)∈LALR(1)∈LR (1)

第五章语法制导翻译技术和中间代码生成

1、静态语义审查:审查每个语法结构的静态语义,即验证语法结构合法的程序,是否真正有

意义

2、目前多数编译程序进行语义分析的方法是采用语法制导翻译法。它不是一种形式系统,

但它比较接近形式化。语法制导翻译法使用属性文法为工具来描述程序设计语言的语义。

3、属性加工的过程即是语义的处理过程。属性分为两类:综合属性和继承属性。一般情况

下,综合属性用于“自下而上”传递信息,继承属性用于“自上而下”传递信息。

4、语法制导翻译法的基本思想:为文法的每个产生式都配备一个语义动作或语义子程序。

在语法分析的过程中,每当使用一条产生式进行推导或归约时,就执行相应产生式的语义动作, 从而实现语义处理

5、语法制导翻译法:在语法分析过程中,依随分析的过程,根据每个产生式所对应的语义

子程序(或语义规则描述的语义处理的加工动作)进行翻译的方法

6、逆波兰式:逆波兰式除去了原表达式中的括号,并将运算对象写在前面,运算符写在后

面,因而又称为后缀式

7、三元式主要由三部分组成:(OP,arg1, arg2)其中OP是运算符,arg1,arg2分别是第一

和第二两个运算对象,当OP是一目运算时,常常将运算对象定义为arg1。

8、四元式主要由四部分组成:(op,arg1,arg2,result),其中op是运算符,arg1,arg2

分别是第一和第二个运算对象,当op是一目运算时,常常将运算对象定义为arg1。9、三地址代码形式定义为:result :=arg1 OP arg2,三地址语句:语句中是三个量的赋

值语句, 每个量占一个地址

第六章符号表的组织与管理

1符号表是编译程序中主要的数据结构之一。它主要用来存放程序语言中出现的有关标识符的信息。编制程序处理标识符时主要涉及两部分内容:1标识符自身2与标识符相关的信息2符号表的作用:符号表用来存放程序语言中出现的有关标识符的属性和特征。

1 将标识符的名字和属性登录在符号表中

2 辅助上下文语义的正确性检查

3辅助目标代码的生成

3符号表的组织方式一般可以分为直接方式和间接方式

直接方式是在符号表中直接填入源程序中定义的标识符及其相关信息。名字栏的长度固定,结构简单,方便填写和查找,适合于规定标识符长度的程序语言。

间接方式指单独设置一个字符串数组,其中存放所有标识符,在符号表的名字栏中设置指针和整数。指针指向标识符在数组中的位置。整数值表示标示符的长度。

一般用间接方式组织符号表

4对于简单变量名,信息栏中可以记录:类型,长度,相对数

5.符号表的构造方法:

线性法:是按名字出现的先后顺序填写各表项。

二分法:造表时是将名字拦按名字的大小顺序排列

散列法:构造一个散列函数将所得的函数值求整或求余得到表项在表中位置。

6.符号表的查找算法:

符号表查找算法与该符号表的构造方法密切相关即有顺序查找、折半查找和杂凑查找算法。第七章代码优化

1 代码优化,对程序实施各种等价变换,使得变换后程序能生成高效率的目标代码

高效率目标代码是指:目标代码占用的存储空间少,目标代码运行时间短。

2原则:等价原则:保证等价性

有效原则:有明显的效果

合算原则:较低的代价取得较好的优化效果。

3.提高代码质量的技术称为代码优化,

根据代码优化是否涉及具体的计算机来划分

与机器有关的优化(在目标代码上进行):对寄存器的优化,多处理机的优化,特殊指令的优化。有时因为这种优化只观察中间代码或目标代码的相邻部分,并对其进行优化,所以又称窥孔优化。

与机器无关的优化(在中间代码上进行)

根据优化对象所涉及的程序范围:分为局部优化,循环优化,全局优化等。

4七种优化技术:

1删除公共子表达式(删除多余运算):公共子表达式指在一个基本程序块内计算结果相同的子表达式。对相同的子表达式只在第一次出现时计算且仅计算一次,将重复计算的表达式删除。

2 代码外提:指将循环中的不变运算提到循环体前面

3.强度削弱:指在不改变运算结果的前提下,将程序中执行时间长的运算替换成执行时间短的运算。对计算机上的二进制算术运算,作加法一般比作乘法的速度快。

4变换循环控制条件(删除归纳变量)

5 合并已知量:指若参加运算的两个对象在编译时都是已知量,则可以再编译时直接计算出它们的运算结果,不必等到程序运行时再计算。

6复写传播:指尽量不引用那些在程序中仅仅只传递信息而不改变其值,也不影响其运行结果的变量。

7删除无用赋值:若在程序的任何地方都不引用X,这时该语句执行与否对程序运行结果没有任何作用,这种语句称为无用赋值语句,可以删除。

5优化后的代码有如下特点:

减少了循环体内可执行代码,减少了作乘法运算的次数,减少了全程范围内使用的变量。

6局部优化:指局限于程序基本快范围内的一种优化

所谓基本块是指程序中一组顺序执行的语句序列,其中只有一个入口语句和一个出口语句。包括:合并已知量,删除公共子表达式(删除多余的运算),删除无用赋值

7循环优化:指对循环中的代码进行优化

包括:代码外提,删除归纳变量,强度削弱

实施循环优化的过程:分析程序控制流、查找循环、实施循环优化

全局优化:是在整个程序范围内进行的优化, 需进行数据流分析, 花费代价很高

8窥孔优化:是一种简单但有效的改进代码质量的技术。这种技术主要通过分析一小段目标指令(称为窥孔),并把这些指令替换为更短和更快的一段指令,从而提高代码的质量包括:删除冗余存取指令,删除不可达代码,控制流优化,强度削弱,删除无用操作。第八章运行时的存储组织与管理

1运行时的环境:目标计算机的寄存器和存储器的结构,以及用来管理存储器并保存执行过程所需要的信息。

2.存储空间通常被划分成:目标区,静态数据区,栈区,堆区

目标代码区用于存放生成的目标代码,它的长度可以再编译时确定,

全程、静态数据区用于存放编译时所能确定占用空间大小的数据,

堆栈用于存放可变数据以及管理过程活动的控制信息

3存储空间分配的一个重要单元是过程的活动记录

过程的活动记录是一段连续的存储区,用以存放过程的一次执行所需要的信息

4 最简单的运行时的环境类型是所有的数据都是静态的。如果在编译时就能确定目标程序运行中所需要的全部数据空间的大小,则编译时就能安排好目标程序的全部数据空间,并能确定每个数据项的单元地址,存储空间,这种分配方法叫做静态分配。

5 在允许递归调用可变数组且每次调用都要重新分配局部变量的语言中,要采用动态存储分配策略

6 对于没有分程序结构,过程定义不允许嵌套但循序过程递归调用的语言,可以采用一种简单的栈式存储分配策略。C语言

7嵌套过程的栈式存储分配:如Pascal语言

8,堆式动态存储分配三种分配策略:

1.首次匹配法:顺序查看空闲块,选取其中第一个满足所需容量要求的空闲块进行分配。如果空闲块很大,则按申请的大小进行分割,如果不大就整块分割出去,以免产生碎片

2.最优匹配法:将不小于所申请快且容量最接近于申请快的空闲块分配出去

3.最差匹配法:将不小于所申请快且容量最大的空闲块分配出去

9如果两个临时变量名的作用于不相交,则他们可以分配到同一单元中,一个临时变量名自它第一次被赋值的地方起直至它最后一次被引用的地方止,这区间的程序所能到达的全体四元式构成了它的作用域

10 分配策略:

静态存储分配策略编译时对源程序中各数据项分配固定的存储空间,运行时始终不变。

动态存储分配策略运行阶段动态地为源程序中的数据项分配存储空间

栈式动态存储分配用一个栈作为动态分配的存储空间。运行时,每当调用一个子程序(过程),所需存储空间就动态地分配于栈顶,退出时释放所占用的空间。

堆式动态存储分配:运行时把存储区组织成堆,以便用户动态地申请或释放存储空间

第九章目标代码生成

1.目标代码生成是编译模型的最后一个阶段。它通常在语法分析后或者优化后的中间代码上进行,并将中间代码转化为等价的目标代码

2.代码生成器的输入包括中间代码和符号表中的信息。生成的目标代码一般有如下三种形式:1 能够立即执行的机器语言代码,它们通常存放在固定的存储区中,编译后可立即执行

2待装配的机器语言模块,当需要执行时,由连接装配程序把它们与另外一些运行子程序连接起来,组合成可执行的及其语言代码

3汇编语言程序,必须通过汇编程序汇编成可执行的机器语言代码

3衡量目标代码质量:

存储空间:生成的目标代码短

执行效率:充分利用寄存器,减少访问存储单元的次数

编译原理语法分析实验报告

编译原理语法分析实验报告 - 班级:XXX 学号:XXX 姓名:XXX 年月日 1、摘要: 用递归子程序法实现对pascal的子集程序设计语言的分析程序 2、实验目的: 通过完成语法分析程序,了解语法分析的过程和作用 3、任务概述 实验要求:对源程序的内码流进行分析,如为文法定义的句子输出”是”否则输出”否”,根据需要处理说明语句填写写相应的符号表供以后代码生成时使用 4、实验依据的原理 递归子程序法是一种自顶向下的语法分析方法,它要求文法是LL(1)文法。通过对文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选式时,程序能够按LL(1)形式唯一地确定选择某个候选式进行推导,最终识别输入串是否与文法匹配。 递归子程序法的缺点是:对文法要求高,必须满足LL(1)文法,当然在某些语言中个别产生式的推导当不满足LL(1)而满足LL(2)时,也可以采用多向前扫描一个符号的办法;它的另一个缺点是由于递归调用多,所以速度慢占用空间多,尽管这样,它还是许多高级语言,例如PASCAL,C等编译系统常常采用的语法分析方法。

为适合递归子程序法,对实验一词法分析中的文法改写成无左递归和无左共因子的,,,如下: <程序>?<程序首部><分程序>。 <程序首部>?PROGRAM标识符; <分程序>?<常量说明部分><变量说明部分><过程说明部分> <复合语句> <常量说明部分>?CONST<常量定义><常量定义后缀>;|ε <常量定义>?标识符=无符号整数 <常量定义后缀>?,<常量定义><常量定义后缀> |ε <变量说明部分>?VAR<变量定义><变量定义后缀> |ε <变量定义>?标识符<标识符后缀>:<类型>; <标识符后缀>?,标识符<标识符后缀> |ε <变量定义后缀>?<变量定义><变量定义后缀> |ε <类型>?INTEGER | LONG <过程说明部分>?<过程首部><分程序>;<过程说明部分后缀>|ε <过程首部>?PROCEDURE标识符<参数部分>; <参数部分>?(标识符: <类型>)|ε <过程说明部分后缀>?<过程首部><分程序>;<过程说明部分后缀>|ε <语句>?<赋值或调用语句>|<条件语句>|<当型循环语句>|<读语句> |<写语句>|<复合语句>|ε <赋值或调用语句>?标识符<后缀> <后缀>?:=<表达式>|(<表达式>)|ε <条件语句>?IF<条件>THEN<语句> <当型循环语句>?WHILE<条件>DO <语句> <读语句>?READ(标识符<标识符后缀>)

编译原理语义分析实验报告——免费!

语义分析实验报告 一、实验目的: 通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。 二、实验要求: 采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 三、算法思想: 1、设置语义过程。 (1)emit(char *result,char *ag1,char *op,char *ag2) 该函数的功能是生成一个三地址语句送到四元式表中。 四元式表的结构如下: struct { char result[8]; char ag1[8]; char op[8]; char ag2[8]; }quad[20]; (2) char *newtemp() 该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,… char *newtemp(void) { char *p; char m[8]; p=(char *)malloc(8); k++; itoa(k,m,10); strcpy(p+1,m); p[0]=’t’; return(p); } 2、函数lrparser 在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。

四、源程序代码: #include #include #include #include struct { char result[12]; char ag1[12]; char op[12]; char ag2[12]; }quad; char prog[80],token[12]; char ch; int syn,p,m=0,n,sum=0,kk; //p是缓冲区prog的指针,m是token的指针char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner(); char *factor(void); char *term(void); char *expression(void); int yucu(); void emit(char *result,char *ag1,char *op,char *ag2); char *newtemp(); int statement(); int k=0; void emit(char *result,char *ag1,char *op,char *ag2) { strcpy(quad.result,result); strcpy(quad.ag1,ag1); strcpy(quad.op,op); strcpy(quad.ag2,ag2);

编译原理实验报告实验一编写词法分析程序

编译原理实验报告实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级:13软件四 姓名:丁越 学号: 电子邮箱: 实验地点:秋白楼B720 实验成绩: 日期:2016年3 月18 日

一、实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析 程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、实验过程 以编写PASCAL子集的词法分析程序为例 1.理论部分 (1)主程序设计考虑 主程序的说明部分为各种表格和变量安排空间。 数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字 后面补空格。 P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中 (编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id和ci数组分别存放标识符和常数。 instring数组为输入源程序的单词缓存。 outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上 送来的一个单词;调用词法分析过程;输出每个单词的内部码。 ⑵词法分析过程考虑 将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图1-1。 图1-1 该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符 k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为 1,2,3,4,5)。 对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有 该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数 变为二进制形式存入数组中 ci中,并记录其在表中的位置。 lexical过程中嵌有两个小过程:一个名为getchar,其功能为从instring中按顺序取出一个字符,并将其指针pint加1;另一个名为error,当出现错误时,调用这个过程, 输出错误编号。 2.实践部分

编译原理-编写递归下降语法分析器

学号107 成绩 编译原理上机报告 名称:编写递归下降语法分析器 学院:信息与控制工程学院 专业:计算机科学与技术 班级:计算机1401班 姓名:叶达成 2016年10月31日

一、上机目的 通过设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、基本原理和上机步骤 递归下降分析程序实现思想简单易懂。程序结构和语法产生式有直接的对应关系。因为每个过程表示一个非终结符号的处理,添加语义加工工作比较方便。 递归下降分析程序的实现思想是:识别程序由一组子程序组成。每个子程序对应于一个非终结符号。 每一个子程序的功能是:选择正确的右部,扫描完相应的字。在右部中有非终结符号时,调用该非终结符号对应的子程序来完成。 自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推导出待检查的符号串。分析速度慢。而无回溯的自上向下分析技术,当选择某非终结符的产生时,可根据输入串的当前符号以及各产生式右部首符号而进行,效率高,且不易出错。 无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。 无左递归:既没有直接左递归,也没有间接左递归。 无回溯:对于任一非终结符号U的产生式右部x1|x2|…|x n,其对应的字的首终结符号两两不相交。 如果一个文法不含回路(形如P?+ P的推导),也不含以ε为右部的产生式,那么可以通过执行消除文法左递归的算法消除文法的一切左递归(改写后的文法可能含有以ε为右部的产生式)。 三、上机结果 测试数据: (1)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i# (2)输出结果:i+i*i#为合法符号串 (3)输入一符号串如i+i*#,要求输出为“非法的符号串”。 程序清单: #include #include char str[50]; int index=0; void E(); //E->TX; void X(); //X->+TX | e void T(); //T->FY void Y(); //Y->*FY | e void F(); //F->(E) | i int main() /*递归分析*/ { int len; int m;

编译原理实验报告

编译原理实验报告 姓名: 学号: 班级: 学院: 南昌大学信息工程学院计算机系 2014年6月

目录 实验一 (3) 实验二 (8) 实验三 (15)

实验1 词法分析程序的设计 学生姓名:学号:专业班级: 实验类型:□验证□综合□设计□创新实验日期:实验成绩: 一、实验目的 掌握计算机语言的词法分析程序的开发方法。 二、实验内容 编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。 三、实验要求 1、根据以下的正规式,编制正规文法,画出状态图; 标识符<字母>(<字母>|<数字字符>)* 十进制整数0 |(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* 如有余力,则进一步分析八进制和十六进制整数,其正规式如下: 八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 运算符和界符+ - * / > < =<= >=( ) ;{ } 关键字main if then else while do int (可根据需要添加) 2、根据状态图,设计词法分析函数int scan( ),完成以下功能: 1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词, 2)以二元式形式输出单词<单词种类,单词属性> 其中单词种类用整数表示: 0:标识符 1:十进制整数 2:八进制整数 3:十六进制整数 运算符和界符,关键字采用一字一符,不编码 其中单词属性表示如下: 标识符,整数由于采用一类一符,属性用单词表示 运算符和界符,关键字采用一字一符,属性为空 3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。 四、实验环境 PC微机 DOS操作系统或Windows 操作系统 Turbo C 程序集成环境或Visual C++ 程序集成环境

编译原理实验报告《LL(1)语法分析器构造》

《LL(1)分析器的构造》实验报告 一、实验名称 LL(1)分析器的构造 二、实验目的 设计、编制、调试一个LL(1)语法分析器,利用语法分析器对符号串的识别,加深对语法分析原理的理解。 三、实验内容和要求 设计并实现一个LL(1)语法分析器,实现对算术文法: G[E]:E->E+T|T T->T*F|F F->(E)|i 所定义的符号串进行识别,例如符号串i+i*i为文法所定义的句子,符号串ii+++*i+不是文法所定义的句子。 实验要求: 1、检测左递归,如果有则进行消除; 2、求解FIRST集和FOLLOW集; 3、构建LL(1)分析表; 4、构建LL分析程序,对于用户输入的句子,能够利用所构造的分析程序进行分析,并显示出分析过程。 四、主要仪器设备 硬件:微型计算机。 软件: Code blocks(也可以是其它集成开发环境)。 五、实验过程描述 1、程序主要框架 程序中编写了以下函数,各个函数实现的作用如下: void input_grammer(string *G);//输入文法G

//将文法G预处理得到产生式集合P,非终结符、终结符集合U、u, int eliminate_1(string *G,string *P,string U,string *GG);//消除文法G中所有直接左递归得到文法GG int* ifempty(string* P,string U,int k,int n);//判断各非终结符是否能推导为空 string* FIRST_X(string* P,string U,string u,int* empty,int k,int n);求所有非终结符的FIRST集 string FIRST(string U,string u,string* first,string s);//求符号串s=X1X2...Xn的FIRST集 string** create_table(string *P,string U,string u,int n,int t,int k,string* first);//构造分析表 void analyse(string **table,string U,string u,int t,string s);//分析符号串s 2、编写的源程序 #include #include #include using namespace std; void input_grammer(string *G)//输入文法G,n个非终结符 { int i=0;//计数 char ch='y'; while(ch=='y'){ cin>>G[i++]; cout<<"继续输入?(y/n)\n"; cin>>ch; } } void preprocess(string *G,string *P,string &U,string &u,int &n,int &t,int &k)//将文法G预处理产生式集合P,非终结符、终结符集合U、u, { int i,j,r,temp;//计数 char C;//记录规则中()后的符号 int flag;//检测到() n=t=k=0; for( i=0;i<50;i++) P[i]=" ";//字符串如果不初始化,在使用P[i][j]=a时将不能改变,可以用P[i].append(1,a) U=u=" ";//字符串如果不初始化,无法使用U[i]=a赋值,可以用U.append(1,a) for(n=0;!G[n].empty();n++) { U[n]=G[n][0]; }//非终结符集合,n为非终结符个数 for(i=0;i

编译原理实验报告一

实验一词法分析程序实现 一、实验目得与要求 通过编写与调试一个词法分析程序,掌握在对程序设计语言得源程序进行扫描得过程中,将字符流形式得源程序转化为一个由各类单词符号组成得流得词法分析方法 二、实验内容 基本实验题目:若某一程序设计语言中得单词包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符与四个算术运算符,试构造能识别这些单词得词法分析程序(各类单词得分类码参见表I)。 表I语言中得各类单词符号及其分类码表 输入:由符合与不符合所规定得单词类别结构得各类单词组成得源程序文件。 输出:把所识别出得每一单词均按形如(CLASS,VALUE)得二元式形式输出,并将结果放到某个文件中。对于标识符与无符号常数,CLASS字段为相应得类别码得助记符;V AL UE字段则就是该标识符、常数得具体值;对于关键字与运算符,采用一词一类得编码形式,仅需在二元式得CLASS字段上放置相应单词得类别码得助记符,V ALUE字段则为“空". 三、实现方法与环境 词法分析就是编译程序得第一个处理阶段,可以通过两种途径来构造词法分析程序.其一就是根据对语言中各类单词得某种描述或定义(如BNF),用手工得方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应得状态矩阵,该状态矩阵连同控制程序一起便组成了编译器得词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序得另外一种途径就是所谓得词法分析程序得自动生成,即首先用正规式对语言中得各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程

编译原理报告 (2)

课程实验报告课程名称:《编译原理》 专业班级:信息安全1302 学号: 姓名: 指导教师: 报告日期:2015年11月6日 计算机科学与技术学院

目录 目录 (2) 1 实验一词法分析 (3) 1.1实验目的 (3) 1.2实验要求 (3) 1.3算法思想 (4) 1.4实验程序设计说明 (5) 1.5词法分析实现 (6) 1.6词法实验结果及结果分析 (11) 2 实验二语法分析 (12) 2.1 实验目的 (12) 2.2 实验要求 (12) 2.3 算法思想 (12) 2.4 实验程序设计说明 (14) 2.5 语法分析实现 (14) 4 实验中遇到的问题及解决 (22) 参考资料 (23)

1 实验一词法分析 1.1 实验目的 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 1.2 实验要求 1、待分析的简单的词法 (1)关键字: main int char if else for while 所有的关键字都是小写。 (2)运算符和界符 := + -* / < <= <> > >= = == != ; ( ) [ ] { } #(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit* (4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 2、各种单词符号对应的种别码: 表1 各种单词符号对应的种别码

3、词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列: (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)…… 1.3 算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 1、主程序示意图: 主程序示意图如图1所示。其中初始包括以下两个方面: ⑴关键字表的初值。 关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下: Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,}; 开始 置初值 调用扫描子程序 输出单词二元组 否 输入串结束? 是 结束 图1 主程序示意图

实验1-3 《编译原理》词法分析程序设计方案

实验1-3 《编译原理》S语言词法分析程序设计方案 一、实验目的 了解词法分析程序的两种设计方法之一:根据状态转换图直接编程的方式; 二、实验内容 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 三、实验要求 1.能对任何S语言源程序进行分析 在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。 2.能检查并处理某些词法分析错误 词法分析程序能给出的错误信息包括:总的出错个数,每个错误所在的行号,错误的编号及错误信息。 本实验要求处理以下两种错误(编号分别为1,2): 1:非法字符:单词表中不存在的字符处理为非法字符,处理方式是删除该字符,给出错误信息,“某某字符非法”。 2:源程序文件结束而注释未结束。注释格式为:/* …… */ 四、保留字和特殊符号表

编译原理实验指导书

编译原理实验指导 书

《编译原理》实验指导书 太原科技大学计算机学院 -3-1

序 《编译原理》是国内外各高等院校计算机科学技术类专业,特别是计算机软件专业的一门重要专业课程。该课程系统地向学生介绍编译程序的结构、工作流程及编译程序各组成部分的设计原理和实现技术。由于该课程理论性和实践性都比较强,内容较为抽象复杂,涉及到大量的软件设计和算法,因此,一直是一门比较难学的课程。为了使学生更好地理解和掌握编译原理和技术的基本概念、基本原理和实现方法,实践环节非常重要,只有经过上机进行程序设计,才能使学生对比较抽象的教学内容产生具体的感性认识,增强学生综合分析问题、解决问题的能力,并对提高学生软件设计水平大有益处。 为了配合《编译原理》课程的教学,考虑到本课程的内容和特点,本指导书设置了七个综合性实验,分别侧重于词法分析、NFA的确定化、非递归预测分析、算符优先分析器的构造、LR分析、语义分析和中间代码的生成、基于DAG的基本块优化,以支持编译程序的各个阶段,基本涵盖了《编译原理》课程的主要内容。 本指导书可作为《编译原理》课程的实验或课程设计内容,在课程教学的同时,安排学生进行相关的实验。实验平台可选择在MS-DOS或Windows操作系统环境,使用C/C++的任何版本作为开发工具。学生在做完试验后,应认真撰写实验报告,内容应

包括实验名称、实验目的、实验要求、实验内容、测试或运行结果等。

目录 实验一词法分析 ........................................................... 错误!未定义书签。实验二 NFA的确定化.................................................... 错误!未定义书签。实验三非递归预测分析 ............................................... 错误!未定义书签。实验四算符优先分析器的构造................................... 错误!未定义书签。实验五 LR分析 .............................................................. 错误!未定义书签。实验六语义分析和中间代码生成................................ 错误!未定义书签。实验七基于DAG的基本块优化................................... 错误!未定义书签。

编译原理词法分析和语法分析报告 代码(C语言版)

词法分析 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图: 扫描子程序主要部分流程图 其他

词法分析程序的C语言程序源代码: // 词法分析函数: void scan() // 数据传递: 形参fp接收指向文本文件头的文件指针; // 全局变量buffer与line对应保存源文件字符及其行号,char_num保存字符总数。 void scan() { char ch; int flag,j=0,i=-1; while(!feof(fp1)) { ch=fgetc(fp1); flag=judge(ch); printf("%c",ch);//显示打开的文件 if(flag==1||flag==2||flag==3) {i++;buffer[i]=ch;line[i]=row;} else if(flag==4) {i++;buffer[i]='?';line[i]=row;} else if(flag==5) {i++;buffer[i]='~';row++;} else if(flag==7) continue; else cout<<"\n请注意,第"<

编译原理实验报告2

学生学号实验课成绩 武汉理工大学 学生实验报告书 实验课程名称编译原理 开课学院计算机科学与技术学院 指导老师姓名饶文碧 学生姓名 学生专业班级

—学年第学期 实验课程名称:编译原理 实验项目名称单词的词法分析实验成绩 实验者专业班级组别 同组者实验日期 第一部分:实验分析与设计(可加页) 一、实验内容描述(问题域描述) 完成对某一种常用高级语言(如Pascal、C语言、PL/0语言)的各类单词进行词法分析,即对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出。 实验要求: (1)选择常用高级程序设计语言(如 Pascal、C语言、PL/0语言)的源程序作为词法分析对象。 (2)根据教学要求和学生具体情况,从上列语言之一中选取它的一个适当大小的子集,可以选取一类典型单词,也可以尽可能使各种类型的单词都能兼顾到。其基本要求是:对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词,并把其转换成属性字输出。

二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述) #include #include #include #include char *table[7]={" ","main","int","if","then","else","return"},TOKEN[20],ch; //定义关键字 int lookup(char *TOKEN){ //关键字匹配函数 int m,i; for(i=1;i<6;i++){ if((m=strcmp(TOKEN,table[i]))==0) return(i); } return(0); } void out(int c,char *TOKEN){ //输出函数 printf("(%d,%s)\n",c,TOKEN); } void scanner(FILE *fp){ //扫描函数

编译原理-语法分析-算符优先文法分析器

编译原理实验报告 实验名称:编写语法分析分析器实验类型: 指导教师: 专业班级: 学号: 电子邮件: 实验地点: 实验成绩:

一、实验目的 通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。 1、选择最有代表性的语法分析方法,如LL(1) 语法分析程序、算符优先分析程序和LR分析分析程序,至少选一题。 2、选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。 二、实验过程 编写算符优先分析器。要求: (a)根据算符优先分析算法,编写一个分析对象的语法分析程序。读者可根据自己的能力选择以下三项(由易到难)之一作为分析算法中的输入: Ⅰ:通过构造算符优先关系表,设计编制并调试一个算法优先分析程序Ⅱ:输入FIRSTVT,LASTVT集合,由程序自动生成该文法的算符优先关系矩阵。 Ⅲ:输入已知文法,由程序自动生成该文法的算符优先关系矩阵。(b)程序具有通用性,即所编制的语法分析程序能够使用于不同文法以及各种输入单词串,并能判断该文法是否为算符文法和算符优先文法。 (c)有运行实例。对于输入的一个文法和一个单词串,所编制的语法分析程序应能正确地判断,此单词串是否为该文法的句子,并要求输出分析过程。 三、实验结果 算符优先分析器: 测试数据:E->E+T|T T->T*F|F F->(E)|i 实验结果:(输入串为i+i*i+i)

四、讨论与分析 自下而上分析技术-算符优先分析法: 算符文法:一个上下无关文法G,如果没有且没有P→..QR...(P ,Q ,R属于非终结符),则G是一个算符文法。 FIRSTVT集构造 1、若有产生式P →a...或P →Qa...,则a∈FIRSTVT(P)。 2、若有产生式P→...,则FIRSTVT(R)包含在FIRSTVT(P)中。由优先性低于的定义和firstVT集合的定义可以得出:若存在某个产生式:…P…,则对所有:b∈firstVT(P)都有:a≦b。 构造优先关系表: 1、如果每个非终结符的FIRSTVT和LASTVT集均已知,则可构造优先关系表。 2、若产生式右部有...aP...的形式,则对于每个b∈FIRSTVT(P)都有

编译原理课程设计报告(一个完整的编译器)

编译原理程序设计报告 一个简单文法的编译器的设计与实现专业班级:计算机1406班 组长姓名:宋世波 组长学号: 20143753 指导教师:肖桐 2016年12月

设计分工 组长学号及姓名:宋世波20143753 分工:文法及数据结构设计 词法分析 语法分析(LL1) 基于DAG的中间代码优化 部分目标代码生成 组员1学号及姓名:黄润华20143740 分工:中间代码生成(LR0) 部分目标代码生成 组员2学号及姓名:孙何奇20143754 分工:符号表组织 部分目标代码生成

摘要 编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。 一.编译器的概述 1.编译器的概念 编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。源代码一般为高阶语言如Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。 2.编译器的种类 编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语

编译原理实验报告:实验一编写词法分析程序

( 编译原理实验报告 , 实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级:( 13软件四 姓名:丁越 学号: 实验地点:) 秋白楼B720

实验成绩: 日期:2016年 3 月 18 日

一、实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标:[ 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、实验过程 以编写PASCAL子集的词法分析程序为例 1.理论部分 > (1)主程序设计考虑 主程序的说明部分为各种表格和变量安排空间。 数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字后面补空格。 P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中(编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id和ci数组分别存放标识符和常数。 instring数组为输入源程序的单词缓存。 ¥ outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。 ⑵词法分析过程考虑 将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图 1-1。 …

北邮编译原理-词法分析文档和程序

实验报告 班级:14 姓名: oneseven 学号: 一.题目:词法分析程序设计与实现 * 二.实验内容:设计并实现 C 语言的词法分析程序,要求如下。 (1) 可以识别出用C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词符号。 (2) 可以识别并读取源程序中的注释。 (3) 可以统计源程序中的语句行数、单词个数和字符个数,其中标点和空格不计算为单词,并输出统计结果。 (4) 检查源程序中存在的非法字符错误,并可以报告错误所在的行列位置。 三.实现要求:采用C/C++作为实现语言,手工编写词法分析程序。 ; 四.实现功能:基本完成了实验内容中要求的所有功能。(1)识别出源程序中的每个单词符号,并以记号的形式输出每个单词符号(2)识别并读取源程序中的注释(3) 统计源程序中的语句行数、单词个数和字符个数(4) 检查源程序中存在的非法字符错误,并可以报告错误所在的行列位置。 注:本程序未把注释中的单词符号,“”中的单词符号统计在单词个数中。单词个数只包括了标示符,关键字,无符号数。 五.实验原理: 1.词法分析程序的功能: 输入源程序,输出单词符号的记号形式,如图所示: > 源程序词法分析器单词符号的记号形式 词法分析器 2.处理过程:每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。 六.代码

#include #include — #include #include using namespace std; string keyword[32]={"auto","break","case","char","const", .'z': case 'A'...'Z': case '_': word++; — while(isalpha(c)||isdigit(c)||c=='_') { str+=c; get(); } if(c=='@'||c==''||c=='$'||c=='#') { int tag=column; 】 while(isalpha(c)||isdigit(c)||c=='_'||c=='@'||c==''||c=='$'||c=='#') { str+=c; get(); } outf<

编译原理 语法分析器 (java完美运行版)

实验二语法分析器 一、实验目的 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质,为培养适应社会多方面需要的能力。 二、实验内容 ◆根据某一文法编制调试LL (1 )分析程序,以便对任意输入的符号串 进行分析。 ◆构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分 析程序。 ◆分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号 以及LL(1)分析表,对输入符号串自上而下的分析过程。 三、LL(1)分析法实验设计思想及算法 ◆模块结构: (1)定义部分:定义常量、变量、数据结构。 (2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等); (3)控制部分:从键盘输入一个表达式符号串; (4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。

四、实验要求 1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。 2、如果遇到错误的表达式,应输出错误提示信息。 3、对下列文法,用LL(1)分析法对任意输入的符号串进行分析:(1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FS (5)S->*FS|/FS (6)S->ε (7)F->(E) (8)F->i 输出的格式如下:

五、实验源程序 LL1.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.sql.*; import java.util.Vector; public class LL1 extends JFrame implements ActionListener { /** * */ private static final long serialVersionUID = 1L; JTextField tf1; JTextField tf2; JLabel l; JButton b0; JPanel p1,p2,p3; JTextArea t1,t2,t3; JButton b1,b2,b3;

编译原理标准实验报告

电子科技大学 实验报告 学生姓名:学号:指导教师: 实验地点:实验时间: 一、实验室名称:计算机学院软件工程实验室 二、实验项目名称:词法分析器的设计与实现 三、实验学时:4学时 四、实验原理 1.编译程序要求对高级语言编写的源程序进行分析和合成,生成目标程序。词法分析是对源程序进行的首次分析,实现词法分析的程序为词法分析程序。 2.词法分析的功能是从左到右逐个地扫描源程序字符串,按照词法规则识别出单词符号作为输出,对识别过程中发现的词法错误,输出相关信息。 3.状态转换图是有限有向图,是设计词法分析器的有效工具。 五、实验目的 通过设计词法分析器的实验,使同学们了解和掌握词法分析程序设计的原理及相应的程序设计方法,同时提高编程能力。 六、实验内容 实现求n!的极小语言的词法分析程序,返回二元式作为输出。 七、实验器材(设备、元器件) 1.操作系统:Windows XP

2.开发工具:VC6.0 3.普通PC即可 八、实验步骤 (1)启动VC6.0,创建空白工程项目。选择菜单中的“文件”->“新建”->“项目”,在弹出的对话框中,左边的“项目类型”框中,选择“Visual C++ 项目”,在右边框中,选择“空项目(.Net)”,在对话框下边,选择工程文件存放目录及输入名称,如Example1,单击“确定”。 (2)建立相应的单词符号与种别对照表; (3)根据状态转换图编写相应的处理函数; (4)完成词法分析器; (5)编译与调试以上程序; (6)生成相应的*.dyd文件,作为后面语法分析的输入文件。 九、实验数据及结果分析

可以对源程序进行词法分析,如果有错给出出错信息和所在行数,如果无错则生成二元式文件。 十、实验结论 本实验程序较好地完成了词法分析程序的设计与实现,能够对所给文法的程序进行词法分析,在没有词法错误的时候生成相应的二元式文件。该实验程序可一次性给出源程序中的词法错误。 十一、总结及心得体会 通过该实验,对词法分析程序的设计,以及运用C语言进行编程有了更深刻的理解,同时加深了自己对词法分析程序的原理的理解与掌握,提高了自己的动手能力。 十二、对本实验过程及方法、手段的改进建议 程序设计合理,代码可进一步优化。 报告评分: 指导教师签字:

相关主题
文本预览
相关文档 最新文档