当前位置:文档之家› 编译原理课设报告

编译原理课设报告

编译原理课设报告
编译原理课设报告

编译原理

课程设计报告

班级:1612103学号:姓名:

2014-12

一、设计任务

通过编写一个PL/0语言编译器的源代码,加深对编译阶段(包括词法分析、语法分析、语义分析、中间代码生成等)和编译系统软件结构的理解,巩固和加深对编译原理的理解,提高综合运用本课程所学知识的能力。

PL/0语言可以看成PASCAL语言的子集,它的编译程序是一个编译解释执行系统。PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。PL/0的编译程序和目标程序的解释执行程序都是用PASCAL语言书写的,因此PL/0语

言可在配备PASCAL语言的任何机器上实现。使用语法图和扩充的巴克斯范式表示法对PL/0语言的形式描述。

其编译过程采用一趟扫描方式,以语法分析程序为核心,词法分析和代码生成程序都作为一个独立的过程,当语法分析需要读单词时就调用词法分析程序,而当语法分析正确需要生成相应的目标代码时,则调用代码生成程序。

用表格管理程序建立变量、常量和过程标示符的说明与引用之间的信息联系。掌握PL/0语言编译程序的目标程序在运行时数据空间的组织管理。

用出错处理程序对词法和语法分析遇到的错误给出在源程序中出错的位置和错位性质。

当源程序编译正确时,PL/0编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程序的要求输入数据和输出运行结果。

总体来说,就是以PL/0语言编译程序为实例,学习编译程序实现的基本步骤和相关技术,对编译程序的构造和实现得到一些感性认识和建立起整体概念,更加深入了解编译原理的学习。如下图所示。

其中,课程设计要求的相关内容如下:

PL/0语言的BNF描述(扩充的巴克斯范式表示法)

→ program

→ [][][]

→ const {,};

:=

→ var {,};

→ procedure ([{,}]);{;}

→ begin {;}end

:=

|if then [else ]

|while do

|call ([{,}])

|

|read ({,})

|write ({,})

|odd

→ [+|-]{}

{}

||()

→ =|<>|<|<=|>|>=

→ +|-

→ *|/

→ l{l|d} (注:l表示字母)

→ d{d}

注释:

:程序;:块、程序体;:常量说明;:常量;:变量说明;:分程序; :复合语句;:语句;:表达式;:条件;:项; :因子;:加法运算符;:乘法运算符; :关系运算符。

假想目标机的代码

LIT 0 ,a 取常量a放入数据栈栈顶

OPR 0 ,a 执行运算,a表示执行某种运算

LOD L ,a 取变量(相对地址为a,层差为L)放到数据栈的栈顶

STO L ,a 将数据栈栈顶的内容存入变量(相对地址为a,层次差为L)

CAL L ,a 调用过程(转子指令)(入口地址为a,层次差为L)

INT 0 ,a 数据栈栈顶指针增加a

JMP 0 ,a无条件转移到地址为a的指令

JPC 0 ,a 条件转移指令,转移到地址为a的指令

RED L ,a 读数据并存入变量(相对地址为a,层次差为L)

WRT 0 ,0 将栈顶内容输出

其中:F段代表伪操作码

L段代表调用层与说明层的层差值

A段代表位移量(相对地址)

进一步说明:

INT:为被调用的过程(包括主过程)在运行栈S中开辟数据区,这时A段为所需数据单元个数(包括三个连接数据);L段恒为0。

CAL:调用过程,这时A段为被调用过程的过程体(过程体之前一条指令)在目标程序区的入口地址。

LIT:将常量送到运行栈S的栈顶,这时A段为常量值。

LOD:将变量送到运行栈S的栈顶,这时A段为变量所在说明层中的相对位置。

STO:将运行栈S的栈顶内容送入某个变量单元中,A段为变量所在说明层中的相对位置。

JMP:无条件转移,这时A段为转向地址(目标程序)。

JPC:条件转移,当运行栈S的栈顶的布尔值为假(0)时,则转向A段所指目标程序地址;否则顺序执行。

OPR:关系或算术运算,A段指明具体运算,例如A=2代表算术运算“+”;A=12代表关系运算“>”;A=16代表“读入”操作等等。运算对象取自运行栈S 的栈顶及次栈顶。

假想机的结构

两个存储器:存储器CODE,用来存放P的代码

数据存储器STACK(栈)用来动态分配数据空间

四个寄存器:

一个指令寄存器I:存放当前要执行的代码

一个栈顶指示器寄存器T:指向数据栈STACK的栈顶

一个基地址寄存器B:存放当前运行过程的数据区在STACK中的起始地址

一个程序地址寄存器P:存放下一条要执行的指令地址

该假想机没有供运算用的寄存器。所有运算都要在数据栈STACK的栈顶两个单元之间进行,并用运算结果取代原来的两个运算对象而保留在栈顶。

二、功能结构设计

1、总体结构

PL/0的解释执行结构

PL/0编译程序结构

编译程序总体流程图

2、词法分析程序的设计

使用状态转换图实现:

表示状态,对应每个状态编一段程序,每个状态调用取字符程序,

根据当前字符转到不同的状态,并做相应操作。

表示终态,已识别出一个单词。

PL/0的词法分析程序GetSym()是一个独立的过程,其功能是为语法分析提供单词用的,是语法分析的基础,它把输入的字符串形式的源程序分割成一个个单词符号。为此PL/0编译程序设置了三个变量如下:

SYM :存放每个单词的类别,用内部编码形式表示。

ID :存放用户所定义的标识符的值。即标识符字符串的机内表示。

NUM :存放用户定义的数。

单词的种类有五种。

基本字:也可称为保留字或关键字,如BEGIN ,END ,IF ,THEN 等。 运算符:如:+、-、*、/、∶=、#、>=、<=等。

标识符:用户定义的变量名、常数名、过程名。

常数:如:10,25,100等整数。

界符:如:','、'.'、';'、'('、')'等。

如果我们把基本字、运算符、界符称为语言固有的单词,而对标识符、常数称为用户定义的单词。那么经词法分析程序分出的单词,对语言固有的单词只给出类别存放在SYM 中,而对用户定义的单词(标识符或常数)既给类别又给值,其类别放在SYM 中,值放在ID 或NUM 中,全部单词种类由编译程序定义的纯量类型SYMBOL 给出,也可称为语法的词汇表。

词法分析程序GETSYM 将完成下列任务:

(1) 滤空格:空格在词法分析时是一种不可缺少的界符,而在语法分析时则是无用的,所以必须滤掉。

(2) 识别保留字:设有一张保留字表。对每个字母打头的字母、数字字符串要查此表。若查着则为保留字,将对应的类别放在SYM中。如IF对应值IFSYM,THEN对应值为THENSYM。若查不着,则认为是用户定义的标识符。

