编译原理实验词法分析实验报告_第1页
编译原理实验词法分析实验报告_第2页
编译原理实验词法分析实验报告_第3页
编译原理实验词法分析实验报告_第4页
编译原理实验词法分析实验报告_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——编译原理实验词法分析实验报告编译技术试验报告

试验题目:

词词法分析

学学

院:

信息学院

专专

业:

计算机科学与技术

学学

号:

姓姓

名:

一、试验目的

(1)理解词法分析的功能;

(2)理解词法分析的实现方法;

二、试验内容

PL0的文法如下

‟为非终结符。

::=‟该符号的左部由右部定义,可读作"定义为'。

|‟表示或‟,为左部可由多个右部定义。

{}‟表示花括号内的语法成分可以重复。在不加上下界时可重复0到任意次数,有上下界时可重复次数的限制。

[]‟表示方括号内的成分为任选项。

()‟表示圆括号内的成分优先。

上述符号为"元符号',文法用上述符号作为文法符号时需要用引号‟括起。

〈程序〉∷=〈分程序〉.

〈分程序〉∷=[〈变量说明部分〉][〈过程说明部分〉]〈语句〉

〈变量说明部分〉∷=VAR〈标识符〉{,〈标识符〉}:INTEGER;

〈无符号整数〉∷=〈数字〉{〈数字〉}

〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}

〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉};

〈过程首部〉∷=PROCEDURE〈标识符〉;

〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉

〈赋值语句〉∷=〈标识符〉∶=〈表达式〉

〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END

〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉

〈表达式〉∷=〈项〉{〈加法运算符〉〈项〉}

〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉}

〈因子〉∷=〈标识符〉|〈无符号整数〉|"("〈表达式〉")"

〈加法运算符〉∷=+|-

〈乘法运算符〉∷=*

〈关系运算符〉∷=|=||=||=

〈条件语句〉∷=IF〈条件〉THEN〈语句〉

〈字母〉∷=a|b||X|Y|Z

〈数字〉∷=0|1|2||8|9

现实现PL0的的词法分析

三、试验分析与设计

PL0词法分析程序是一个独立的过程,其功能是为语法语义分析提供单词,把输入的字符串形式的源程序分割成一个个单词符号传递给语

法语义分析。

其主要方法步骤为从源程序扫描下一个字符,忽视空格、换行、TAB和解释并识别单词,再将不同类别的单词归类输出。

四、试验的实现

#includestdio.h

#includestdlib.h

#includestring.h

#includectype.h

#includestdbool.h

#definenorw11

//norw-1个关键字

#defineal20

//最长的关键字的长度

#defineIDnorw

#defineINTnorw+1

#defineCOMMAnorw+2

#defineENDFnorw+3

#defineCOLONnorw+4

#defineSEMICnorw+5

#defineADDnorw+6

#defineMINUSnorw+7

#defineMULTInorw+8

#defineEVALUnorw+9

#defineLEnorw+10

#defineNEnorw+11

#defineLTnorw+12

#defineEQnorw+13

#defineGEnorw+14

#defineGTnorw+15

#defineFLOATnorw+16

charTOKEN[20];

//字符数组用来依次存放单词词文的各个字符

externintlookup(char*);

//以TOKEN字符串查保存字表

externvoidreport_error(char);

//报告程序中的词法错误

boolisalpha(char);

//判断接收字符是否为字母

boolisalnum(char);

//判断接收字符是否为字母或者数字

boolisdigit(char);

//判断接收字符是否为数字

boolisannotation(char);

//判断接收字符是否为解释

externcharletter(charc);//用来将大写字母转化成小写字母

FILE*fin;

FILE*fout;

voidscanner()

