编译原理上机报告

编译原理上机报告
编译原理上机报告

《编译原理》课程实验指导书

目录

序言_______________________________________________________________ 2实验一设计实现简单语言的词法分析器_______________________________ 3实验二设计实现简单语言的语法分析器______________________________ 17

序言

编译原理实验环节,主要通过对编译器的两个重要模块-词法和语法模块编程调试实现,使学生能应用编译原理的基本理论和方法,学会用C/C++高级程序设计语言设计词法分析器和语法分析器,加深对编译原理理论的分析理解,巩固所学知识,培养和提高学生的动手实践能力。

实验一设计实现简单语言的词法分析器

1、实验目的

通过该实验,熟练应用编译原理关于词法分析的基本理论和方法;学会用C/C++高级程序设计语言设计一个词法分析器;加深对编译原理理论的分析理解,提高实际操作和解决具体问题的能力。

2、实验条件

计算机上安装C/C++编译处理软件。

3、实验内容及要求

对下述单词表定义的语言设计编制一个词法分析器。单词符号及种别表和词法分析器功能及基本要求如下:

(2)词法分析器功能及基本要求

处理用户提交的符合上述词法的源代码序列,进行词法分析,并输出单词二元组。

4、主要参考步骤

(1)画出识别上述语言单词的状态转换图

(2)用C/C++语言编写词法分析程序(应考虑能被语法分析程序调用)

(3)预处理,去除注释、多余空格、Tab字符、回车换行符等

(4)设计若干用例,上机测试并通过所设计实现的词法分析器

1.+++-123.456e-127*+45.99e+200++abc+-cnt++49

2.(+12

3.456+-456.789e-120)*m2+(a++456)*-c123

3.++4+1.4

4.a+-149+49.7e+127+m123

5.x=a++1.27e+18

6.--20+-124.987e+127+-xyz

begin if(x>=-1.27e-18) xyz=(x1+y1)* -124.987e+127

7.--20+-124. e+111-137++569.246e+(123+ivar);

x=1;if(x>1) y=1234; x=(123+abc); (本例应有出错信息)

5、思考

数字的正负号与运算符加减如何处理,识别数字的DFA怎样和运算符加减等融合在一起,进而指导词法分析器的程序编写。

6、实验报告提交格式

(1)总体设计思想

先定义一个结构体用于存放单词的种别编码和单词符号,定义一个输入缓冲区字符数组,一个单词缓冲区字符数组,定义scaner()函数,通过结构体定义一个myword对象,运用m_getch()函数读取输入的一个字符,并判断是否为数字,字母,或符号,通过concat()函数将数字或字母的整体进行连接,每识别一个单

词就返回给WORD结构体,并在主函数中输出单词的种别编码和符号,直到所有的单词全部识别完。

(2)详细算法设计

1.通过m_getch()函数读入一个字符,然后判断是否为字母,如果是字母,就继续读入,判断下一个字符是否为字母或数字,如果是,就用concat()连接到一起,并返回种别编码10和连接后的单词;如果字母单词与关键字字表中的相同,就返回关键字和对应的编码。