(3) 识别标识符:对用户定义的标识符将IDENT放在SYM中,标识符本身的值放在ID中。

(4) 拼数:当所取单词是数字时,将数的类别NUMBER放在SYM中,数值本身的值存放在NUM中。

(5) 拼复合词:对两个字符组成的算符

如:>=、∶=、<= 等单词,识别后将类别送SYM中。

(6) 输出源程序:为边读入字符边输出(可输出在文件中)。

由于一个单词往往是由一个或几个字符组成的,所以在词法分析过程GETSYM中又定义了一个取字符过程GETCH(见图2.6),由词法分析需要取字符时调用。

3、语法分析的设计与实现

考虑到PL/0的语法性质,语法分析的方法采用自顶向下的语法分析具体使用递归子程序法来实现PL/0的语法分析,具体方法为:对应每个非终结符语法单元,编一个独立的处理过程(或子程序)。语法分析从读入第一个单词开始,由非终结符<程序>(即开始符)出发,沿语法描述图箭头所指出的方向进行分析。当遇到非终结符时,则调用相应的处理过程,从语法描述图看,也就进入了一个语法单元,再沿当前所进入的语法单元所指箭头方向继续进行分析。当遇到描述图中是终结符时,则判断当前读入的单词是否与图中的终结符相匹配,若匹配,再读取下一个单词继续分析。遇到分支点时,将当前的单词与分支点上多个终结符逐个相比较,若都不匹配时可能是进入下一个非终结符语法单位或是出错。若检测到当前输入的词素不满足语法定义时,提示错误并推出编译程序。

PL/0编译程序的语法分析采用了自顶向下的递归子程序法。

什么是自顶向下的语法分析?

可形象地对该程序自顶向下构造一棵倒挂着的语法分析树,其构造方法是:(1)由开始符号非终结符'程序'作为分析树的根结点,由非终结符'程序'规则的右部为子结点。

(2)对分析树中的每个非终结符结点,选择它规则的一个右部为子结点构造分析树的下一层。

(3)重复(2)直到分析树中的末端结点只有终结符。

(4)若分析树中的末端结点从左到右连接的终结符号串刚好是输入的程序终结符号串,则说明所给程序在语法上是正确的。

可用下面简单的PL/0程序为例构造其语法分析树

语法调用关系图如下:

具体语法结构如图所示:

由于语义分析是嵌套在相关语法分析的处理函数中的具体语句,因此不在此一一列举,以if then [else ]为例,当语法语义正确时,就生成相应语句功能的目标代码。并在code数组中存储相关的目标机代码。当正常执行完上述代码后,按顺序生成相关的目标机代码,并存储到相应的code 数组单元中。

如果一个PL/0语言的单词序列在整个语法分析中,都能逐个得到匹配,直到程序结束符,这时就说所输入的程序是正确的。对于正确的语法分析做相应的语义翻译,最终得出目标程序。语法分析过程中,使用递归子程序法构造语法分析程序时,对文法有一定的要求和限制。此外,从PL/0的语法描述图中可以清楚地看到,当对PL/0语言进行语法分析时,各个非终结符语法单元所对应的分析过程之间必须存在相互调用的关系。这种调用关系可称为PL/0语法的依赖图,在图中箭头所指向的程序单元表示存在调用关系,从图中不难看出这些子程序在语法分析时被直接或间接递归调用。由PL/0语法调用关系图可以看出对分程序和语句为直接递归调用,对表达式为间接递归调用。

注:

PL/0编译程序语法、语义分析的的核心程序是BLOCK过程,在BLOCK过程内又定义了许多嵌套及并列的过程。

在过程BLOCK内对说明部分及程序体部分的分析说明如下:

(1) 说明部分的分析

说明部分的处理任务就是对每个过程的说明对象造名字表,填写所在层次、标识

符的属性和分配的相对位置等。标识符的属性不同时,所需要填写的信息也有所不同。登录信息是调用ENTER过程完成的。

(2) 过程体的分析

程序的主体是由语句构成的。处理完过程的说明后就处理由语句组成的过程体,从语法上要对语句逐句分析。当语法正确时就生成相应语句功能的目标代码。当遇到标识符的引用时就调用POSITION函数查TABLE表,看是否有过正确的定义,若已有,则从表中取相应的有关信息,供代码的生成用。若无定义则出错。

4、错误处理

PL/0编译程序对语法错误的处理采用两种办法:

(1) 对于一些易于校正的错误,如丢了逗号、分号等,则指出出错位置,并加以校正。校正的方式就是补上逗号或分号。

(2) 对某些错误编译程序难于确定校正的措施,为了使当前的错误不致影响整个程序的崩溃,把错误尽量局限在一个局部的语法单位中。这样就需跳过一些后面输入的单词符号,直到读入一个能使编译程序恢复正常语法分析工作的单词为止。

在本次实验课程设计中,不准备在错误处理方面做非常详细的功能实现,只做了简单的错误位置说明和错误实现。

5、目标代码解释执行时的存储分配

解释程序定义了4个寄存器:

(1) I:指令寄存器。存放着当前正在解释的一条目标指令。

(2) P:程序地址寄存器。指向下一条要执行的目标程序的地址(相当目标程序CODE数组的下标)。

(3) T:栈顶寄存器。由于每个过程当它被运行时,给它分配的数据空间(下边称数据段)可分成两部分。

静态部分:包括变量存放区和三个联系单元(联系单元的作用见后)。

动态部分:作为临时工作单元和累加器用。需要时随时分配,用完后立即释放。栈顶寄存器T指出了当前栈中最新分配的单元(T也是数组S的下标)。

(4)B:基址寄存器。指向每个过程被调用时,在数据区S中给它分配的数据段起始地址,也称基地址。

为了实现对每个过程调用时给它分配数据段,也就是对即将运行的过程所需数据段进栈;过程运行结束后释放数据段,即该数据段退栈;以及嵌套过程之间对标识符引用的寻址问题。每个过程被调用时,在栈顶分配三个联系单元,这三个单元存放的内容分别为:

(1) SL:静态链:它是指向定义该过程的直接外过程(或主程序)运行时最新数据段的基地址。

(2) DL:动态链:它是指向调用该过程时正在运行过程的数据段基地址。

(3) RA:返回地址:记录调用该过程时目标程序的断点,即当时的程序地址寄存器P的值。也就是调用过程指令的下一条指令的地址。

数据空间只需以数组CODE存放的只读目标程序和运行时的数据栈S。S是由解释程序定义的一维整型数组。由于PL/0语言的目标程序是一种假想的栈式计算机的汇编语言,仍用PASCAL语言解释执行。解释执行时的数据空间S为栈式计算机的存储空间。遵循后进先出规则,对每个过程(包括主程序)当被调用时,才分配数据空间,退出过程时,则所分配的数据空间被释放。

