实编译原理验一词法分析程序.docx
- 文档编号:6012477
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:17
- 大小:90.59KB
实编译原理验一词法分析程序.docx
《实编译原理验一词法分析程序.docx》由会员分享,可在线阅读,更多相关《实编译原理验一词法分析程序.docx(17页珍藏版)》请在冰豆网上搜索。
实编译原理验一词法分析程序
华北水利水电学院编译原理实验报告
一、实验目的
通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解,深刻理解词法分析的整个过程,提高词法分析方法的实践能力。
二、实验要求
(1)从源程序文件中读取有效字符和并将其转换成二元组机内表示形式输出。
(2)掌握词法分析的实现方法。
(3)实验要求独立完成,不允许有抄袭现象。
(4)实验完成后,要上交实验报告(包括源程序清单)。
三、实验内容
1、主程序设计考虑:
主程序的说明部分为各种表格和变量安排空间(关键字和特殊符号表)。
id和ci数组分别存放标识符和常数;还有一些为造表填表设置的变量。
主程序的工作部分建议设计成便于调试的循环结构。
每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。
2)词法分析过程考虑
该过程取名为lexical,它根据输入单词的第一个有效字符(有时还需读第二个字符),判断单词类,产生类号。
对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数存入数组中ci中,并记录其在表中的位置。
3)功能要求
输出源程序对应的二元组;
对错误单词能够报错,并提示出错误所在行;
常量和变量要求存在符号表中;
注:
所有识别出的单词都用二元组表示。
第一个表示单词的种类。
关键字的t=1;标识符的t=2;常数t=3;运算符t=4;界符t=5。
第二个为该单词在各自表中的指针或内部码值(常数表和标识符表是在编译过程中建立起来的。
其i值是根据它们在源程序中出现的顺序确定的)。
关键字和特殊符号表格如下:
单词代码
1
2
3
4
5
6
7
8
9
10
名字
int
char
float
void
const
if
else
do
while
scanf
单词代码
11
12
13
14
15
16
17
18
19
20
名字
printf
return
main
+
–
*
/
%
=
单词代码
21
22
23
24
25
26
27
28
29
30
名字
==
>
<
!
=
>=
<=
&&
||
!
单词代码
31
32
33
34
35
36
37
38
39
40
名字
(
)
{
}
;
“
‘
++
--
将词法分析程序设计成独(入口)立一遍扫描源程序的结构。
其主流程图如下:
四、程序源代码
#include"stdafx.h"
#include"词法分析.h"
#include"词法分析Dlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
#defineBUFFERSIZE1200
#defineletter1
#definedigit0
#definenotld-1
#defineksize21
#definessize25
/////////////////////////////////////////////////////////////////////////////
char*k[ksize]={"main","int","float","double","for","while",
"struct","do","char","if","else","return",
"void","scanf","print","cout","cin","endl",
"include","iostream","define"};
char*s[ssize]={"(",")","{","}",";","=","+","*",">","<",",",
//1234567891011
"?
",">=",">>","<=","<<","++","+=","--","-=","==",
//12131415161718192021
"#","[","]","."};
//22
charbuffer[BUFFERSIZE]={""};
intplace[BUFFERSIZE][2];
charch;
charstrToken[100]={""};
intpp=0;
char*biaoshifu[100];
intbiao=0;
char*constt[100];
intcon=0;
BOOLCMyDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
UINTarray[3];
for(inti=0;i<3;i++)
{
array[i]=100+i;
}
m_StatusBar.Create(this);//创建状态栏窗口
m_StatusBar.SetIndicators(array,sizeof(array)/sizeof(UINT));//添加面板
for(intn=0;n<3;n++)
{
m_StatusBar.SetPaneInfo(n,array[n],0,290);//设置面板宽度
}
//设置面板文本
m_StatusBar.SetPaneText(0,"狂风制作");
m_StatusBar.SetPaneText(1,"欢迎大家使用");
m_StatusBar.SetPaneText(2,"有理想就有梦想");
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
SetTimer(1,300,NULL);//设置定时器
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCMyDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCMyDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCMyDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCMyDlg:
:
OnClickRichedit2(NMHDR*pNMHDR,LRESULT*pResult)
{
//TODO:
Addyourcontrolnotificationhandlercodehere
*pResult=0;
}
char*CMyDlg:
:
print(inti)
{
returnk[i];
}
voidCMyDlg:
:
Onfenxi()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//CFilefile(NULL,CFile:
:
modeCreate|CFile:
:
modeWrite);
CStringstrText1="";
CStringstrText2="";
strText1=dealwith();
m_richedit2.SetWindowText(strText1);
}
voidCMyDlg:
:
GetChar()
{
ch=buffer[pp];
pp++;
}
voidCMyDlg:
:
getbc()
{
while(ch==''||int(ch)==10)
{
GetChar();
}
}
voidCMyDlg:
:
concat()
{
strcat(strToken,&ch);
}
intCMyDlg:
:
IsLetterorDigit()
{
if(('a'<=ch&&ch<='z')||('A'<=ch&&ch<='Z'))returnletter;
elseif('0'<=ch&&ch<='9')returndigit;
elsereturnnotld;
}
intCMyDlg:
:
reserve()
{
for(inti=0;i { if(strcmp(strToken,k[i])==0)returni+1; } return0; } intCMyDlg: : reserve1() { for(inti=0;i { if(strcmp(strToken,s[i])==0)returni+1; } if(int(strToken[0])==13)return-1; return0; } voidCMyDlg: : retract() { ch=''; pp--; } intCMyDlg: : insertid(char*a) { biaoshifu[biao++]=a; returnbiao; } intCMyDlg: : insertConst(char*a) { constt[con++]=a; returncon; } CStringCMyDlg: : dealwith() { CStringstrText="",str=""; pp=0; intcode,valuee;//code为单词种别标号valuee为单词符号的属性值 intplace1=0; str+="单词符号\t单词类型\t类型编码\t行数,列数\n"; strText+=str; while(pp =NULL) { for(intj=0;j<100;j++) { strToken[j]=NULL; } GetChar(); getbc(); place1=pp-1; if(1==IsLetterorDigit())//ch里存放的是是字母 { while(1==IsLetterorDigit()||0==IsLetterorDigit()) { concat(); GetChar(); } retract(); code=reserve(); if(code==0) { valuee=insertid(strToken); str.Format("%s\t\t标识符\t\t%d\t\t(%d,%d)\n",strToken,0,place[place1][0],place[place1][1]); } else { str.Format("%s\t\t关键字\t\t%d\t\t(%d,%d)\n",strToken,40+code,place[place1][0],place[place1][1]); } } elseif(digit==IsLetterorDigit())//返回是是数字 { intisletter=0;//判断数字后面是否是字母,如果是isletter=1,如果不是的话istetter=0 while((digit==IsLetterorDigit())||(letter==IsLetterorDigit())||ch=='.') { if(letter==IsLetterorDigit())isletter=1; if(ch=='.')isletter=2; concat(); GetChar(); } retract(); if(isletter==1) { str.Format("%s\t\tERROR\t\t%d\t\t(%d,%d)\n",strToken,100,place[place1][0],place[place1][1]); } elseif(isletter==2) { valuee=insertConst(strToken); str.Format("%s\t\t非整形常量\t\t%d\t\t(%d,%d)\n",strToken,30,place[place1][0],place[place1][1]); } else { valuee=insertConst(strToken); str.Format("%s\t\t整形常量\t\t%d\t\t(%d,%d)\n",strToken,31,place[place1][0],place[place1][1]); } } elseif(-1==IsLetterorDigit())//既非数字,又非字母,是界符,运算符等等, { inti=0; switch(ch) { case'>': while(-1==IsLetterorDigit()&&ch! =''&&ch! =NULL&&int(ch)! =13) {concat();GetChar();}if(int(ch)! =13)retract();break; case'<': while(-1==IsLetterorDigit()&&ch! =''&&ch! =NULL&&int(ch)! =13) {concat();GetChar();}if(int(ch)! =13)retract();break; case'+': while(-1==IsLetterorDigit()&&ch! =''&&ch! =NULL&&int(ch)! =13) {concat();GetChar();}if(int(ch)! =13)retract();break; case'-': while(-1==IsLetterorDigit()&&ch! =''&&ch! =NULL&&int(ch)! =13) {concat();GetChar();}if(int(ch)! =13)retract();break; case'=': while(-1==IsLetterorDigit()&&ch! =''&&ch! =NULL&&int(ch)! =13) {concat();GetChar();}if(int(ch)! =13)retract();break; default: concat();break; } i=reserve1(); if(i==0) { str.Format("%s\t\tERROR\t\t%d\t\t(%d,%d)\n",strToken,100,place[place1][0],place[place1][1]); } elseif(i! =-1) { str.Format("%s\t\t算符\t\t%d\t\t(%d,%d)\n",strToken,i,place[place1][0],place[place1][1]); } } strText+=str; str=""; } returnstrText; } voidCMyDlg: : OnButtonopen() { //TODO: Addyourcontrolnotificationhandlercodehere //TODO: Addyourcontrolnotificationhandlercodehere CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "AllFiles(*.*)|*.*||",AfxGetMainWnd()); //CMyAppaa; CStringstrPath,strText=""; if(dlg.DoModal()==IDOK) { strPath=dlg.GetPathName(); } CFilefile(strPath,CFile: : modeRead); charread[1000]; charc;//定义变量c记录当前从文件中读入的一个字符 introw=1;//记录文件的行数 intline=1;//记录文件的列数 intj=0; file.Read(read,1000); for(inti=0;i { strText+=read[i]; c=read[i]; if(c=='\n')//回车换行列数变为1,行数加1 { line=1; row+=1; } if(int(c)! =13||char(c)! =0) { buffer[i]=c; place[j][0]=row;place[j][1]=line; j++; } if(int(c)! =0)line+=1; } file.Close(); m_richedit1.SetWindowText(strText); //char*temp; //temp=print (1); //strText2+="lll"; //strText2+=temp; /*for(i=0;i<21;i++) { temp=print(i); strText2+=temp; strText2+='\t'; if((i+1)%5==0)strText2+='\n'; }*/ //MessageBox(temp,"sadf",MB_OK); /*m_richedit1.SetWindowText(strText); i=0; charch; ch=strText[0]; while(i<100) { ch=strText[i++]; strText2+=ch; } strText2+="\n###"; m_richedit2.SetWindowText(strText2);*/ UpdateData(FALSE); } voidCMyDlg: : OnButtonsave() { //TODO: Addyourcontrolnotificationhandlercodehere CFileDialog
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 词法 分析 程序