WORD* scaner(){

WORD* myword = new WORD;

myword->typenum = 10;

myword->word="";

p_token = 0;

m_getch();

getbc();

if(letter()){

while(letter()||digit()){

concat();

m_getch();

}

retract();

myword->typenum = reserve();

myword->word = token;

return(myword);

}

2.判断读入的字符是否为数字,如果是就连接并存入token数组,继续判断读入的字符是否是‘.’或‘e’,如果是‘.’继续连接,并判断后面是否为数字,如果是,继续连接,并判断是否读入了字符‘e’,如果是,继续连接,并将后面的‘+’,‘-’,和数字继续连接,并存入结构体,返回编码20和数字单词,如果‘.’后面不是数字则输出错误;如果在读入一段数字后字符是‘e’,连接后将后面的‘+’,‘-’,和数字继续连接,并存入结构体,返回编码20和数字单词。

else if(digit()){

concat();

m_getch();

while(digit()){

concat();

m_getch();}

if(ch=='.'){

concat();

m_getch();

if(letter()||ch==' '){

printf("出错\n");

myword->typenum = 0;

myword->word = "错误";

return(myword);}

else if(digit()){

concat();

m_getch();

while(digit()){

concat();

m_getch();}

if(ch==NULL){

retract();

myword->typenum = 20;

myword->word = token;

return(myword);}

else if(ch=='e'){

concat();

m_getch();

if(ch=='+'||ch=='-'){

concat();

m_getch();

if(digit()){

concat();

m_getch();

while(digit()){

concat();

m_getch();}

retract();

myword->typenum = 20;

myword->word = token;

return(myword);}}

else if(digit()){

concat();

m_getch();

while(digit()){

concat();

m_getch();}

retract();

myword->typenum = 20;

myword->word = token;

return(myword);}}}}

else if(ch=='e'){

concat();

m_getch();

if(ch=='+'||ch=='-'){

concat();

m_getch();

if(digit()){

concat();

m_getch();

while(digit()){

concat();

m_getch();}

retract();

myword->typenum = 20;

myword->word = token;

return(myword);}}

else if(digit()){

concat();

m_getch();

while(digit()){

concat();

m_getch();}

retract();

myword->typenum = 20;

myword->word = token;

return(myword);}}

retract();

myword->typenum = 20;

myword->word = token;

return(myword);}

3.通过对输入不同的符号进行判断,并返回对应的种别编码和符号单词,如果输入的是“/*------*/”则判定为注解,如果输入的是“/*”或“/*----*”则判定为输入错误并返回-1;如果输入的是‘!’而不是“!=”也判定为错误。retract();

myword->typenum = 23;

myword->word="-";

return(myword);

break;

case'*':myword->typenum = 24;

myword->word="*";

return(myword);

break;

case'/':m_getch();

if(ch=='*'){

m_getch();

for(;;){

m_getch();

if(ch=='*'){

m_getch();

if(ch=='/'){

myword->typenum = 0;

myword->word="注解";

return(myword) ;

break;}

else

printf("输入错误:\n");

myword->typenum = -1;

myword->word="错误";

return(myword) ;

break;}}}

myword->typenum = 25;

myword->word="/";

return(myword);

break;

case'(':myword->typenum = 26;

myword->word="(";

return(myword);

break;

case')':myword->typenum = 27;

myword->word=")";

return(myword);

break;

case'{':myword->typenum = 28;

myword->word="{";

return(myword);

break;

case'}':myword->typenum = 29;

myword->word="}";

return(myword);

break;

case',':myword->typenum = 30;

myword->word=",";

return(myword);

break;

case';':myword->typenum = 31;

myword->word=";";

return(myword);

break;

case'>':m_getch();

if(ch=='='){

myword->typenum = 33;

myword->word=">=";

return(myword);}

retract();

myword->typenum = 32;

myword->word=">";

return(myword);

break;

case'<':m_getch();

if(ch=='='){

myword->typenum = 35;

myword->word="<=";

return(myword);}

retract();

myword->typenum = 34;

myword->word="<";

return(myword);

break;

case'!':m_getch();

if(ch=='='){

myword->typenum = 37;

myword->word="!=";

return(myword);}

retract();

myword->typenum = -1;

myword->word="ERROR";

return(myword);

break;

case'\0':myword->typenum=1000;

myword->word="OVER";

return(myword);

break;

default: myword->typenum=-1;

myword->word="ERROR";

return(myword);}}

(3)流程框图和状态图

(4)函数相关说明

主函数:

void main(){

int over =1;

WORD* oneword=new WORD;

printf("Enter Your words(end with #):");

scanf("%[^#]s",input);

p_input=0;

printf("Your words:\n%s\n",input);

while(over<1000&&over!=-1){

oneword = scaner();

if(oneword->typenum<1000)

printf("(%d,%s)\n",oneword->typenum,oneword->word);

over=oneword->typenum;}

printf("\npress # to exit:");

scanf("%[^#]s",input);}

从缓冲区读一个字符函数;

char m_getch(){

ch = input[p_input];

p_input = p_input+1;

return(ch);}

去掉空白符号函数:

void getbc(){

while(ch==' '||ch==10){

ch=input[p_input];

p_input = p_input+1;}}

拼接单词函数:

void concat(){

token[p_token]=ch;

p_token = p_token+1;

token[p_token] = '\0';}

判断是否为字母函数:

int letter(){

if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')

return 1;

else return 0;}

判断是否为数字函数:

int digit(){

if(ch>='0'&&ch<='9')

return 1;

else return 0;}

检索是否为关键字:

int reserve(){

int i = 0;

while(strcmp(rwtab[i],_END)){

if(!strcmp(rwtab[i],token)){

return i+1;}

i=i+1;}

return 10;}

回退一个字符函数:

void retract(){

p_input = p_input-1;}

(5)输入与输出(包括出错处理)

输入:所给文法的源程序字符串。

输出:二元组构成的序列。(syn,token或sum)

其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。出错处理:

(6) 程序运行结果(屏幕截图)

1.+++-123.456e-127*+45.99e+200++abc+-cnt++49

2.(+12

3.456+-456.789e-120)*m2+(a++456)*-c123

3.++4+1.4

4.a+-149+49.7e+127+m123

5.x=a++1.27e+18

6.--20+-124.987e+127+-xyz

begin if(x>=-1.27e-18) xyz=(x1+y1)* -124.987e+127

7.--20+-124. e+111-137++569.246e+(123+ivar);

x=1;if(x>1) y=1234; x=(123+abc); (本例应有出错信息)

(7)词法分析器使用说明

运行程序,提示“Enter Your words(end with #):”,输入要分析的语句或词语,输入完后再末尾加上“#”,回车,在屏幕上显示刚输入的词语或语句,然后程序对词语逐个分析,返回并显示每个词语的单词符号和种别编码,分析完毕后,输入“#”结束程序。

(8)心得与体会

本次的编译原理上机实验,让我对语言有了新的认识,运用语言来编写程序,

也能运用语言来对每个文法中的单词进行分析,并输出每个单词的种别编码,通过词法分析器的设计,对每个单词的字符读入,连接和存取有了新的方法来实现,通过对全局变量指针的修改来实现对不同位置的字符进行操作,也发现了自己C 语言知识掌握的不全,在用多个if和else if语句进行判别时,括号的错误编写导致判断的错误,花了大量的时间来检查和修改,在多个地方需要进行相同判别时,是直接复制,导致代码的多和繁琐,也让程序运行效率变低。虽然不容易完成,但还是慢慢学会了解决,通过自己完成问题。

(9)源程序清单

#include

#include

#include

#define_END"ending"

typedef struct{

int typenum;

char *word;}WORD;

char input[255];

char token[255]="";

int p_input;

int p_token;

char ch;

char*

rwtab[]={"main","int","float","double","char","if","else","do","while ",_END};

WORD* scaner();

void main(){

int over =1;

WORD* oneword=new WORD;

printf("Enter Your words(end with #):");

scanf("%[^#]s",input);p_input=0;

printf("Your words:\n%s\n",input);

while(over<1000&&over!=-1){

oneword = scaner();

if(oneword->typenum<1000)

printf("(%d,%s)\n",oneword->typenum,oneword->word);

over=oneword->typenum;}printf("\npress # to

exit:");scanf("%[^#]s",input);}

实验二设计实现简单语言的语法分析器

1、实验目的

通过该实验,熟练应用编译原理关于语法分析的基本理论和方法;学会用C/C++高级程序设计语言设计一个语法分析器;加深对编译原理理论的分析理解,提高实际操作和解决具体问题的能力。

2、实验条件

计算机上安装C/C++编译处理软件。

3、实验内容及要求

对下述单词表与语法定义的语言设计编制一个语法分析器。单词符号及种别表、语法及语法分析器功能、基本要求如下:

(2)语法结构定义

<表达式> ::= <项>{ +<项>|-<项>}

<项> ::= <因子>{*<因子>|/<因子>}

<因子> ::=ID|num|(<表达式>)

num::=( +|-|ε) 数字数字*(.数字数字* | ε)( e ( +|-|ε) 数字数字*|ε)

ID::=字母(字母|数字)*

字母::=a|b|c…|z|A|B|C…|Z

数字::=0|1|2…|9

(3)语法分析器功能及基本要求

处理用户提交的符合上述文法的源代码序列,进行语法分析,并给出语法是否正确的结论。

4、主要参考步骤

在实验一的基础上,将词法分析器改造成为可以被语法分析器调用的形式,相关全局变量改为局部变量,采用函数参数和返回值作为调用程序和被调用程序之间传递数据的主要方法。

(1)设计实现语法分析程序(调用实验一编写调试好的词法程序分析单词)

(2)设计若干用例,上机测试并通过所设计实现的语法分析器

1.

/* this test program*/

x

=

1

;

if (x>1) y=1234;

/* if statement here

then go to end statement */

x=(123 + abc );

2.

x=1;if(x>1) y=1234; x=(123+abc);

3.

main(int argc,char *argv[]){

if (x>=y) x=123.789e+127++987.56-xyz;

else xyz=-123+-123;

do {

i=i+1;

x=a+-1.27e-18;

}while (i>10);

}

5、思考

语法阶段发生的错误和词法阶段发生的错误,有的为什么看起来视乎差不多?为什么要在两个不同的阶段来处理类似问题。

6、实验报告提交格式

(1)总体设计思想

(2)详细算法设计

(3) 流程框图

(4) 函数相关说明

(5)输入与输出(包括出错处理)

(6) 程序运行结果(屏幕截图)

(7) 语法分析器使用说明

(8) 心得与体会

(9) 源程序清单

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

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

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

语义分析实验报告 一、实验目的: 通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。 二、实验要求: 采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 三、算法思想: 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);