解释程序根据待翻译的目标机代码(三地址语句代码)中相关的F段中的操作码,L段中调用层与说明层的层差值以及A段中位移量(相对地址),对数据栈stack以及相关寄存器进行操作,当P寄存器(存放下一条要执行的指令地址)为0时结束解释程序,至此编译完成。

三、函数说明

//子程序过程,将下一输入字符读到ch中,搜索指示器前移一个字符位置。void GetChar(char &ch, FILE *fp, int & end)

//子程序过程,检查ch中的字符是否为空白。若是,则调用GetChar直至ch中加入一个非空白字符。

void GetBC(char &ch, FILE *fp, int & end)

//子程序过程,将ch中的字符连接到strToken之后。例如,假定strToken原来的值为“AB”,而ch中存放着'C',经调用Concat后,strToken的值就变味“ABC”void Concat(char* &str, char ch, int &length)

//判断ch中的字符是否为字母

bool IsLetter(char ch)

//判断ch中的字符是否为数字

bool IsDigit(char ch)

//整形函数过程,对strToken中的字符串查找保留字表,若它是一个保留字则返回它的编码,否则0值;

int Reserve(char *strToken)

//子程序过程,将搜索指示器回调一个字符位置,将ch置为空白字符。

void Retract(char &ch, int & end)

//词法分析从文件指针fp所指向文件中start位置处开始,得到一个非空白的词素,并将返回信息

token lexical_analysis(FILE *fp, int &start, int &end)

//调用词法分析子程序,得到下一个词素,并改变搜索指示器的值

void GetSym(FILE *fp, int &start, int &end, token & sym)

bool ProgDo(FILE *fp, int &start, int &end, token &sym);

//对照文法定义中产生式 →program 对从文件指针fp所指向的文件中start位置处开始进行语法分析

bool BlockDo(FILE *fp, int &start, int &end, token & sym);

//对照文法定义中产生式[][][]对从文件指针fp 所指向的文件中start位置处开始进行语法分析并产生相关的目标机代码

bool CondeclDo(FILE *fp, int &start, int &end, token & sym);

//对照文法定义中产生式 →const {,};对从文件指针fp 所指向的文件中start位置处开始进行语法分析并产生相关的目标机代码

bool ConstDo(FILE *fp, int &start, int &end, token & sym);

//对照文法定义中产生式:=

对从文件指针fp所指向的文件中start位置处开始进行语法分析

bool VardeclDo(FILE *fp, int &start, int &end, token & sym);

//对照文法定义中产生式 → var {,};

对从文件指针fp所指向的文件中start位置处开始进行语法分析

bool ProcDo(FILE *fp, int &start, int &end, token & sym);

//对照文法定义中产生式 → procedure

([{,}]);{;}

对从文件指针fp所指向的文件中start位置处开始进行语法分析

bool BodyDo(FILE *fp, int &start, int &end, token & sym);

//对照文法定义中产生式 → begin {;}end

对从文件指针fp所指向的文件中start位置处开始进行语法分析

bool StatementDo(FILE *fp, int &start, int &end, token & sym);

//对照文法定义中的产生式

对从文件指针fp所指向的文件中start位置处开始进行语法分析并产生相关的目标机代码

bool LexpDo(FILE *fp, int &start, int &end, token & sym);

//对照文法定义中产生式 |odd

对从文件指针fp所指向的文件中start位置处开始进行语法分析并产生相关的目标机代码

bool ExpDo(FILE *fp, int &start, int &end, token & sym);

//对照文法定义中产生式 → [+|-]{}

对从文件指针fp所指向的文件中start位置处开始进行语法分析并产生相关的目标机代码

bool TermDo(FILE *fp, int &start, int &end, token & sym);

//对照文法定义中产生式{}

对从文件指针fp所指向的文件中start位置处开始进行语法分析并产生相关的目标机代码

bool FactorDo(FILE *fp, int &start, int &end, token & sym);

//对照文法定义中产生式||()

对从文件指针fp所指向的文件中start位置处开始进行语法分析并产生相关的目标机代码

void Enter(int type,Token sym);

//向符号表中添加一条类型为type,相关信息为结构体中sym信息的符号表记录,并改变相关参数值

int Position(char * name);

//在符号表中搜索名字为name的符号表记录并返回该记录在符号表中的位置

void Gen(op f_tmp, int l_tmp, int a_tmp)

//在code数组中存储操作码为f_tmp,层差值为l_tmp,偏移地址为a_tmp的目标机代码

void Interpret();

//目标代码翻译程序,按顺序解释执行code数组中存储的相关目标机代码

int Base(int l);

//寻找数据段静态链,指向定义直接外层的最新数据段基地址

四、试验体会

说起这次课程设计,我简直太有体会了,觉得想要做好这次课设真是要花很大的功夫。本来最开始做词法分析器和语法分析器觉得不算难,我基本参照书本就很好地完成了,很有成就感,沾沾自喜,觉得自己也不笨嘛。可是没想到到了真正做课设的时候,才明白为什么大家普遍认为编译原理比较难,课堂的知识我都认真听了,所以课本上的习题我可以独立完成,课本知识我也很好地理解了。可是最初看到辅助的PPT时,郁闷至极,因为有些地方看都看不懂。我后来思考了下,觉得问题在于,课程设计考验的是我们对编译原理的整体理解,哪一个地方出现了问题,整个实现都会有问题。而关于理论的理解就相对容易一些。

所以虽然我明白了编译原理中的一些理论,但是所需要的知识远远不够。语义分析、目标代码产生以及代码的解释执行,这才是真正考验人的水准和实力的,而这些相关知识分布在第六、七、八、九章,这部分恰恰很难。另外,对于PPT 上的给的提示看不懂怎么办?很简单,一个字“问”,问同学问老师问大神均可,在我想破头也想不出来的时候,我就没有一个劲的钻死胡同,而是找了能力比较强的同学一起讨论。比如有关PPT上符号表处理以及目标代码产生的有关内容,我看得思维混乱,一头雾水,不耻上问之后总算是明白了怎么构建符号表,怎么处理符号表寻找常量变量等来产生目标机语言。深深觉得同学之间的互助简直太有必要了,可以共同讨论,实现知识的碰撞和思维的火花。

在历经了好几天的艰难跋涉后,开心的是我终于基本做完了。为什么说基本做完了,因为我实现了词法分析、语法分析、语义分析、目标代码产生、代码解释执行的功能(给自己点个赞),可是因为时间不足,还要准备其他考试,故而错误处理方面没有实现得很完善,只是简单输出了错误的性质和位置,不能跳过错误继续执行。

