计算机硬件实验室实验报告
姓名学号班级
词法分析成绩
设备名称及软件环境
一、实验目的:
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)
二、实验要求:
识别保留字:
if、int、for、while、do、return、break、continue,等C语言的保留字;单词种别码为1。
其他的都识别为标识符;单词种别码为2。
常数为无符号整形数;单词种别码为3。
运算符包括:
+、-、*、/、=、>、<、>=、<=、!=;单词种别码为4。
分隔符包括:
,、;、{、}、(、)、[、];单词种别码为5。
三、实验过程:
根据题目要求,初步完成程序过程的设计,模块的划分、变量类型分配。
#inlclude
int main(){int d,a,c;
a=10;
c=a+b;
printf("%d%d",a,b);;
return 0;}用以上定义的C语言子集的源程序作为词法分析程序的输入数据。在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。
经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:
常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。
0.定义部分:
定义常量、变量、数据结构。
1.初始化:
从文件将源程序全部输入到字符缓冲区中。
2.取单词前:
去掉多余空白。
3.取单词:
利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?)
4.显示结果。四、实验结果:
(1)写出示例程序的程序流程图
(2)给出程序的运行结果。(附运行窗体)
示例程序:
(注意:
示例程序需要修改的部分已用蓝色标记,修改之后再调试运行)
#include
#include
#include
#include
#include
#define NULL 0
FILE *fp;
char cbuffer;
char
*key[32]={"if","else","for","break","continue","int","float","double","auto","cas e","char","const","default","do","enum","long","extern","goto","register","return","s hort","signed","sizeof","static","struct","switch","typedef","union","unsigned","void" ,"volatile","while"};
char *border[8]={",",";","{","}","(",")","[","]"};
char *arithmetic[4]={"+","-","*","/"};
char *relation[6]={"<","<=","=",">",">=","<>"};
char *consts[20];
char *label[20];
int constnum=0,labelnum=0;
int search(char searchar[],int wordtype){int i=0;
switch(wordtype){case 1:for(i=0;i<=31;i++){if (strcmp(key[i],searchar)==0) return(i+1);}return 0;
case 2:{for (i=0;i<=7;i++){if (strcmp(border[i],searchar)==0)
return(i+1);}case 3:{}
case 4:{}
case 5:{}
case 6:{}}
return
(0);
for (i=0;i<=3;i++){if (strcmp(arithmetic[i],searchar)==0){return(i+1);}} return
(0);
for (i=0;i<=5;i++)
if (strcmp(relation[i],searchar)==0)
return(i+1);
return
(0);
for (i=0;i<=constnum;i++){if(consts[i] && (strcmp(consts[i],searchar)==0))
return(i+1);}consts[i-1]=(char *)malloc(sizeof(searchar)); strcpy(consts[i-1],searchar);
constnum++;
return(i);
for(i=0;i<=labelnum;i++)
if(label[i] && (strcmp(label[i],searchar)==0))
return(i+1);
label[i-1]=(char *)malloc(sizeof(searchar));
strcpy(label[i-1],searchar);
labelnum++;
return(i);
default:
return 0;}}
char alphaprocess(char buffer){//int atype;
int i=-1;
char alphatp[20];
while((isalpha(buffer))||(isdigit(buffer))){alphatp[++i]=buffer; buffer=fgetc(fp);}alphatp[i+1]='\0';
if (/*atype=*/search(alphatp,1))
//printf("%s (1,%d)\n",alphatp,atype-1);
printf("(1,\"%s\")\n",alphatp);
else {search(alphatp,6);
//printf("%s (6,%d)\n",alphatp,atype-1);
printf("(2,\"%s\")\n",alphatp);}return(buffer);}char digitprocess(char buffer){int i=-1;
char digittp[20];
//int dtype;
while ((isdigit(buffer))){digittp[++i]=buffer;
buffer=fgetc(fp);}digittp[i+1]='\0';
search(digittp,5);
//printf("%s (5,%d)\n",digittp,dtype-1);
printf("(3,\"%s\")\n",digittp);
return(buffer);}char otherprocess(char buffer){int i=-1;
char othertp[20];
//int otype,otypetp;
othertp[0]=buffer;
othertp[1]='\0';
if (/*otype=*/search(othertp,3)){//printf("%s (3,%d)\n",othertp,otype-1);
printf("(4,\"%s\")\n",othertp);
buffer=fgetc(fp);
goto out;}if (/*otype=*/search(othertp,4)){buffer=fgetc(fp);
othertp[1]=buffer;
othertp[2]='\0';
if (/*otypetp=*/search(othertp,4)){//printf("%s (4,%d)\n",othertp,otypetp-1);
printf("(4,\"%s\")\n",othertp);
goto out;}else
othertp[1]='\0';
//printf("%s (4,%d)\n",othertp,otype-1);
printf("(4,\"%s\")\n",othertp);
goto out;}if (buffer==':
'){buffer=fgetc(fp);
if (buffer=='=')
printf(":
= (2,2)\n");
buffer=fgetc(fp);
goto out;}else {if (/*otype=*/search(othertp,2)){//printf("%s
(2,%d)\n",othertp,otype-1);
printf("(5,\"%s\")\n",othertp);
buffer=fgetc(fp);
goto out;}}
if ((buffer!='\n')&&(buffer!=' '))
printf("%c error,not a word\n",buffer);
buffer=fgetc(fp);
out:
return(buffer);}void main(){int i;
for (i=0;i<=20;i++){label[i]=NULL;
consts[i]=NULL;}if ((fp=fopen("example.c","r"))==NULL) printf("error");
else {cbuffer = fgetc(fp);
while (cbuffer!=EOF){if (isalpha(cbuffer))
cbuffer=alphaprocess(cbuffer);
else if(isdigit(cbuffer))
cbuffer=digitprocess(cbuffer);
else cbuffer=otherprocess(cbuffer);}printf("over\n"); getchar();}}
Exemple 文件:
#inlclude
int main(){int d,a,c;
a=10;
c=a+b;
printf("%d%d",a,b);;
return 0;
}
编译原理实验报告 实验一词法分析设计 一、实验功能: 1、对输入的IXt文件内的内容进行词法分析: 2、由文件流输入IesiJxi中的内容,对文件中的各类字符进行词法分析 3、打印出分析后的结果;
二、程序结构描述:(源代码见附录) 1、分别利用k[],siu,s2[],s3[]构造关键字表,分界符表,算术运算符表和关系运算符表。 2、bool isletter(){}用来判断其是否为字母,是则返回IrUe,否则返回false; bool isdigit(){)用来判断其是否为数字,是则返回IrUe,否则返回false; bool iscalcu(){)用来判断是否为算术运算符,是则返回IrUe,否则返回false; bool reserve(string a∣∣){)用来判断某字符是否在上述四个表中,是则返向InIe,否则返回false; void concat(){)用来连接字符串; void getn(){)用来读取字符; void getb(){)用来对空格进行处理; void retract(){}某些必要的退格处理; int analysis(){}对一个单词的单词种别进行具体判断; 在主函数中用switch决定输出。
3| file.txt -记事本 文件(F)编辑⑹格式(O)查看(V) W(H) if i = O then i ++; a <= 3b%); 富F:\cpp\词法分析器.exe Process exited after 2.503 seconds with return 信按任意键继续∙.∙ 四、实验总结 词法分析器一眼看上去很复杂,但深入的去做就会发现并没有一开始想象的那么困难。 对于一个字符的种别和类型可以用b∞l 函数来判断,对于关键字和标示符的识别(尤其是 3b)则费了一番功夫,最后对于常数的小数点问题处理更是麻烦。另外,这个实验要设定好 时候退格,否则将会导致字符漏读甚至造成字符重复读取。 我认为,这个实验在程序实现上大体不算困难,但在细节的处理上则需要好好地下功夫 去想,否则最后的程序很可能会出现看上去没有问题,但实际上漏洞百出的状况。 将学过的知识应用到实际中并不简单,只有自己不断尝试将知识转化成程序才能避免眼 高手低,对于知识的理解也必将更加深刻。 单词 *******分析结果如下美 二元序列 类型 then + + 3b
院系:计算机科学学院 专业、年级: 07计科2大班 课程名称:编译原理 学号姓名: 指导教师: 2010 年11月17 日 组员学号姓名
实验 名称 实验一:词法分析实验室9205 实验目的或要求 通过设计一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 具体要求:输入为某语言源代码,达到以下功能: 程序输入/输出示例:如源程序为C语言。输入如下一段: main() { int a,b; a=10; b=a+20; } 要求输出如下(并以文件形式输出或以界面的形式输出以下结果)。 (2,”main”) (5,”(“) (5,”)“) (5,”{“} (1,”int”) (2,”a”) (5,”,”) (2,”b”) (5,”;”) (2,”a”) (4,”=”) (3,”10”) (5,”;”) (2,”b”) (4,”=”) (2,”a”) (4,”+”) (3,”20”) (5,”;”) (5,”}“) 要求: 识别保留字:if、int、for、while、do、return、break、continue等等,单词种别码为1。 其他的标识符,单词种别码为2。常数为无符号数,单词种别码为3。 运算符包括:+、-、*、/、=、>、<等;可以考虑更复杂情况>=、<=、!= ;单词种别码为4。分隔符包括:“,”“;”“(”“)”“{”“}”等等,单词种别码为5。
《编译原理》实验报告 班级:计C104 姓名:李云霄 学号:108490
实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。 输入:由无符号数和+,-,*,/, ( , ) 构成的算术表达式,如1.5E+2-100。 输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。 三、实现方法与环境 1、首先设计识别各类单词的状态转换图。 描述无符号常数的确定、最小化状态转换图如图1所示。其中编号0,1,2,…,6代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>, 1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。 图1 文法G[<无符号数>]的状态转换图 其中编号0,1,2,…,6代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>, 1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。 在一个程序设计语言中,一般都含有若干类单词符号,为此可首先为每类单词建立一张状态转换图,然后将这些状态转换图合并成一张统一的状态图,即得到了一个有限自动机,再进行必要的确定化和状态数最小化处理,最后据此构造词法分析程序。 四则运算算术符号的识别很简单,直接在状态图的0状态分别引出相应标记的矢
编译技术实验报告 实验题目:词法分析 学院:信息学院 专业:计算机科学与技术学号: 姓名:
一、实验目的 (1)理解词法分析的功能; (2)理解词法分析的实现方法; 二、实验内容 PL0的文法如下 ‘< >’为非终结符。 ‘::=’ 该符号的左部由右部定义,可读作“定义为”。 ‘|’ 表示‘或’,为左部可由多个右部定义。 ‘{ }’ 表示花括号内的语法成分可以重复。在不加上下界时可重复0到任意次 数,有上下界时可重复次数的限制。 ‘[ ]’ 表示方括号内的成分为任选项。 ‘( )’ 表示圆括号内的成分优先。 上述符号为“元符号”,文法用上述符号作为文法符号时需要用引号‘’括起。 〈程序〉∷=〈分程序〉. 〈分程序〉∷= [〈变量说明部分〉][〈过程说明部分〉]〈语句〉 〈变量说明部分〉∷=V AR〈标识符〉{,〈标识符〉}:INTEGER; 〈无符号整数〉∷=〈数字〉{〈数字〉} 〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉} 〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉}; 〈过程首部〉∷=PROCEDURE〈标识符〉; 〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉 〈赋值语句〉∷=〈标识符〉∶=〈表达式〉 〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END 〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉 〈表达式〉∷=〈项〉{〈加法运算符〉〈项〉} 〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')' 〈加法运算符〉∷=+|- 〈乘法运算符〉∷=* 〈关系运算符〉∷=<>|=|<|<=|>|>= 〈条件语句〉∷=IF〈条件〉THEN〈语句〉 〈字母〉∷=a|b|…|X|Y|Z 〈数字〉∷=0|1|2|…|8|9 实现PL0的词法分析
计算机硬件实验室实验报告 姓名学号班级 词法分析成绩 设备名称及软件环境 一、实验目的: 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验要求: 识别保留字: if、int、for、while、do、return、break、continue,等C语言的保留字;单词种别码为1。 其他的都识别为标识符;单词种别码为2。 常数为无符号整形数;单词种别码为3。 运算符包括: +、-、*、/、=、>、<、>=、<=、!=;单词种别码为4。 分隔符包括: ,、;、{、}、(、)、[、];单词种别码为5。 三、实验过程:
根据题目要求,初步完成程序过程的设计,模块的划分、变量类型分配。 #inlclude
编译原理实验报告 一、实验目的 编译原理是计算机科学中的重要课程,旨在让学生了解编译器 的基本工作原理以及相关技术。本次实验旨在通过设计和实现一 个简单的编译器,来进一步加深对编译原理的理解,并掌握实际 应用的能力。 二、实验环境 本次实验使用了Java编程语言及相关工具。在开始实验前,我 们需要安装Java JDK并配置好运行环境。 三、实验内容及步骤 1. 词法分析 词法分析是编译器的第一步,它将源代码分割成一系列词法单元。我们首先实现一个词法分析器,它能够将输入的源代码按照 语法规则进行切割,并识别出关键字、标识符、数字、运算符等。
2. 语法分析 语法分析是编译器的第二步,它将词法分析得到的词法单元序列转化为语法树。我们使用自顶向下的LL(1)语法分析算法,根据文法规则递归地构建语法树。 3. 语义分析 语义分析是编译器的第三步,它对语法树进行检查和转换。我们主要进行类型检查、语法错误检查等。如果源代码存在语义错误,编译器应该能够提供相应的错误提示。 4. 代码生成 代码生成是编译器的最后一步,它将经过词法分析、语法分析和语义分析的源代码翻译为目标代码。在本次实验中,我们将目标代码生成为Java字节码。 5. 测试与优化
完成以上步骤后,我们需要对编译器进行测试,并进行优化。 通过多个测试用例的执行,我们可以验证编译器的正确性和性能。 四、实验心得 通过完成这个编译器的实验,我收获了很多。首先,我对编译 原理的知识有了更深入的理解。在实验过程中,我深入学习了词 法分析、语法分析、语义分析和代码生成等关键技术,对编译器 的工作原理有了更系统的了解。 其次,我提高了编程能力。实现一个完整的编译器需要处理复 杂的数据结构和算法,这对我的编程能力是一个很好的挑战。通 过实验,我学会了合理地组织代码,优化算法,并注意到细节对 程序性能的影响。 最后,我锻炼了解决问题的能力。在实验过程中,我遇到了很 多困难和挑战,但我不断地调试和改进代码,最终成功地实现了 编译器。这次实验使我明白了解决问题的关键在于坚持和勇于尝试。
编 译 原 理 实 验 报 告 实验一 一、实验名称:词法分析器的设计 二、实验目的:1,词法分析器能够识别简单语言的单词符号 2,识别出并输出简单语言的基本字.标示符.无符号整数.运算符.和界符。 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器 四、实验原理: 1、词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 2、程序流程图 (1)主程序
(2)扫描子程序 3
五、实验内容: 1、实验分析 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k(int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用来表示正在分析的字符。字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。 2 实验词法分析器源程序: #include <> #include <> #include <> int i,j,k; char c,s,a[20],token[20]={'0'}; int letter(char s){ if((s>=97)&&(s<=122)) return(1); else return(0); } int digit(char s){ if((s>=48)&&(s<=57)) return(1); else return(0);
编译原理实验一·词法分析
一、实验目的 通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。 二、实验内容及要求 对某特定语言A ,构造其词法规则。 该语言的单词符号包括: 保留字(见左下表)、标识符(字母大小写不敏感)、整型常数、界符及运算符(见右下表) 。 功能要求如下所示: ·按单词符号出现的顺序,返回二元组序列,并输出。 ·出现的标识符存放在标识符表,整型常数存放在常数表,并输出这两个表格。 ·如果出现词法错误,报出:错误类型,位置(行,列)。 ·处理段注释(/* */),行注释(//)。 ·有段注释时仍可以正确指出词法错误位置(行,列)。 三、实验过程 1、词法形式化描述 使用正则文法进行描述,则可以得到如下的正规式: 其中ID表示标识符,NUM表示整型常量,RES表示保留字,DEL表示界符,OPR表示运算符。 A→(ID | NUM | RES | DEL | OPR) * ID→letter(letter | didit)* NUM→digit digit* letter→a | …| z | A | …| Z digit→0 | …| 9 RES→program | begin | end | var | int | and | or | not | if | then | else | while | do DEL→( | ) | . | ; | , OPR→+ | * | := | > | < | = | >= | <= | <>
编译原理 实验报告书
词法分析器 目录 1、摘要: (2) 2、实验目的: (2) 3、任务概述 (3) 4、实验依据的原理 (3) 5、程序设计思想 (5) 6、实验结果分析 (7) 7、总结 (9)
1、摘要: 本实验用C/C++高级语言编写词法分析程序,通过课堂上对词法分析器相关的背景知识的足够了解,清晰词法分析的过程,在脑海中形成词法分析的一般方案,根据方案一步步所要实现的目的,形成对词法分析器程序的模块划分和整体规划,最终实现一个词法分析器。具体要求能够通过扫描源程序分析出单词符号,将相应字符流转换成内码。 2、实验目的: 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的时间能力。通过本实验,掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法以及掌握词法分析的实现方法,并可以成功的上机调试编出词法分析程序。 3、任务概述 用C/C++实现对Pascal的子集程序设计语言的词法识别程序。 词法分析程序的主要工作为: (1)从源程序文件中读入字符。 (2)统计行数和列数用于错误单词的定位。 (3)删除空格类字符,包括回车、制表符空格。 (4)按拼写单词,并用(内码,属性)二元式表示。 (5)根据需要是否填写标识符表供以后各阶段使用。 4、实验依据的原理 (1)词法分析器工作流程图
图1 词法分析器工作流程图 实现流程:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。词法分析的功能是输入源程序,输出单词符号。所依据的理论基础有有限自动机、正规式、正规文法。
软件学院 《编译原理》实验报告 题目: 词法、语法分析 专业:软件工程 班级:rB软件W101 学号: 学生姓名:田博 指导教师:陆筱霞 日期:
实验词法分析实验报告 一:实验目的 调 试并完成一个词法分析程序,加深对词法分析原理的理解。 二:实验要求 1、待分析的简单语言的词法 (1)关键字: begin if then while do end 所有关键字都是小写。 (2)运算符和界符::= + –* / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义: ID=letter(letter| digit)* NUM=digit digit * (4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。 2、各种单词符号对应的别码
3、词法分析程序的输入 所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 三:代码 #include
词法分析实验报告 词法分析是编译原理中的一个重要概念,它是编译器中的第一个阶段,也是最基础的一个阶段。词法分析器将输入的源代码转化为一系列的标记(Token),这些标记是语法分析器后续 分析的基本单元。 在本次实验中,我们使用C语言编写了一个简单的词法分析器。该词法分析器可以识别常见的C语言关键字(如if、while、for等)、运算符(如+、-、*、/等)、标识符、常量等,并将它们转化为相应的标记。 实验过程中,我们使用了C++编程语言来实现词法分析器。 在主函数中,我们首先读取输入的源代码文件,并将其逐个字符地进行扫描。扫描过程中,我们利用一些常见的正则表达式来匹配每个标记,并将其转化为相应的Token。在匹配完成后,我们将Token存储在一个Token序列中,以便后续的语法分 析器使用。 实验过程中,我们遇到了一些困难。一是字符匹配的问题,在处理运算符等特殊字符时,需要对转义字符进行特殊处理。二是标识符的识别问题,我们需要判断一个字符是否属于标识符中的某一部分,而不能将其单独当作一个标记。为了解决这个问题,我们采用了状态机的方法,维护一个标识符的状态,根据状态的变化来判断是否识别到了一个完整的标识符。 在实验结果中,我们成功地将源代码转化为了一系列的标记。这些标记可以用于后序的语法分析和语义分析等过程中。同时,
我们也发现了一些问题,如在处理注释时可能会出现误判等。针对这些问题,我们可以进一步改进词法分析器,提高其准确性和鲁棒性。 总的来说,通过本次实验,我们深入理解了词法分析的原理和过程,并成功地实现了一个简单的词法分析器。通过这个实验,我们对编译原理有了更深入的了解,并提高了自己的编程能力。
编译原理实验报告
实验一 一、实验名称:词法分析器的设计 二、实验目的:1,词法分析器能够识别简单语言的单词符号 2,识别出并输出简单语言的基本字.标示符.无符号整数.运算符.和界符。 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器 四、实验原理: 1、词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 2、程序流程图 (1 (2)扫描子程序
3
五、实验内容: 1、实验分析 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k (int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用来表示正在分析的字符。字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。 2 实验词法分析器源程序: #include
编译原理实验(一)——词法分析器
一.实验描述 运行环境:vc++2008 对某特定语言A ,构造其词法规则。 该语言的单词符号包括: 1
2状态转换图 3程序流程:
词法分析作成一个子程序,由另一个主程序调用,每次调用返回一个单词对应的二元组,输出标识符表、常数表由主程序来完成。 二.实验目的 通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。 三.实验任务 编制程序实现要求的功能,并能完成对测试样例程序的分析。
四.实验原理 char set[1000],str[500],strtaken[20];//set[]存储代码,strtaken[]存储当前字符char sign[50][10],constant[50][10];//存储标识符和常量 定义了一个Analyzer类 class Analyzer{ public: Analyzer(); //构造函数 ~Analyzer(); //析构函数 int IsLetter(char ch); //判断是否是字母,是则返回 1,否则返回 0。 int IsDigit(char ch); //判断是否为数字,是则返回 1,否则返回 0。 void GetChar(char *ch); //将下一个输入字符读到ch中。 void GetBC(char *ch); //检查ch中的字符是否为空白, 若是,则调用GetChar直至ch进入一个非空白字符。 void Concat(char *strTaken, char *ch); //将ch中的字符连接到strToken之后。 int Reserve(char *strTaken); //对strTaken中的字符串查找保留字表,若是一个保留字返回它的数码,否则返回0。 void Retract(char *ch) ; //将搜索指针器回调一个字符位置,将ch置为空白字符。void input();//向存放输入结果的字符数组输入一句语句。 void display();//输出一些程序结束字符显示样式 int analyzerSubFun();//词法分析器子程序,为了实现词法分析的主要功能。 五.代码实现 // cifa.cpp : 定义控制台应用程序的入口点。 // #include"stdafx.h" #include"stdio.h" #include"string.h" #include"iostream" using namespace std; char set[1000],str[500],strtaken[20];//set[]存储代码,strtaken[]存储当前字符 char sign[50][10],constant[50][10];//存储标识符和常量 //int Words[500][10]; char ch;//当前读入字符 int sr,to=0;//数组str, strtaken 的指针 int st=0,dcount=0; int id=0; static int line=1; int h,l; typedef struct Words /*放置二元组*/ { int num; char letters[20];
编译原理语法分析实验报告 编译原理语法分析实验报告 引言 编译原理是计算机科学中的重要课程,它研究的是如何将高级语言转化为机器 语言的过程。语法分析是编译过程中的一个关键步骤,它负责将输入的源代码 转化为抽象语法树,为后续的语义分析和代码生成提供便利。本实验旨在通过 实践,加深对语法分析的理解,并掌握常见的语法分析算法。 实验环境 本次实验使用的是Python编程语言,因为Python具有简洁的语法和强大的库 支持,非常适合用于编译原理的实验。 实验步骤 1. 词法分析 在进行语法分析之前,需要先进行词法分析,将源代码划分为一个个的词法单元。词法分析器的实现可以使用正则表达式或有限自动机等方式。在本实验中,我们选择使用正则表达式来进行词法分析。 2. 文法定义 在进行语法分析之前,需要先定义源代码的文法。文法是一种形式化的表示, 它描述了源代码中各个语法成分之间的关系。常见的文法表示方法有巴科斯范 式(BNF)和扩展巴科斯范式(EBNF)。在本实验中,我们选择使用BNF来表 示文法。 3. 自顶向下语法分析 自顶向下语法分析是一种基于产生式的语法分析方法,它从文法的起始符号开
始,逐步展开产生式,直到生成目标字符串。自顶向下语法分析的关键是选择合适的产生式进行展开。在本实验中,我们选择使用递归下降分析法进行自顶向下语法分析。 4. 自底向上语法分析 自底向上语法分析是一种基于移进-归约的语法分析方法,它从输入串的左端开始,逐步将输入符号移入分析栈,并根据产生式进行归约。自底向上语法分析的关键是选择合适的归约规则。在本实验中,我们选择使用LR(1)分析法进行自底向上语法分析。 实验结果 经过实验,我们成功实现了自顶向下和自底向上两种语法分析算法,并对比了它们的优缺点。 自顶向下语法分析的优点是易于理解和实现,可以直接根据产生式进行展开,但缺点是对左递归和回溯的处理比较困难,而且效率较低。 自底向上语法分析的优点是可以处理任意文法,对左递归和回溯的处理较为方便,而且效率较高,但缺点是实现相对复杂,需要构建分析表和使用分析栈。结论 通过本次实验,我们深入理解了编译原理中的语法分析过程,并掌握了自顶向下和自底向上两种常见的语法分析算法。语法分析是编译过程中的重要环节,它为后续的语义分析和代码生成提供了基础。掌握语法分析算法对于编译原理的学习和实践具有重要意义。
编译原理词法分析实验报告 软工082班 兰洁 200831104044 一、实验内容 二、实验目的 三、实验预期 四、程序规定 五、实验原理 ●程序流程图 ●判别浮点功能扩展流程图 ●状态转换图 六、程序代码与浮点判别功能扩展 七、测试用例 ●扩展功能测试用例; ●普通功能测试用例 八、输出结果 九、实验心得
一、实验内容: 词法分析: 1、识别简单语言的单词符号; 2、识别关键字、标识符、数字、运算符等。并扩展浮点识别功能。 二、实验目的 调试词法分析程序,加深对词法分析原理的理解,掌握编写简单词法分析程序的一般步骤。 三、实验预期结果: 经过调试源代码程序,程序能够成功运行编译,对输入的简单字符串,能够别关键字、标识符、数字、运算符等,并且给出单词符号的对应编码。 四、程序规定: 1、关键字:"function","if","then","while","do","endfunc"; 2、算术运算符:”+”,”-”,”*”,”/”,”=”; 3、关系运算符:"<" ">" "<=" ">=" "==" "!="; 4、界符:"(" ")" ";" "#"; 5、标识符规定以字母开头,字母均为小写; 6、空格和换行符跳过; 7、单词对应编码: 十、实验原理: 输入串--------------------〉词法分析程序————————〉单词符号串 输入:字符串以#结束。 输出:单词的二元组(syn,token/sum)
程序流程图 分析浮点数功能扩展部分流程图:
shuzi()函数
状态转换图 六、程序代码: 备注:红色字体部分为程序功能的功能扩展,使程序能够分析浮点数! 我把浮点数的syn设置为80!
(完整word版)编译原理词法分析程序实现实验报告 实验一词法分析程序实现 一、实验内容 选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。 输入:由无符号数和+,-,*,/, ( , ) 构成的算术表达式,如1.5E+2-100。 输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。 二、设计部分 因为需要选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来,而其中的关键则为无符号数的识别,它不仅包括了一般情况下的整数和小数,还有以E为底数的指数运算,其中关于词法分析的无符号数的识别过程流程图如下: GOTO 1:
(完整word版)编译原理词法分析程序实现实验报告 GOTO 2: 三、源程序代码部分 #include
#define MULTIPLY 4 #define DIVIDE 5 #define LEFTBRACKET 6 #define RIGHTBRACKET 7 #define INEFFICACIOUSLABEL 8 #define FINISH 111 int count=0; int Class; void StoreType(); int Type[100]; char Store[20]={'\0'}; void ShowStrFile();//已经将要识别的字符串存在文件a中 void Output(int a,char *p1,char *p2);//字符的输出过程 int Sign(char *p);//'+''-''*''/'整体识别过程 int UnsignedNum(char *p);//是否适合合法的正整数0~9 int LegalCharacter(char *p);//是否是合法的字符:Sign(p)||UnsignedNum(p)||'E'||'.' void DistinguishSign(char *p);//'+''-''*''/'具体识别过程 void TypyDistinguish();//字符的识别过程 void ShowType();//将类别码存储在Type[100]中,为语法分析做准备 void ShowStrFile()//已经将要识别的字符串存在文件a中 { FILE *fp_s; char ch; if((fp_s=fopen("a.txt","r"))==NULL)
实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序;掌握在对程序设计语言的源程序进行扫描的过程中;将字符流形式的源程序转化为一个由各类单词符号组成的流的词法分析方法 二、实验内容 基本实验题目:若某一程序设计语言中的单词包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符;试构造能识别这些单词的词法分析程序各类单词的分类码参见表I.. 表I 语言中的各类单词符号及其分类码表 输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件.. 输出:把所识别出的每一单词均按形如CLASS;V ALUE的二元式形式输出;并将结果放到某个文件中..对于标识符和无符号常数;CLASS字段为相应的类别码的助记符;V ALUE字段则是该标识符、常数的具体值;对于关键字和运算符;采用一词一类的编码形式;仅需在二元式的CLASS字段上放置相应单词的类别码的助记符;V ALUE字段则为“空”.. 三、实现方法与环境 词法分析是编译程序的第一个处理阶段;可以通过两种途径来构造词法分析程序..其一是根据对语言中各类单词的某种描述或定义如BNF;用手工的方式例如可用C语言构造词法分析程序..一般地;可以根据文法或状态转换图构造相应的状态矩阵;该状态矩阵连同控制程序一起便组成了编译器的词法分析程序;也可以根据文法或状态转换图直接编写词法分析程
序..构造词法分析程序的另外一种途径是所谓的词法分析程序的自动生成;即首先用正规式对语言中的各类单词符号进行词型描述;并分别指出在识别单词时;词法分析程序所应进行的语义处理工作;然后由一个所谓词法分析程序的构造程序对上述信息进行加工..如美国BELL实验室研制的LEX就是一个被广泛使用的词法分析程序的自动生成工具.. 处理过程简述:在一个程序设计语言中;一般都含有若干类单词符号;为此可首先为每类单词建立一张状态转换图;然后将这些状态转换图合并成一张统一的状态图;即得到了一个有限自动机;再进行必要的确定化和状态数最小化处理;最后添加当进行状态转移时所需执行的语义动作;就可以据此构造词法分析程序了.. 为了使词法分析程序结构比较清晰;且尽量避免某些枝节问题的纠缠;我们假定要编译的语言中;全部关键字都是保留字;程序员不得将它们作为源程序中的标识符;在源程序的输入文本中;关键字、标识符、无符号常数之间;若未出现关系和算术运算符以及赋值符;则至少须用一个空白字符加以分隔..作了这些限制以后;就可以把关键字和标识符的识别统一进行处理..即每当开始识别一个单词时;若扫视到的第一个字符为字母;则把后续输入的字母或数字字符依次进行拼接;直至扫视到非字母、数字字符为止;以期获得一个尽可能长的字母数字字符串;然后以此字符串查所谓保留字表此保留字表要事先造好;若查到此字符串;则取出相应的类别码;反之;则表明该字符串应为一标识符.. 采用上述策略后;针对表I中的部分单词可以参考教材P80的图3-22见图1