编译原理实验报告

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

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

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

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

编译原理实验报告

学生学号0120810680316 实验课成绩 武汉理工大学 学生实验报告书 实验课程名称《编译原理》 开课学院计算机科学与技术学院 指导老师姓名何九周 学生姓名刘洋 学生专业班级软件工程0803 2010 —2011 学年第二学期

实验课程名称:编译原理 实验项目名称单词的词法分析程序设计实验成绩实验者刘洋专业班级软件0803 组别 同组者实验日期 2011 年 5 月 17日 第一部分:实验分析与设计(可加页) 一、实验内容描述(问题域描述) 实验目的: 设计,编制并调试一个词法分析程序,加深对词法分析原理的理解。 实验要求: 在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成算法编制和程序代码的编写;上机时应随带有关的高级语言教材或参考书;要学会程序调试与纠错;每次实验后要交实验报告。 实验题目: 对于给定的源程序(如C语言或Pascal等),要求从组成源程序的字符行中寻找出单词,并给出它们的种别和属性——输出二元组序列。以便提供给语法分析的时候使用。要求能识别所有的关键字,标志符等,并且能够对出先的一些词法规则的错误进行必要的处理。 二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或 者算法描述) 实验原理: 由于这是一个用高级语言编写一个词法分析器,使之能识别输入串,并把分析结果(单词符号,标识符,关键字等等)输出.输入源程序,输入单词符号,本词法分析器可以辨别关键字,标识符,常数,运算符号和某些界符,运用了文件读入来获取源程序代码,再对该源程序代码进行词法分析,这就是词法分析器的基本功能.当词法分析器调用预处理子程序处理出一串输入字符放进扫描缓冲区之后,分析器就从此缓冲区中逐一识别单词符号.当缓冲区里的字符串被处理完之后,它又调用预处理子程序来处理新串. 编写的时候,使用了文件的输入和输出,以便于词法分析的通用型,同时在文件输出时,并保存在输出文件output文件中。 从左到右扫描程序,通过初始化:1为关键字;2为标志符; 3为常数;4为运算符或界符。 三、主要仪器设备及耗材 计算机