接着,让我来把体会和感受上升到人生的高度。有时候,只要过程尽力了,不管结果怎样,合不合心意,都已经无愧于自己的心了,所以不用给自己多么大的压力,觉得自己不如别人,没有别人优秀。我已经很好了,只不过有些人可能做得更好而已。还有,如果某个时间有几件事同时要做,不要茫然失措,一件一件来,做好一件是一件,很多情况下,困难的不是过程,而是开始,是我们踏出的第一步。这都是这次的经验啊。

总体说来,这次课程设计是我完成的课设中最费脑力的一次了,有趣不很觉得,倒是极大地培养了我的耐心和思维,学会如何将问题抽丝剥茧,一点点分解完成,将书本上抽象的理论知识加上自己的领悟再加上和同学的讨论转化为自己所理解的知识,转化成实际代码。看着自己码出来的代码运行成功很成就,就像看着自己的孩子慢慢长大的欣慰与欣喜。

再谈谈编译原理这门课程本身,我觉得老师教授的很不错,讲的知识条理清晰、易于理解,到后面的难点,也讲得非常细致,我相信同学们只要用心听讲,

认真完成作业,肯定都能学好的,尤其是讲课+讲题的方式,对于难懂的内容和新的知识总是会给我们一定的缓冲时间,老师今后可以继续采用这种授课模式。老师还很负责任,答疑耐心、细致。最让我感动的是,有一次我因为赶着准备某一课程的考试导致编译作业没做完,老师也不咄咄逼人,而是很宽容的让我们下次再交,谢谢老师的宽容。遇见老师真的是我们的幸运,本来想给老师您提些建议的,可是想来想去,这半年以来老师一切做得没什么不好,至少我作为学生的一份子很认可老师的工作,老师您辛苦了!谢谢老师的付出。

五、参考资料

1.冯雁,鲁东明等..课程设计.浙江大学出版社[M].2008-1

2.陈火旺,谭庆平等. 编译原理(第三版)[M].国防工业出版社2008-6

3.Alfred V.Aho ,Monica https://www.doczj.com/doc/d710703604.html,m, Ravi Sethi, Jefftey D.Ullman .Compilers:Principles,

Techniques and Tools(第二版)[M].机械工业出版社2010-4

4.谭浩强.C程序设计(第三版)[M].清华大学出版社2005-7

5.严蔚敏,吴伟民.数据结构(C语言版)[M].清华大学出版社2003-5

编译原理课程设计

《编译原理》课程设计大纲 课程编号: 课程名称:编译原理/Compiler Principles 周数/学分:1周/1学分 先修课程:高级程序设计语言、汇编语言、离散数学、数据结构 适用专业:计算机科学与技术专业、软件工程专业 开课学院,系或教研室:计算机科学与技术学院 一、课程设计的目的 课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,设计题中的问题比平时的练习题要复杂,也更接近实际。编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力。 要求学生在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成算法编制和程序代码的编写。 设计时间: 开发工具: (1) DOS环境下使用Turbo C; (2) Windows环境下使用Visual C++ 。 (3) 其它熟悉语言。 二、课程设计的内容和要求 设计题一:算术表达式的语法分析及语义分析程序设计。 1.目的

通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词 法检查和分析。 2.设计内容及要求: 算术表达式的文法: 〈无符号整数〉∷= 〈数字〉{〈数字〉} 〈标志符〉∷= 〈字母〉{〈字母〉|〈数字〉} 〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉} 〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷= 〈标志符〉|〈无符号整数〉|‘(’〈表达式〉‘)’ 〈加法运算符〉∷= +|- 〈乘法运算符〉∷= *|/ (1) 分别选择递归下降法、算符优先分析法(或简单优 先法)完成以上任务,中间代码选用逆波兰式。 (2) 分别选择LL(1)、LR法完成以上任务,中间代码选 用四元式。 (3) 写出算术表达式的符合分析方法要求的文法,给出 分析方法的思想,完成分析程序设计。 (4) 编制好分析程序后,设计若干用例,上机测试并通 过所设计的分析程序。 设计题二:简单计算器的设计 1.目的 通过设计、编制、调试一个简单计算器程序,加深对语法及语 义分析原理的理解,并实现词法分析程序对单词序列的词法检 查和分析。 2.设计内容及要求 算术表达式的文法:

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

编译原理实验报告实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级: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.实践部分

编译原理课程设计报告_LL(1)分析过程模拟

课程设计(论文)任务书 软件学院学院软件工程专业07-1班 一、课程设计(论文)题目LL(1)分析过程模拟 二、课程设计(论文)工作自 2010 年 6 月 22日起至 2010 年 6月 28 日止。 三、课程设计(论文) 地点: 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)使学生掌握LL(1)模块的基本工作原理; (2)培养学生基本掌握LL(1)分析的基本思路和方法; (3)使学生掌握LL(1)的调试; (4)培养学生分析、解决问题的能力; (5)提高学生的科技论文写作能力。 2.课程设计的任务及要求 1)基本要求: (1)分析LL(1)模块的工作原理; (2)提出程序的设计方案; (3)对所设计程序进行调试。 2)创新要求: 在基本要求达到后,可进行创新设计,如改算法效率。 3)课程设计论文编写要求 (1)要按照书稿的规格打印誊写课程设计论文 (2)论文包括目录、绪论、正文、小结、参考文献、附录等 (3)课程设计论文装订按学校的统一要求完成 4)答辩与评分标准: (1)完成原理分析:20分; (2)完成设计过程(含翻译):40分; (3)完成调试:20分;

(4)回答问题:20分。 5)参考文献: (1)张素琴,吕映芝,蒋维杜,戴桂兰.编译原理(第2版).清华大学出版社 (2)丁振凡.《Java语言实用教程》北京邮电大学出版社 6)课程设计进度安排 内容天数地点 构思及收集资料2图书馆 编程与调试4实验室 撰写论文1图书馆、实验室 学生签名: 2009 年6 月22 日 课程设计(论文)评审意见 (1)完成原理分析(20分):优()、良()、中()、一般()、差();(2)设计分析(20分):优()、良()、中()、一般()、差();(3)完成调试(20分):优()、良()、中()、一般()、差();(4)翻译能力(20分):优()、良()、中()、一般()、差();(5)回答问题(20分):优()、良()、中()、一般()、差();(6)格式规范性及考勤是否降等级:是()、否() 评阅人:职称: 年月日

编译原理课程设计

编译原理课程设计报告 课题名称: C-语言编译器设计(scanner和parser) 提交文档学生姓名: 提交文档学生学号: 同组成员名单:无 指导教师姓名:金军 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间: 2011年 6 月 17 日

