编译原理实验 词法分析.docx
- 文档编号:2947553
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:19
- 大小:70.67KB
编译原理实验 词法分析.docx
《编译原理实验 词法分析.docx》由会员分享,可在线阅读,更多相关《编译原理实验 词法分析.docx(19页珍藏版)》请在冰豆网上搜索。
编译原理实验词法分析
实验一简单词法分析器构造(4学时)
一实验目的
1、掌握正则表达式、有限自动机
2、构造简单的词法分析器
二词法规则(C语言分析及状态转换图)
1、C语言说明
C语言有以下记号及单词
(1)标识符:
以字母或下划线开头的,后跟字母、数字或下划线组成的符号串。
(2)保留字:
标识符的子集。
(3)无符号数:
(4)关系运算符:
>、<、>=、<=、==、!
=
(5)标点符号:
+、-、*、/、(、)、:
、,、;等
(6)赋值号:
=
(7)注释标记:
以‘/*’开始,以‘*/’结束。
(8)单词符号间的分隔符:
空格。
2、记号的正规表达式(学生完成)
(1)标识符:
(2)无符号数:
(3)关系运算符:
(4)赋值号:
(5)标点符号:
3、状态转换图
为每种记号的文法构造出相应的状态转换图,让这些状态转换图共用一个初态,就可以得到词法分析器的状态转换图,如图1所示。
(部分)
...
图1(a)关系运算符的状态转换图
(b)标识符的状态转换图
(c)数字的状态转换图
三、词法分析器的构造与实现
1、词法分析器的算法框图
在开始状态,首先要读进一个字符。
若读入的是一个空格(包括blank,tab,newline)就跳过它,再继续读字符,直到读进一个非空字符为止。
在标识符状态,识别并组合出一个标识符之后,还必须加入一些动作,以便查保留字表,确定识别出的单词符号是保留字,还是用户自定义标识符,并输出相应的记号。
在无符号数状态,可识别出各种常数,包括整数在内。
在组数的同时,还要做从十进制数到二进制数的转换。
.2、程序结构图:
注:
1Scanner
功能:
完成初始化,并循环调用子模块完成单词的识别
2IsAlpha
功能:
识别保留字和标识符
3IsNumber
功能:
识别数字
4IsOther
功能:
识别其他字符
5OutPut
功能:
输出识别的单词(二元式)
6Error
功能:
出错处理
程序代码(略)
四.源代码
#include"stdafx.h"
#include"stdio.h"
#include"ctype.h"
#include"string.h"
#include"conio.h"
#include"stdlib.h"
#defineKEYWORD_LEN32
#defineSTR_MAX_LEN300
#definePRO_MAX_LEN20480
#defineSTB_MAX_LEN1000
#defineCTB_MAX_LEN1000
#defineERROR0
#defineID(KEYWORD_LEN+1)
#defineCONST(KEYWORD_LEN+2)
#defineOPERAT(KEYWORD_LEN+3)
#defineDIVIDE(KEYWORD_LEN+4)
interrorLine=0;
charproBuffer[PRO_MAX_LEN]="";
charch;
charwordget[STR_MAX_LEN];
intpoint=0;
charsignTab[STB_MAX_LEN][STR_MAX_LEN];
intpointSTB=0;
charconstTab[CTB_MAX_LEN][STR_MAX_LEN];
intpointCTB=0;
charkwTab[KEYWORD_LEN][10]={"auto","break","case","char","const",
"continue","default","do","double","else",
"enum","extern","float","for","goto",
"if","int","long","register","return",
"short","signed","sizeof","static","struct",
"switch","typedef","union","unsigned","void",
"volatile","while"};
charerrorTab[][50]={
/*0*/"未知错误",/*1*/"非法的字符",/*2*/"不正确的字符常量表达",
/*3*/"不正确的字符串表达",/*4*/"不正确的数字表达",/*5*/"注释丢失'*/'"};
typedefstructsignDuality
{
intkind;
intvalue;
}*pDualistic,Dualistic;
voidpretreatment();
voidProcError(intid);
boolGetChar();
boolGetBC();
voidConcat(char*str);
intReserve(char*str);
voidRetract();
intInsertId(char*str);
intInsertConst(char*str);
boolwordAnalyse(pDualisticpDu);
voidpretreatment()
{intlines=0;
chartmp[PRO_MAX_LEN];
inttmpp=0;
boolflg;
chartmpc;
point=0;
do
{
flg=GetChar();
if(ch=='/')
{
flg=GetChar();
switch(ch)
{
case'/':
do
{
flg=GetChar();
}while(!
(ch=='\n'||flg==false));
if(ch=='\n')
Retract();
break;
case'*':
do
{
flg=GetChar();
tmpc=ch;
if(tmpc=='\n')
tmp[tmpp++]=tmpc;
flg=GetChar();
Retract();
}while(flg&&!
(flg&&tmpc=='*'&&ch=='/'));
flg=GetChar();
if(!
flg)
{
ProcError(5);
}
break;
default:
Retract();
Retract();
GetChar();
tmp[tmpp++]=ch;
flg=GetChar();
tmp[tmpp++]=ch;
}
}
else
{
tmp[tmpp++]=ch;
}
}while(flg);
tmp[tmpp]='\0';
strcpy(proBuffer,tmp);//
}
voidProcError(intid)
{
printf("\nError:
第%d行,%s\n",errorLine,errorTab[id]);
}
boolGetChar()
{
if(point ='\0') { ch=proBuffer[point++]; if(ch=='\n') errorLine++; returntrue; } ch='\0'; returnfalse; } boolGetBC() { do { if(! GetChar()) { ch='\0'; returnfalse; } }while(isspace(ch)); returntrue; } voidConcat(char*str) { inti; for(i=0;str[i];++i); str[i]=ch; str[i+1]='\0'; } intReserve(char*str) { inti; for(i=0;i { if(0==strcmp(kwTab[i],str)) returni+1; } return0; } voidRetract() { if(proBuffer[point]=='\n'&&errorLine>0) errorLine--; point--; } intInsertId(char*str) { inti; for(i=0;i if(0==strcmp(signTab[i],str)) returni; strcpy(signTab[pointSTB++],str); return(pointSTB-1); } intInsertConst(char*str) { inti; for(i=0;i if(0==strcmp(constTab[i],str)) returni; strcpy(constTab[pointCTB++],str); return(pointCTB-1); } boolwordAnalyse(pDualisticpDu) { intcode,value; charjudge; inti=0; GetBC(); judge=ch; if(isalpha(ch)||ch=='_')judge='L'; if(isdigit(ch))judge='D'; switch(judge) { case'L': while(isalnum(ch)||ch=='_') { wordget[i++]=ch; GetChar(); } wordget[i]='\0'; Retract(); code=Reserve(wordget); if(code==0) { value=InsertId(wordget); pDu->kind=ID; pDu->value=value; } else { pDu->kind=code; pDu->value=-1; } returntrue; case'D': while(isdigit(ch)) { wordget[i++]=ch; GetChar(); } wordget[i]='\0'; Retract(); value=InsertConst(wordget); pDu->kind=CONST; pDu->value=value; returntrue; case'"': do { wordget[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理实验 词法分析 编译 原理 实验 词法 分析