编译原理实验题目及报告要求

编译原理上机实验试题 一、实验目的 通过本实验使学生进一步熟悉和掌握程序设计语言的词法分析程序的设计原理及相关的设计技术, 如何针对确定的有限状态自动机进行编程序;熟悉和 掌握程序设计语言的语法分析程序的设计原理、熟悉 和掌握算符优先分析方法。 二、实验要求 本实验要求:①要求能熟练使用程序设计语言编程;②在上机之前要有详细的设计报告(预习报告); ③要编写出完成相应任务的程序并在计算机上准确 地运行;④实验结束后要写出上机实验报告。 三、实验题目 针对下面文法G(S): S→v = E E→E+E│E-E│E*E│E/E│(E)│v │i 其中,v为标识符,i为整型或实型数。要求完成 ①使用自动机技术实现一个词法分析程序; ②使用算符优先分析方法实现其语法分析程序,在 语法分析过程中同时完成常量表达式的计算。

1、题目(见“编译原理---实验题目.doc,“实验题目”中的第一项) 2、目的与要求(见“编译原理---实验题目.doc”) 3、设计原理: (1)单词分类:标识符,保留字,常数,运算符,分隔符等等 (2)单词类型编码 (3)自动机 4、程序流程框图 5、函数原型(参数,返回值) 6、关键代码(可打印,只打印关键代码) 7、调试: (1)调试过程中遇到的错误,如何改进的; (2)需要准备测试用例(至少3个,包含输入和输出)——(可打印) 8、思考: (1)你编写的程序有哪些要求是没有完成的,你觉得该采用什么方法去完成; (2)或者是你觉得程序有哪些地方可以进一步完善,简述你的完善方案。