1.课程设计目标 设计C-Minus编译器分为scanner和parser两个部分。scanner主要作用是对目标代码进行扫描,列出关键字,变量等内容;parser主要对语法进行分析并生成语法树。 2.分析与设计 ●实现方法:代码用C语言编译而成。其中scanner为手工实现,主要采用switch-case结构实现 状态转换;parser部分采用递归下降分析方法实现。 ●扫描器:C-的词法如下: 1、语言的关键字:i f el se i nt return void while 2、专用符号:+ - * /< <= > >= == != =; , ( ) [ ] { } /* */ 3、其他标记是变量(ID)和数字(NUM),通过下列正则表达式定义: ID = letter letter* NUM = di git digi t* letter = a|..|z|A|..|Z digi t = 0|..|9 4、空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM关键字 5. 注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在 标记内)上,且可以超过一行。注释不能嵌套 其DFA图如下:

分析器:以下为C-的语法规则BNF:

编译原理结课论文

目录

1.绪论 概述 “编译原理”是一门研究设计和构造编译程序原理课程,是计算机各专业的一门重要的专业课。编译原理这门课程蕴含着计算机学科中解决问题的思路和解决问题的方法,对应用软件和系统软件的设计与开发有一定的启发和指导作用。“编译原理”是一门实践性很强的课程,要掌握这门课程中的思想,就必须要把所学到的知识应用于实践当中。而课程设计是将理论与实践相互联系的一种重要方式。 设计目的 课程设计是对学生的一种全面综合素质训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,设计题中的问题比平时的练习题要复杂很多,但也更接近实际。编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构解决问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的能力。 设计题目及要求 基于这个学期所学习的内容以及自己所掌握到的知识,本次我所要设计的题目是赋值语句的四元式生成。

要求: (1)设计语法制导生成赋值语句的四元式的算法; (2)编写代码并上机调试运行通过; (3)输入一赋值语句; (4)输出相应的表达式的四元式; 2.背景知识 语法制导翻译方法 语法制导翻译的方法就是为每个产生式配上一个翻译子程序(称语义动作或语义子程序),并在语法分析的同时执行这些子程序。语义动作是为产生式赋予具体意义的手段,它一方面指出了一个产生式所产生的符号串的意义,另一方面又按照这种意义规定了生成某种中间代码应做哪些基本动作。在语法分析的过程中,当一个产生式获得匹配(对于自顶向下分析)或用于规约(对于自底向上分析)时,此产生式相应的语义子程序就进入工作,完成既定的翻译任务。语法制导翻译分为自底向上语法制导翻译和自顶向下语法制导翻译。 属性文法 属性文法是编译技术中用来说明程序语言语义的工具,也是当前实际应用中比较流行的一种语义描述方法。属性是指与文法符号的类型和值等有关的一些信息,在编译中用属性描述处理对象的特征。属性文法是一种

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

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

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

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

编译原理实验报告

编译原理实验报告 班级 姓名: 学号: 自我评定:

实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 根据教学要求并结合学生自己的兴趣和具体情况,从具有代表性的高级程序设计语言的各类典型单词中,选取一个适当大小的子集。例如,可以完成无符号常数这一类典型单词的识别后,再完成一个尽可能兼顾到各种常数、关键字、标识符和各种运算符的扫描器的设计和实现。 输入:由符合或不符合所规定的单词类别结构的各类单词组成的源程序。 输出:把单词的字符形式的表示翻译成编译器的内部表示,即确定单词串的输出形式。例如,所输出的每一单词均按形如(CLASS,VALUE)的二元式编码。对于变量和常数,CLASS字段为相应的类别码;VALUE字段则是该标识符、常数的具体值或在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串;常数表登记项中则存放该常数的二进制形式)。对于关键字和运算符,采用一词一类的编码形式;由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。另外,为便于查看由词法分析程序所输出的单词串,要求在CLASS字段上放置单词类别的助记符。 三、实现方法与环境 词法分析是编译程序的第一个处理阶段,可以通过两种途径来构造词法分析程序。其一是根据对语言中各类单词的某种描述或定义(如BNF),用手工的方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应的状态矩阵,该状态矩阵同控制程序便组成了编译器的词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序的另外一种途径是所谓的词法分析程序的自动生成,即首先用正规式对语言中的各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程序所应进行的语义处理工作,然后由一个所谓词法分析程序的构造程序对上述信息进行加工。如美国BELL实验室研制的LEX就是一个被广泛使用的词法分析程序的自动生成工具。 总的来说,开发一种新语言时,由于它的单词符号在不停地修改,采用LEX等工具生成的词法分析程序比较易于修改和维护。一旦一种语言确定了,则采用手工编写词法分析程序效率更高。 四、实验设计 1)题目1:试用手工编码方式构造识别以下给定单词的某一语言的词法分析程序。 语言中具有的单词包括五个有代表性的关键字begin、end、if、then、else;标识符;整型常数;六种关系运算符;一个赋值符和四个算术运算符。参考实现方法简述如下。 单词的分类:构造上述语言中的各类单词符号及其分类码表。 表I 语言中的各类单词符号及其分类码表 单词符号类别编码类别码的助记符单词值

编译原理课后答案

