编译原理实验 词法分析Word文档格式.docx
- 文档编号:15858566
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:19
- 大小:70.67KB
编译原理实验 词法分析Word文档格式.docx
《编译原理实验 词法分析Word文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验 词法分析Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
(8)单词符号间的分隔符:
空格。
2、记号的正规表达式(学生完成)
(2)无符号数:
(3)关系运算符:
(4)赋值号:
3、状态转换图
为每种记号的文法构造出相应的状态转换图,让这些状态转换图共用一个初态,就可以得到词法分析器的状态转换图,如图1所示。
(部分)
...
图1(a)关系运算符的状态转换图
(b)标识符的状态转换图
(c)数字的状态转换图
三、词法分析器的构造与实现
1、词法分析器的算法框图
在开始状态,首先要读进一个字符。
若读入的是一个空格(包括blank,tab,newline)就跳过它,再继续读字符,直到读进一个非空字符为止。
在标识符状态,识别并组合出一个标识符之后,还必须加入一些动作,以便查保留字表,确定识别出的单词符号是保留字,还是用户自定义标识符,并输出相应的记号。
在无符号数状态,可识别出各种常数,包括整数在内。
在组数的同时,还要做从十进制数到二进制数的转换。
.2、程序结构图:
注:
1Scanner
功能:
完成初始化,并循环调用子模块完成单词的识别
2IsAlpha
识别保留字和标识符
3IsNumber
识别数字
4IsOther
识别其他字符
5OutPut
输出识别的单词(二元式)
6Error
出错处理
程序代码(略)
四.源代码
#include"
stdafx.h"
stdio.h"
ctype.h"
string.h"
conio.h"
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=='
/'
)
switch(ch)
case'
:
}while(!
(ch=='
\n'
||flg==false));
Retract();
break;
*'
tmpc=ch;
if(tmpc=='
tmp[tmpp++]=tmpc;
}while(flg&
&
!
(flg&
tmpc=='
&
ch=='
));
if(!
flg)
ProcError(5);
}
default:
GetChar();
tmp[tmpp++]=ch;
else
}while(flg);
tmp[tmpp]='
\0'
strcpy(proBuffer,tmp);
//
}
voidProcError(intid)
printf("
\nError:
第%d行,%s\n"
errorLine,errorTab[id]);
boolGetChar()
if(point<
PRO_MAX_LEN&
proBuffer[point]!
='
ch=proBuffer[point++];
if(ch=='
errorLine++;
returntrue;
ch='
returnfalse;
boolGetBC()
if(!
GetChar())
}while(isspace(ch));
voidConcat(char*str)
inti;
for(i=0;
str[i];
++i);
str[i]=ch;
str[i+1]='
intReserve(char*str)
i<
KEYWORD_LEN;
++i)
if(0==strcmp(kwTab[i],str))
returni+1;
return0;
voidRetract()
{
if(proBuffer[point]=='
errorLine>
0)
errorLine--;
point--;
intInsertId(char*str)
i<
pointSTB;
++i)
if(0==strcmp(signTab[i],str))
returni;
strcpy(signTab[pointSTB++],str);
return(pointSTB-1);
intInsertConst(char*str)
pointCTB;
if(0==strcmp(constTab[i],str))
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)
while(isalnum(ch)||ch=='
{
wordget[i++]=ch;
wordget[i]='
code=Reserve(wordget);
if(code==0)
value=InsertId(wordget);
pDu->
kind=ID;
value=value;
kind=code;
value=-1;
while(isdigit(ch))
value=InsertConst(wordget);
kind=CONST;
value=value;
'
wordget[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理实验 词法分析 编译 原理 实验 词法 分析