1、题目(见“编译原理---实验题目.doc,“实验题目”中的第二项) 2、目的与要求(见“编译原理---实验题目.doc”) 3、设计原理:构造出算法优先关系表 4、程序流程框图 5、函数原型(参数,返回值) 6、关键代码(可打印,只打印关键代码) 7、调试: (1)调试过程中遇到的错误,如何改进的; (2)需要准备测试用例(至少3个,包含输入和输出)——(可打印) 8、思考: (1)你编写的程序有哪些要求是没有完成的,你觉得该采用什么方法去完成; (2)或者是你觉得程序有哪些地方可以进一步完善,简述你的完善方案。

编译原理实验报告一

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

《编译原理(实验部分)》实验1_程序预处理

《编译原理》(实验部分) 实验1_程序预处理 一、实验目的 明确预处理子程序的任务,构造一个简单的预处理子程序,对源程序进行相应的预处理。 二、实验设备 1、PC 兼容机一台;操作系统为WindowsWindowsXP。 2、Visual C++ 6.0 或以上版本, Windows 2000 或以上版本,汇编工具(在Software 子目录下)。 三、实验原理 定义模拟的简单语言的词法构成,编制读入源程序和进行预处理的程序,要求将源程序读入到文件或存入数组中,再从文件或数组中逐个读取字符进行预处理,包括去掉注释、Tab、Enter和续行符等操作,并显示预处理后的程序。 四、实验步骤 1、从键盘读入源程序存放到输入缓冲区中。 2、对源程序进行预处理,预处理后的程序存放到扫描缓冲区中。 3、显示预处理后的程序。 参考源程序(C++语言编写) //源程序的输入及预处理 #include #include void pro_process(char *); void main( ) //测试驱动程序