第二章 2.3叙述由下列正规式描述的语言 (a) 0(0|1)*0 在字母表{0, 1}上,以0开头和结尾的长度至少是2的01 串 (b) ((ε|0)1*)* 在字母表{0, 1}上,所有的01串,包括空串 (c) (0|1)*0(0|1)(0|1) 在字母表{0, 1}上,倒数第三位是0的01串 (d) 0*10*10*10* 在字母表{0, 1}上,含有3个1的01串 (e) (00|11)*((01|10)(00|11)*(01|10)(00|11)*)* 在字母表{0, 1}上,含有偶数个0和偶数个1的01串 2.4为下列语言写正规定义 C语言的注释,即以 /* 开始和以 */ 结束的任意字符串,但它的任何前缀(本身除外)不以 */ 结尾。 [解答] other → a | b | … other指除了*以外C语言中的其它字符 other1 → a | b | … other1指除了*和/以外C语言中的其它字符 comment → /* other* (* ** other1 other*)* ** */ (f) 由偶数个0和偶数个1构成的所有0和1的串。 [解答]由题目分析可知,一个符号串由0和1组成,则0和1的个数只能有四种情况: x 偶数个0和偶数个1(用状态0表示); x 偶数个0和奇数个1(用状态1表示); x 奇数个0和偶数个1(用状态2表示); x 奇数个0和奇数个1(用状态3表示);所以, x 状态0(偶数个0和偶数个1)读入1,则0和1的数目变为:偶数个0和奇数个1(状态1) x 状态0(偶数个0和偶数个1)读入0,则0和1的数目变为:奇数个0和偶数个1(状态2) x 状态1(偶数个0和奇数个1)读入1,则0和1的数目变为:偶数个0和偶数个1(状态0) x 状态1(偶数个0和奇数个1)读入0,则0和1的数目变为:奇数个0和奇数个1(状态3) x 状态2(奇数个0和偶数个1)读入1,则0和1的数目变为:奇数个0和奇数个1(状态3) x 状态2(奇数个0和偶数个1)读入0,则0和1的数目变为:偶数个0和偶数个1(状态0) x 状态3(奇数个0和奇数个1)读入1,则0和1的数目变为:奇数个0和偶数个1(状态2) x 状态3(奇数个0和奇数个1)读入0,则0和1的数目变为:偶数个0和奇数个1(状态1) 因为,所求为由偶数个0和偶数个1构成的所有0和1的串,故状态0既为初始状态又为终结状态,其状态转换图: 由此可以写出其正规文法为: S0 → 1S1 | 0S2 | ε S1 → 1S0 | 0S3 | 1 S2 → 1S3 | 0S0 | 0 S3 → 1S2 | 0S1 在不考虑S0 →ε产生式的情况下,可以将文法变形为: S0 = 1S1 + 0S2 S1 = 1S0 + 0S3 + 1 S2 = 1S3 + 0S0 + 0 S3 = 1S2 + 0S1 所以: S0 = (00|11) S0 + (01|10) S3 + 11 + 00 (1) S3 = (00|11) S3 + (01|10) S0 + 01 + 10 (2) 解(2)式得: S3 = (00|11)* ((01|10) S0 + (01|10)) 代入(1)式得: S0 = (00|11) S0 + (01|10) (00|11)*((01|10) S0 + (01|10)) + (00|11) => S0 = ((00|11) + (01|10) (00| 11)*(01|10))S0 + (01|10) (00|11)*(01|10) + (00|11) => S0 = ((00|11)|(01|10) (00|11)*(01|10))*((00|1

(重庆理工大学计算机学院)编译原理课程设计报告

编译原理课程设计报告 实验名称编译原理课程设计 班级 学号 姓名 指导教师 实验成绩 2013 年06月

一、实验目的 通过设计、编写和调试,将正规式转换为不确定的有穷自动机,再将不确定的有穷自动机转换为与之等价的确定的有穷自动机,最后再将确定有穷自动机进行简化。 通过设计、编写和调试构造LR(0)项目集规范簇和LR分析表、对给定的符号串进行LR分析的程序,了解构造LR(0)分析表的步骤,对文法的要求,能够从文法G出发生成LR(0)分析表,并对给定的符号串进行分析。 二、实验内容 正规式——>NFA——>DFA——>MFA 1.正规式转化为不确定的有穷自动机 (1)目的与要求 通过设计、编写和调试将正规式转换为不确定的有穷自动机的程序,使学生了解Thompson算法,掌握转换过程中的相关概念和方法,NFA的表现形式可以是表格或图形。 (2)问题描述 任意给定一个正规式r(包括连接、或、闭包运算),根据Thompson算法设计一个程序,生成与该正规式等价的NFA N。 (3)算法描述 对于Σ上的每个正规式R,可以构造一个Σ上的NFA M,使得L(M)=L(R)。 步骤1:首先构造基本符号的有穷自动机。 步骤2:其次构造连接、或和闭包运算的有穷自动机。

(4)基本要求 算法实现的基本要求是: (1) 输入一个正规式r; (2) 输出与正规式r等价的NFA。(5)测试数据 输入正规式:(a|b)*(aa|bb)(a|b)* 得到与之等价的NFA N

(6)输出结果 2.不确定的有穷自动机的确定化 (1)目的与要求 通过设计、编写和调试将不确定的有穷自动机转换为与之等价的确定的有穷自动机的程序,使学生了解子集法,掌握转换过程中的相关概念和方法。DFA的表现形式可以是表格或图形。(2)问题描述 任意给定一个不确定的有穷自动机N,根据算法设计一个程序,将该NFA N变换为与之等价的DFA D。 (3)算法描述 用子集法将NFA转换成接受同样语言的DFA。 步骤一:对状态图进行改造 (1) 增加状态X,Y,使之成为新的唯一的初态和终态。从X引ε弧到原初态结点, 从原终态结 点引ε弧到Y结点。 (2) 对状态图进一步进行如下形式的改变

《编译原理》课程实验报告(词法分析)完整版

《编译原理》课程实验报告 题目词法分析 专业计算机 指导教师签名 华东理工大学信息学院计算机系 2013年4月10日

一.实验序号:《编译原理》第一次实验 二.实验题目:词法分析 三.实验日期:2013.3.27-2013.4.10 四.实验环境(操作系统,开发语言) 操作系统:Windows 开发语言:C 五.实验要求 ●修改词法: 1)将标识符的词法改为“以大写字母或小写字母开头,后面可以跟大写字母 或小写字母或数字或下划线”。 把while ((isalpha(buffer))||(isdigit(buffer)))改成while ((isalpha(buffer))||(isdigit(buffer))||buffer==’_’) 2)将<条件>中的表示相等关系的单词“=”改为“= =” char *relation[6]={"<","<=","=",">",">=","<>"}; 把其中的=改成==即可 3)将原来无小数的数改为可以有小数的数 把while (isdigit(buffer))改成while (isdigit(buffer)||buffer==’.’) ●用C语言开发词法分析程序。读入用PL/0语言编写的测试用例源程序, 将识别出的一个个单词组成单词流依序同时输出到屏幕和文件中。 六.实验步骤 1)根据修改词法后的PL/0语言编写测试用例源程序。 2)用C语言编写词法分析程序。读入PL/0语言的测试用例源程序,进行 词法分析,将识别出的一个个单词组成单词流依序同时输出到屏幕和文 件中。 3)设立断点,单步运行词法分析程序,依次单个输出单词。分析和理解词 法分析程序,解释词法分析程序中的数据和变量变化的原因和输出结果。 七.实验结果(测试用例源程序,运行结果部分截图,词法分析函数主要部分源程序 PL0程序: const a=6,b=81; var x,y; procEdure p; procedure q; x:=2; begin

编译原理课程设计

先简要分析一下语法分析的大致流程: 当有句子要进行处理时,首先要对其进行词法分析来分解出该句子中的每个符号,然后将该句子按照算符优先算法压入归约栈中,如果可以顺利归约,则说明这是一个合法的句子,否则该句子非法。 这里有一个需要考虑的地方,就是如何进行归约。由于文法已经给定,所以我们考虑设计一个文法表,文法表中的内容就是可归约串的种别码的顺序,比如v=E可以表示为9,1,13。这样的话当我们要进行一次归约时,只用按顺序存储最左素短语中符号的种别码,然后拿这个种别码序列与文法表进行匹配,就可知道当前归约需要执行哪些操作。 还有一点需要注意,就是如何对一个表达式进行求值。这里需要我们设计一个二元组的变量名表,这个变量名表可以根据变量的名称来返回变量的数据。变量名表的具体设计见详细设计部分。 由于是简化分析,所以这个程序只考虑整数的处理。 有了上面的分析,可以构造出算符优先分析算法的流程图,如下图所示。

详细设计 (1)词法分析部分 由于词法分析的内容在课程设计1中已经介绍,并且这次的状态转换图与课程设计1中的非常相似,所以这里就不过多介绍。(2)优先关系表 在程序中我们用一个二维数组priTable[][]来存储算符间的优先关系。priTable[a][b]=1表示a>b; 。priTable[a][b]=0表示a=b; 。priTable[a][b]=-1表示a

大学编译原理课程复习试题及答案

编译原理复习材料 选择题 1. 文法S→0S | S1 | 0的语言是( )。 A. { 0 m1m| m >=0 } B. { 0 m1m| m >=1 } C. { 0 m1n | m>=1,n>=0 } D. { 0 m1n | m>=0,n>=1 } 2. 描述程序语言所采用的Ⅲ型文法是( )。 A. 短语文法 B.正规文法 C.上下文无关文法 D.上下文有关文法 3. 状态转换图实现的简单方法是使每个状态结对应( )。 A.一个终结符 B.一个非终结符 C.一段小程序 D.一个函数 4. 规范归约的关键问题是寻找( )。 A. 最左素短语 B.句柄 C.直接短语 D.短语 5. 一个算符文法的任何产生式的右部都不含有两个相继的( )。 A.终结符 B.非终结符 C.终结符和非终结符 D.空字 6. 算符优先分析法的关键在于规定( )。 A.算符优先顺序和结合性质 B.算符优先顺序 C.结合性质 D.终结符和非终结符之间关系 7. 优先函数的优点是( )。 A.形象直观 B.便于进行比较运算 C.语法分析速度快 D.语法分析方法简单 8. 文法符号的属性通常分为( )两类。 A. 共用属性和私有属性 B.固有属性和可变属性 C.语法属性和语义属性 D.综合属性和继承属性 9. 在程序流图中,组成循环的结点序列应满足( ) A. 它们是强连通的 B.它们中间有唯一的入口结点 C.它们中间有一条回边 D.它们是强连通的且有唯一的入 口结点 10. 在利用寄存器R生成T1:=C/B的目标代码同时,还应记录信息( )。 A. C/B在T1中 B. T1在C/B中 C. R含有T1, T1在R中 D. R含有C/B, C/B在R中 1.D 2.B 3.C 4.B 5.B 6.A 7.B 8.D 9.D 10.C

编译原理课程设计词法分析(有代码)

《编译原理》课程 实验报告 题目词法分析 专业计算机科学与技术 班级2013级计双班 学号2013708033 姓名刘畅 指导老师郑瑶 石河子大学信息学院计算机系 2014 年11 月20 日

一. 实验序号:《编译原理》词法分析实验 二. 实验题目:词法分析 三. 实验日期: 2014年11月20日 四. 实验环境(操作系统,开发语言) 操作系统:Windows 开发语言:C 五. 实验要求 1)将标识符的词法改为“以大写字母或小写字母开头或下划线开头,后面 可以跟大写字母或小写字母或数字或下划线”。 2)将<条件>中的表示相等关系的单词“=”改为“= =”;增加用于识别自增、 自减、关系运算符、逻辑运算符及逗号运算符的相关语句。 3)将原来无小数的数改为可以识别整数和小数的数。 4)增加识别字符常量和字符串常量的识别。 5)或按C语言要求编写一个完整的用于识别C语言中各类单词的词法分析 程序。 六. 实验步骤 1)用PL/0语言编写测试用例源程序。用C语言编写词法分析程序。 2)运行词法分析程序,读入PL/0语言的测试用例源程序,进行词法分析。 3)设立断点,单步运行词法分析程序,依次单个输出单词。分析和理解词 法分析程序,解释词法分析程序中的数据和变量变化的原因和输出结果。 4)根据上述“实验要求”修改词法分析程序,同时也应修改PL/0语言测试 用例源程序中的相应的单词。 5)运行修改后的词法分析程序,读入修改后的PL/0语言测试用例源程序, 进行词法分析。 七. 实验结果(测试用例源程序,运行结果截图) 测试用例源程序: const c1=5.61,c2=20,c3='S',c4="abc"; var num1,num2,count,sum1,sum2; procedure func1; var y1,y2; begin y1:=1; y2:=x2 end;