{//词法分析的主体程序,对输入的文本文件进行词法分析

charch;

inti,c;

interror=0;

//记录文件中词法错误的个数

ch=fgetc(fin);

//从输入文件中读取一个字符

while(ch!=EOF)

{//当从输入文件接收的字符不是文件终止符时,执行循环

if(isalpha(ch))

{//假如从输入文件接收的第一个字符是字母

ch=letter(ch);

TOKEN[0]=ch;

ch=fgetc(fin);i=1;

while(isalnum(ch))

{

ch=letter(ch);

TOKEN[i]=ch;i++;

ch=fgetc(fin);

}

TOKEN[i]="\0";

c=lookup(TOKEN);

//查保存字表

if(c==0){fprintf(fout,(%d,%s)\n,ID,TOKEN);}//输出标识符

elsefprintf(fout,(%d,%s)\n,c,TOKEN);

//输出接收单词为保存字

}

if(isdigit(ch))

//假如从输入文件接收的第一个字符是数字

{

intcdot=0;

//统计小数点个数

TOKEN[0]=ch;

ch=fgetc(fin);i=1;

while(isdigit(ch)||ch==".")

{//从其次个接收字符开始,当是数字或者是小数点时,执行循环

if(ch==".")

cdot++;

TOKEN[i]=ch;i++;

ch=fgetc(fin);//重复接收字符,直到接收到非数字

if(cdot=2)

{

error++;

TOKEN[i]="\0";

printf(%siserror\n,TOKEN);

break;

}

}

if(isalpha(ch))//假如其次个字符是字母

{

while(isalpha(ch))//接收完所有的字母,跳出循环

{

TOKEN[i]=ch;i++;

ch=fgetc(fin);

}

TOKEN[i]="\0";

error++;

printf(%siserror\n,TOKEN);

}

elseif(cdot==0)

//当接收的字符为整型单词时

{

fseek(fin,-1,1);

TOKEN[i]="\0";

inta,temp=0,c;

for(c=0;ci;c++)

{

a=TOKEN[c]-"0";

if(c!=0)

{

temp=temp*10;

temp=temp+a;

}

else

{

temp=a;

}

}

fprintf(fout,(%d,%d)\n,INT,temp);

//输出接收单词为整数

}

elseif(cdot==1)

{

fseek(fin,-1,1);

TOKEN[i]="\0";

inta,part1=0,jc,b=0;

//b用来确定小数点所在的位置

floatc=0.1,part2=0.0;

while(TOKEN[b]!=".")

{

b=b+1;

}

for(jc=0;jcb;jc++)

{

a=TOKEN[jc]-"0";

if(jc!=0)

{

part1=part1*10;

part1=part1+a;

}

else

{

part1=a;

}

}

for(jc=b+1;jci;jc++)

{

a=TOKEN[jc]-"0";

part2=a*c+part2;

c=c*0.1;

}

fprintf(fout,(%d,%f)\n,FLOAT,part1+part2);

//输出接收单词为小数

}elseif(cdot==2)

{

fseek(fin,-1,1);

}

}

else

//假如从输入文件接收的第一个字符既不是字母又不是数字

switch(ch)

{//将所接收到的符号字符进行分类,采取一符一类

case":":ch=fgetc(fin);

if(ch=="=")fprintf(fout,(%d,:=)\n,EVALU);

//输出接收符号为赋值号

else

{ch=fgetc(fin);

fseek(fin,-1,1);

//文件接收字符回推一个字符

fprintf(fout,(%d,":")\n,COLON);

//输出冒号

}

break;

case",":fprintf(fout,(%d,",")\n,COMMA);break;

//输出逗号

case".":fprintf(fout,(%d,".")\n,ENDF);break;

//输出句号

case";":fprintf(fout,(%d,".")\n,SEMIC);break;

//输出分号

case"+":fprintf(fout,(%d,"+")\n,ADD);break;

//输出加号

case"-":fprintf(fout,(%d,"-")\n,MINUS);break;

//输出减号

case"*":fprintf(fout,(%d,"*")\n,MULTI);break;

//输出乘号

case"":ch=fgetc(fin);

if(ch=="=")fprintf(fout,(%d,"=")\n,LE);

//输出小于或等于号

elseif(ch=="")fprintf(fout,(%d,"")\n,NE);

//输出不等于号

else

{

fseek(fin,-1,1);

fprintf(fout,(%d,"")\n,LT);;

//输出小于号

}

break;

case"=":fprintf(fout,(%d,"=")\n,EQ);break;

//输出等于号

case"":ch=fgetc(fin);

if(ch=="=")fprintf(fout,(%d,"=")\n,GE);

//输出大于或等于号

else

{

fseek(fin,-1,1);

fprintf(fout,(%d,"")\n,GT);

//输出大于号

}

break;

case"":break;

case"\n":break;

case"\t":break;

case"/":ch=fgetc(fin);//检查是否为单行解释

if(ch=="/"){

while(ch!="\n"){

ch=fgetc(fin);

}

}

else{

fseek(fin,-1,1);

printf(/iserror\n);

error++;

}

break;

case"{":

while(1){

ch=fgetc(fin);

if(ch=="}")break;

if(ch==EOF)

{

fseek(fin,-1,1);

printf({

iserror\n);

error++;

break;

}

}

break;

default:printf(%ciserror\n,ch);

//接收非上述字符程序报告词法错误

error++;break;

}

ch=fgetc(fin);

//继续从文件中读取下一个单词,直到文件终止

}//while循环终止

printf(共发现%d个词法错误!,error);

return;

}

intlookup(char*token)

{

intj;

charword[norw][al];

strcpy((word[1][0]),begin);

strcpy((word[2][0]),end);

strcpy((word[3][0]),var);

strcpy((word[4][0]),integer);

strcpy((word[5][0]),while);

strcpy((word[6][0]),do);

strcpy((word[7][0]),if);

strcpy((word[8][0]),then);

strcpy((word[9][0]),procedure);

strcpy((word[10][0]),else);

for(j=1;j=norw-1;j++)if(strcmp(token,word[j])==0)returnj;

//以TOKEN字符串查保存字表,若查到返回保存字类别码

return0;

//TOKEN不是保存字,返回0

}

boolisalpha(charc)

{//判断接收字符是否为字母

if((c="a"c="z")||(c="A"c="Z"))return1;

elsereturn0;

}

boolisalnum(charc)

{//判断接收字符是否为字母或者数字

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论