{ //定义扫描缓冲区 char buf[4048]={'\0'}; //缓冲区清0 //调用预处理程序 pro_process(buf); //在屏幕上显示扫描缓冲区的内容cout<='A' && cur_c<='Z') //大写变小写 cur_c+=32; if(cur_c =='\t' || cur_c =='\n') //空格取代TAB换行 cur_c=' '; buf[i++]=cur_c ;

编译原理上机报告

编译原理上机报告 组员: 班级: 一、上机题目: 实现一个简单的语言(Core Programming Language,CPL)的编译器(解释器)(或者其他自己想完成的编译器) 二、上机目的 加深编译原理基础知识的理解:词法分析、语法分析、语法制导翻译等 加深相关基础知识的理解:数据结构、操作系统等 提高编程能力 锻炼独立思考和解决问题的能力 三、上机要求

1、功能要求 接收以CPL编写的程序,对其进行词法分析、语法分析、语法制导翻译等,然后能够正确的执行程序 2、验收要求 条件: 1.完成CPL词法分析器; 2.完成CPL语法分析器; 3.完成CPL语法制导翻译; 方法: 1.演示程序的功能; 2.解释程序的源代码; 四,基本步骤 1.分别配置Parser Generator、Visual C++; 2.使用Parser Generator创建一个工程number 编写l文件mylexer.l; 编译mylexer.l,生成mylexer.h与mylexer.c; 3.安装Parser Generator、Visual C++; 4.使用VC++创建Win32 Console Application工程number 配置该项目;

加入mylexer.h与mylexer.c,编译工程; 执行标识符数字识别器; 注意:每次修改l文件后,需要重新编译l文件,再重新编译VC工程五、工具: 编译器:Visual C++,Eclipse Lex与Yacc:Parser Generator(支持C/C++/Java,带实例) 或者其他自己擅长的语言和环境 六、相关介绍 1、Core Programming Language(CPL) 数据类型:整型变量(常量),布尔变量(常量) 取值范围{…, -2, -1, 0, 1, 2, …}, {true, false} 运算表达式:简单的代数运算,布尔运算 程序语句:赋值表达式,顺序语句,if-else语句,while语句

编译原理实验代码

[实验任务] 完成以下正则文法所描述的Pascal语言子集单词符号的词法分析程序。 <标识符>→字母︱<标识符>字母︱<标识符>数字 <无符号整数>→数字︱<无符号整数>数字 <单字符分界符> →+ ︱-︱* ︱; ︱(︱) <双字符分界符>→<大于>=︱<小于>=︱<小于>>︱<冒号>=︱<斜竖>* <小于>→< <等于>→= <大于>→> <冒号> →: <斜竖> →/ 该语言的保留字:begin end if then else for do while and or not 说明:1 该语言大小写不敏感。 2 字母为a-z A-Z,数字为0-9。 3可以对上述文法进行扩充和改造。 4 ‘/*……*/’为程序的注释部分。 [设计要求] 1、给出各单词符号的类别编码。 2、词法分析程序应能发现输入串中的错误。 3、词法分析作为单独一遍编写,词法分析结果为二元式序列组成的中间文件。 4、设计两个测试用例(尽可能完备),并给出测试结果。 demo.cpp #include #include #include #include "demo.h" char token[20]; int lookup(char *token) { for (int i = 0; i < 11; i++) { if (strcmp(token, KEY_WORDS[i]) == 0) { return i+1; } } return 0; } char getletter(FILE *fp) { return tolower(fgetc(fp)); } void out(FILE *fp, int c, char *value) {

编译原理标准实验报告

电子科技大学 实验报告 学生姓名:学号:指导教师: 实验地点:实验时间: 一、实验室名称:计算机学院软件工程实验室 二、实验项目名称:词法分析器的设计与实现 三、实验学时: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语言进行编程有了更深刻的理解,同时加深了自己对词法分析程序的原理的理解与掌握,提高了自己的动手能力。 十二、对本实验过程及方法、手段的改进建议 程序设计合理,代码可进一步优化。 报告评分: 指导教师签字:

编译原理实验报告总结

学年第学期《编译原理》实验报告 学院(系):计算机科学与工程学院 班级: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).语义分析 语义分析器对各句子的语法做检查:运算符两边类型是否相兼容;该做哪些类型转换(例如,实数向整数赋值要"取整");控制转移是否到不该去的地方;是

编译原理实验 中间代码生成