编译原理实验报告总结

学年第学期《编译原理》实验报告 学院(系):计算机科学与工程学院 班级:11303070A 学号:11303070*** 姓名:无名氏 指导教师:保密式 时间:2016 年7 月

目录 1.实验目的 (1) 2.实验内容及要求 (1) 3.实验方案设计 (1) 3.1 编译系统原理介绍 (1) 3.1.1 编译程序介绍 (2) 3.1.2 对所写编译程序的源语言的描述 (2) 3.2 词法分析程序的设计 (3) 3.3 语法分析程序设计 (4) 3.4 语义分析和中间代码生成程序的设计 (4) 4. 结果及测试分析 (4) 4.1软件运行环境及限制 (4) 4.2测试数据说明 (5) 4.3运行结果及功能说明 (5) 5.总结及心得体会 (7)

1.实验目的 根据Sample语言或者自定义的某种语言,设计该语言的编译前端。包括词法分析,语法分析、语义分析及中间代码生成部分。 2.实验内容及要求 (1)词法分析器 输入源程序,输出对应的token表,符号表和词法错误信息。按规则拼单词,并转换成二元形式;滤掉空白符,跳过注释、换行符及一些无用的符号;进行行列计数,用于指出出错的行列号,并复制出错部分;列表打印源程序;发现并定位词法错误; (2)语法分析器 输入token串,通过语法分析,寻找其中的语法错误。要求能实现Sample 语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、do while语句等。 (3)语义分析和中间代码生成 输入token串,进行语义分析,修改符号表,寻找其中的语义错误,并生 成中间代码。要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while 语句、do while语句等。 实验要求:功能相对完善,有输入、输出描述,有测试数据,并介绍不足。3.实验方案设计 3.1 编译系统原理介绍 编译器逐行扫描高级语言程序源程序,编译的过程如下: (1).词法分析 识别关键字、字面量、标识符(变量名、数据名)、运算符、注释行(给人看的,一般不处理)、特殊符号(续行、语句结束、数组)等六类符号,分别归类等待处理。 (2).语法分析 一个语句看作一串记号(Token)流,由语法分析器进行处理。按照语言的文法检查判定是否是合乎语法的句子。如果是合法句子就以内部格式保存,否则报错。直至检查完整个程序。 (3).语义分析 语义分析器对各句子的语法做检查:运算符两边类型是否相兼容;该做哪些类型转换(例如,实数向整数赋值要"取整");控制转移是否到不该去的地方;是

编译原理课设报告2

编译原理课程设计题目:pl/0编译程序的改进与完善 学生所在学院:信息科学与工程学院 学生所在班级:06级计算机软件1班 学生姓名: 学生学号: 指导教师:张世辉

一、课设目的: 1.阅读、研究、改进、设计和调试一个简单的编译程序; 2.加深对编译程序理论和编译过程的理解。 二、课设内容: 1扩充语句for(<语句>;<条件>;<语句>)<语句>; 2扩充语句if <条件> then <语句> else <语句>; 3扩充语句repeat <语句>;until <条件>; 4增加自增自减运算++和—和+=,-=运算; 5修改不等号#,为!=; 6增加一维数组 声明格式:[/:/]; 赋值格式:[]:=<表达式>; 调用格式:[] 三、程序结构: PL/0源程序 图1 编译程序结构图2功能模块调用

1.各功能模块的作用: Pl0.c:主程序 Error:出错处理,打印出错位置和错误编码 Getsym:词法分析,读取一个单词 Getch:漏掉空格,读取一个字符 Gen:生成目标代码,并送入目标程序区 Test:测试当前当前符号是否合法 Block:分程序分析处理过程,词法语法分析 Enter:登陆名字表 Position:查找标识符在名字表中的位置 Constdeclaration:常量定义处理 Vardeclaraction:变量说明处理 Listcode:列出目标代码清单 Statement:语句处理 Expression:表达式处理 Term:项处理 Factor:因子处理 Condition:条件处理 Interpret:对目标代码的解释执行程序 Base:通过静态链求出数据取得基地址 增加两个功能: Arraydeclaration:数组声明处理 Arraycoef:数组索引计算和“虚拟机”动作生成 2.保留字: enum symbol {nul, ident, number, plus, minus, times, slash, oddsym, eql, neq, lss, leq, gtr, geq, lparen, rparen, comma, semicolon, period, becomes, beginsym, endsym, ifsym, thensym,elsesym, forsym, inc, dec, whilesym, writesym, readsym, dosym, callsym, constsym,varsym, procsym, repeatsym, untilsym, plusbk, minusbk, lbrack, rbrack, colon,} 共43个,其中补充保留字为:else, for, repeat, until, plusbk, minusbk,

编译原理-课程设计报告-简单编译器实现-精品

课程设计 题目:简单编译器实现 学院:信息工程学院计算机系专业:计算机科学与技术班级:计科1103班 组长: 小组成员: 指导教师: 2014 年12 月19 日

目录 1 概述 (3) 1.1源、目标语言简介 (3) 1.2实现平台与运行平台简介 (3) 1.3其它 (4) 2简单词法分析器的设计与实现 (4) 2.1 基础理论说明 (4) 2.2 需求分析 (4) 2.3 概要设计 (5) 2.4 详细设计 (5) 2.5 测试数据与结果 (7) 2.6 心得体会 (7) 3 简单语法分析器设计与实现 (8) 3.1 基础理论说明 (8) 3.2 需求分析 (8) 3.3 概要设计 (8) 3.4 详细设计 (8) 3.5 测试数据与结果 (9) 3.6 心得体会 (10) 4 中间代码产生器的设计与实现 (10) 4.1 基础理论说明 (10) 4.2 需求分析 (10) 4.3 概要设计 (10) 4.4 详细设计 (11) 4.5 测试数据与结果 (12) 4.6 心得体会 (12) 附录: (14) 附录A:主要源程序与系统截图 (14) 附录B:任务分配表及个人完成的程序模块 (33) 附录C:小组讨论与研发记录 (34)

编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。由编译程序的五个阶段就对应了编译系统的结构。 其中词法分析器利用超前搜索、状态转换等方法,将源程序转化成为一个一个的单词符号二元式。一般程序语言的单词符号包括关键字、运算符、常数、标识符和界符。语法分析器将这些单词符号作为输入,对它进行语法分析。语法分析分为两种方法:自上而下分析法和自下而上分析法。针对不同程序语言的语法规则可以采取不同的分析方法,当然两种方法也可以同时使用。语法分析器把语法单元作为输入供语义分析器使用。一般的语义分析器主要采用的是语法制导方法,即在语法分析的同时进行语法分析,并产生一定的语义动作,来生成中间代码。上面三个过程可以与硬件无关,而接下来的优化器和目标代码生成器是针对某一种处理器而言的。代码优化是将语义分析生成的中间代码进行优化,产生执行效率更高的代码。目标代码生成器最终生成可以在某种机器上运行的机器语言或者汇编语言。在整个编译过程中还包括对表格的操作和对错误的处理,这些也都是非常重要的环节。 1.1源、目标语言简介 使用C语言做简单语法分析器,C语言是一门高级计算机编程语言,设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言 1.2实现平台与运行平台简介 在win32环境下进行编译,Win32是指Microsoft Windows操作系统的32位环境,是目前使用最多的操作系统。 实验环境:需要TC、VC++ 6.0等开发工具作为本次试验的环境。

编 译 原 理 实 验 报 告

编译原理实验报告 课程:编译原理 系别:计算机系 班级:11网络 姓名:王佳明 学号:110912049 教师:刘老师 实验小组:第二组 1

实验一熟悉C程序开发环境、进行简单程序的调试 实验目的: 1、初步了解vc++6.0环境; 2、熟悉掌握调试c程序的步骤: 实验内容: 1、输入下列程序,练习Turbo C 程序的编辑、编译、运行。 #include main() { printf(“Programming is fun.\n”); } 2、分析程序,预测其运行结果,并上机检测你的预测。 #include main() { printf(“*\n”); printf(“* * *\n”); printf(“* * * * *\n”); printf(“* * * * * * *\n”); } 3、下面是一个加法程序,程序运行时等待用户从键盘输入两个整数,然后求出它们的和并输出。观察运行结果(程序输出),上机验证该程序。 #include main() { int a,b,c; printf(“Please input a,b:”); scanf(“%d,%d”,&a,&b); c=a+b; printf(“%d+%d=%d\n”,a,b,c); } 2

实验二词法分析器 一、实验目的: 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。 二、实验要求: 1.对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。 2.本程序自行规定: (1)关键字"begin","end","if","then","else","while","write","read", "do", "call","const","char","until","procedure","repeat" (2)运算符:"+","-","*","/","=" (3)界符:"{","}","[","]",";",",",".","(",")",":" (4)其他标记如字符串,表示以字母开头的标识符。 (5)空格、回车、换行符跳过。 在屏幕上显示如下: ( 1 , 无符号整数) ( begin , 关键字) ( if , 关键字) ( +, 运算符) ( ;, 界符) ( a , 普通标识符) 三、使用环境: Windows下的visual c++6.0; 四、调试程序: 1.举例说明文件位置:f:、、11.txt目标程序如下: begin x:=9 if x>0 then x:=x+1; while a:=0 do 3

编译原理实验报告一

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

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