实验四中间代码生成 一.实验目的: 掌握中间代码的四种形式(逆波兰式、语法树、三元式、四元式)。 二.实验内容: 1、逆波兰式定义:将运算对象写在前面,而把运算符号写在后面。用这种表示法表示的表 达式也称做后缀式。 2、抽象(语法)树:运算对象作为叶子结点,运算符作为内部结点。 3、三元式:形式序号:(op,arg1,arg2) 4、四元式:形式(op,arg1,arg2,result) 三、以逆波兰式为例的实验设计思想及算法 (1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。 (2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。 (3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。 (4)如果不是数字,该字符则是运算符,此时需比较优先关系。 做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。 (5)重复上述操作(1)-(2)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。 四、程序代码: //这是一个由中缀式生成后缀式的程序 #include<> #include<> #include<> #include<> #define maxbuffer 64 void main() { char display_out(char out_ch[maxbuffer], char ch[32]); //int caculate_array(char out_ch[32]); static int i=0; static int j=0; char ch[maxbuffer],s[maxbuffer],out[maxbuffer]; cout<<"请输入中缀表达式: ";

编译原理实验报告

实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。 输入:由无符号数和+,-,*,/, ( , ) 构成的算术表达式,如1.5E+2-100。 输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。 三、实现方法与环境 1、首先设计识别各类单词的状态转换图。 描述无符号常数的确定、最小化状态转换图如图1所示。其中编号0,1,2, (6) 表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>,1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。 图1 文法G[<无符号数>]的状态转换图 其中编号0,1,2,…,6代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>,1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。 在一个程序设计语言中,一般都含有若干类单词符号,为此可首先为每类单词建立一张状态转换图,然后将这些状态转换图合并成一张统一的状态图,即得到了一个有限自动机,再进行必要的确定化和状态数最小化处理,最后据此构造词法分析程序。 四则运算算术符号的识别很简单,直接在状态图的0状态分别引出相应标记的矢线至一个新的终态即可。根据自己的习惯,也可以将其转换为状态矩阵形式。 2、词法分析程序编写 根据描述语言中各类单词的文法状态转换图或状态矩阵,利用某种语言(C语言或JA V A 语言)直接编写词法分析程序。 3、词法分析程序测试 用于测试扫描器的实例源文件中应有词法正确的,也应有错误的字符串,对于输入的测试用例的源程序文件,以对照的形式将扫描器的分析结果信息在输出文件中表示出来。四、参考资料 实现无符号数识别的参考方法:将设计的状态转换图直接转化为一张程序流程图,并在外层再增加一个以EOF为循环终止条件的while循环,即形成能连续识别各类单词的词法分析程序。 各类单词的编码建议如表1。 表1 单词的内部编码

编 译 原 理 实 验 报 告

编译原理实验报告 课程:编译原理 系别:计算机系 班级: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

编译原理实验指导

编译原理实验指导书 主编:徐静李娜 信息与电气工程学院 2010年3月

概述 一、本课程实验的目的和任务 编译原理是一门实践性很强的课程,只有通过实践,才能真正掌握。实际的编译程序是十分复杂的,有时由多达十几万条指令组成。为此,编译原理的实践教学,采用简化编译过程的办法,选择最关键的3个环节──词法分析、语法分析(包括语义处理、产生无优化的目标指令)、连接调试,进行编程和调试训练。每个环节作为一个实践课题。先分别编程调试,再连接在一起总调。 二、实验方法 任何一个实用的高级语言,其语法都比较复杂,如选其作为源语言,很难实践全过程。故本实验将定义一个简化的语言── C语言的一个子集作为源语言,设计调试出它的编译程序。前后贯穿这一条主线进行实践。每次都可利用课余时间编程,利用上机时间进行输入和调试。 三、实验报告的规范和要求 每个实验完成后写出实验报告。实验报告的内容包括如下内容: 一、实验目的 二、程序设计时采用的算法和方法 三、输入的源程序 四、词法分析程序清单和输出结果。 五、心得体会

实验一词法分析 一、实验目的: (1)通过设计编制调试一个具体的词法分析程序,理解词法分析在编译程序中的作用。 (2)加深对有穷自动机模型的理解。 (3)掌握词法分析程序的实现方法和技术。 (4)用C语言对一个简单语言的子集编制一个一遍扫描的程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)。 二、实验预习提示 1. 词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种别码的方式。 2. 单词的BNF表示 <标识符>→ <字母><字母数字串> <字母数字串>→<字母><字母数字串>|<数字> <字母数字串>| <下划线><字母数字串>|ε <无符号整数>→<数字> <数字串> <数字串>→<数字><数字串>|ε <加法运算符>→+ <减法运算符>→- <大于关系运算符>→> <大于等于关系运算符>→>= 3. “超前搜索”方法

编译原理实验报告

《编译原理》实验报告软件131 陈万全132852

一、需求分析 通过对一个常用高级程序设计语言的简单语言子集编译系统中词法分析、语法分析、语义处理模块的设计、开发,掌握实际编译系统的核心结构、工作流程及其实现技术,获得分析、设计、实现编译程序等方面的实际操作能力,增强设计、编写和调试程序的能力。 通过开源编译器分析、编译过程可视化等扩展实验,促进学生增强复杂系统分析、设计和实现能力,鼓励学生创新意识和能力。 1、词法分析程序设计与实现 假定一种高级程序设计语言中的单词主要包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符,试构造能识别这些单词的词法分析程序。 输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件。 输出:把所识别出的每一单词均按形如(CLASS,VALUE)的二元式形式输出,并将结果放到某个文件中。对于标识符和无符号常数,CLASS字段为相应的类别码的助记符;VALUE字段则是该标识符、常数的具体值;对于关键字和运算符,采用一词一类的编码形式,仅需在二元式的CLASS字段上放置相应单词的类别码的助记符,VALUE字段则为“空”。 2、语法分析程序设计与实现 选择对各种常见高级程序设计语言都较为通用的语法结构——算术表达式的

一个简化子集——作为分析对象,根据如下描述其语法结构的BNF定义G2[<算术表达式>],任选一种学过的语法分析方法,针对运算对象为无符号常数和变量的四则运算,设计并实现一个语法分析程序。 G2[<算术表达式>]: <算术表达式>→<项> | <算术表达式>+<项> | <算术表达式>-<项> <项>→<因式>|<项>*<因式>|<项>/<因式> <因式>→<运算对象> | (<算术表达式>) 若将语法范畴<算术表达式>、<项>、<因式>和<运算对象>分别用E、T、F和i 代表,则G2可写成: G2[E]:E → T | E+T | E-T T → F | T*F | T/F F → i | (E) 输入:由实验一输出的单词串,例如:UCON,PL,UCON,MU,ID······输出:若输入源程序中的符号串是给定文法的句子,则输出“RIGHT”,并且给出每一步分析过程;若不是句子,即输入串有错误,则输出“ERROR”,并且显示分析至此所得的中间结果,如分析栈、符号栈中的信息等,以及必要的出错说明信息。 3、语义分析程序设计与实现 对文法G2[<算术表达式>]中的产生式添加语义处理子程序,完成运算对象是简单变量(标识符)和无符号数的四则运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。 输入:包含测试用例(由标识符、无符号数和+、?、*、/、(、)构成的算术表达式)的源程序文件。 输出:将源程序转换为中间代码形式表示,并将中间代码序列输出到文件中。 若源程序中有错误,应指出错误信息 二、设计思路 1、词法分析程序设计与实现 1)单词分类 为了编程的实现。我们假定要编译的语言中,全部关键字都是保留字,程序员不得将它们作为源程序中的标识符;作了这些限制以后,就可以把关键字和标识符的识别统一进行处理。即每当开始识别一个单词时,若扫视到的第一个字符为字母,则把后续输入的字母或数字字符依次进行拼接,直至扫视到非字母、数字字符为止,以期获得一个尽可能长的字母数字字符串,然后以此字符串查所谓保留字表(此保留字表要事先造好),若查到此字符串,则取出相应的类别码;反之,则表明该字符串应为一标识符。

《编译原理上机实验指导》

《编译原理上机实验指导》 实验一词法分析 1 实验目的 设计编制并调试一个词法分析程序,加深对构造词法分析器的原理和技术理解与应用。 2 实验要求 选择一种计算机高级程序语言子语言,运用恰当的词法分析技术线路,设计和实现其子语言的词法分析器。语言选择,建议为《计算机程序设计》课程所采用的语言。技术线路建议如下两种之一:正则式→NFA→DFA→min DFA→程序设计和正则文法→NFA →DFA→min DFA→程序设计。分析器输出结果存入到磁盘文件中。具有出错处理功能。 选择子语言方法举例。以教材选取的PASCAL语言为例,确定其子语言涉及的单词类如下: (1)关键字 begin end if then while do (2)运算符和界符 := +-* /< <= <> > >= = ; ( ) :# (3)标识符 正则式:ID=letter(letter|digit)* (4)整型常数 正则式:NUM= digit(digit)* 3 算法设计 (1)单词种别码设计

(2)输出形式设计 词法分析器的输入是源程序字符串,输出是对应的单词串。每个单词按照二元组(种别码,单词符号本身)格式输出。 例如:假设源程序为begin x:=9; if x>0 then x:=2*x+1/3;end #,则词法分析器对应输出的结果是: (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)(10,x)(23,>)(11,0)(3,then)(10,x)(18,:=)(11,2)(15, *) (10,x)(13, +)(11,1)(16,/)(11,3)(26,;)(6,end)(0,#) (3)算法思想 依据建立的识别单词的DFA,设计算法,其框架如下。其中,①syn存放单词的种别码;②token存放符合标识符规则的单词;③sum存放整型常量的单词。 实现技术细节注意的几个要点:A)标识符和关键字,属于同一构词规则,识别方法是建立一个关键字表,在识别出标识符单词时,查关键字表,以确认或区别是否是关键字,还是标识符。B)对前导空格符、制表符和换行,均须过滤。详细处理技术请参见陈火旺等编写《程序设计语言编译原理》(第三版);C)约定标识符单词8位有效。 主算法流程图

相关文档
最新文档