课程名称编译技术实验名称实验一、词法分析
班级姓名学号仪器组号___实验日期2017-10-23
实验报告要求:
1.实验目的2.实验内容3.实验要求与步骤4.流程图5.运行结果6.实验体会
一、实验目的
1、学会针对DFA转换图实现相应的高级语言源程序.
2、深刻领会状态转换图的含义,逐步理解有限自动机。
3、掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理。
二、实验内容
TINY计算机语言的编译程序的词法分析部分实现。
从左到右扫描每行该语言源程序的符号,拼成单词,换成统一的内部表示(token)
送给语法分析程序。
为了简化程序的编写,有具体的要求如下:
(1)数仅仅是整数。
(2)空白符仅仅是空格、回车符、制表符。
(3)代码是自由格式。
(4)注释应放在花括号之内,并且不允许嵌套
三、实验要求
要求实现编译器的以下功能:
a)按规则拼单词,并转换成二元式形式
b)删除注释行
c)删除空白符(空格、回车符、制表符)
d)显示源程序,在每行的前面加上行号,并且打印出每行包含的记号的二元形式
e)发现并定位错误。
词法分析进行具体的要求:
(1)记号的二元式形式中种类采用枚举方法定义;其中保留字和特殊字符是每个都
一个种类,标示符自己是一类,数字是一类;单词的属性就是表示的字符串值。
(2)词法分析的具体功能实现是一个函数GetToken(),每次调用都对剩余的字符串
分析得到一个单词或记号识别其种类,收集该记号的符号串属性,当识别一个
单词完毕,采用返回值的形式返回符号的种类,同时采用程序变量的形式提供
当前识别出记号的属性值。
(3)标识符和保留字的词法构成相同,为了更好的实现,把语言的保留字建立一个
表格存储,这样可以把保留字的识别放在标示符之后,用识别出的标示符对比
四、源代码
#include"stdafx.h"
#include"pro119.h"
#include"pro119Dlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////
////////
//CAboutDlgdialogudforAppAbout
classCAboutDlg:publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV
support
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD)
{}
voidCAboutDlg::DoDataExchange(CDataExchange*pDX)
{
CDialog::DoDataExchange(pDX);}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////
//CPro119Dlgdialog
CPro119Dlg::CPro119Dlg(CWnd*pParent/*=NULL*/)
:CDialog(CPro119Dlg::IDD,pParent)
{
//{{AFX_DATA_INIT(CPro119Dlg)
m_a=_T("");
m_b=_T("");
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubquentDestroyIconin
Win32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCPro119Dlg::DoDataExchange(CDataExchange*pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPro119Dlg)
DDX_Text(pDX,IDC_EDIT1,m_a);
DDX_Text(pDX,IDC_EDIT2,m_b);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPro119Dlg,CDialog)
//{{AFX_MSG_MAP(CPro119Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1,OnButton1)
ON_BN_DOUBLECLICKED(IDC_BUTTON1,OnDoubleclickedButton1)
ON_EN_CHANGE(IDC_EDIT1,OnChangeEdit1)
ON_EN_CHANGE(IDC_EDIT2,OnChangeEdit2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////
////////
//CPro119Dlgmessagehandlers
BOOLCPro119Dlg::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;
ring(IDS_ABOUTBOX);
if(!y())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,
strAboutMenu);
}
}
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
returnTRUE;//returnTRUEunlessyoutthefocustoacontrol
}
voidCPro119Dlg::OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
l();
}
el
{
CDialog::OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecode
below
//applicationsusingthedocument/view
model,
//thisisautomaticallydoneforyoubytheframework.
voidCPro119Dlg::OnPaint(){
if(IsIconic()){
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)eHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(()-cxIcon+1)/2;
inty=(()-cyIcon+1)/2;
on(x,y,m_hIcon);
}
el{
CDialog::OnPaint();
}
}
HCURSORCPro119Dlg::OnQueryDragIcon(){
return(HCURSOR)m_hIcon;
}
voidCPro119Dlg::OnButton1(){
//TODO:Addyourcontrolnotificationhandlercodehere
UpdateData(true);
m_b="";
char
keyword[8][10]={"if","then","esle","end","repeat","read","while"};
charspecial_sign[9]={'+','-','*','/','=','<','{','}',';'};
chara[100],ch,token[8];
inti,j,key,sp,temp1,temp2,len;
sprintf(a,"%s",m_a);
len=strlen(a);
for(i=0;i
{
ch=a[i];
if(ch==''||ch=='n'||ch=='t'||ch=='r')continue;
for(j=0;j<8;j++)
token[j]='0';
j=0;temp1=0;temp2=0;
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
do{
token[j++]=ch;
ch=a[++i];
}while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'));
for(key=0;key<8;key++)
if(strcmp(token,keyword[key])==0)
{m_b+=token;
m_b+="-->关键字";
m_b+="rn";
temp1=1;
temp2=1;
break;
}
if(temp1==0)
{m_b+=token;
m_b+="-->标识符";
m_b+="rn";
temp2=1;
}
i--;
}
elif(ch>='0'&&ch<='9')
{
do{
token[j++]=ch;
ch=a[++i];
}while(ch>='0'&&ch<='9');
m_b+=token;
m_b+="-->数字";
m_b+="rn";
temp2=1;
i--;
}
el
{
for(sp=0;sp<9;sp++)
if(ch==special_sign[sp])
{
m_b+=ch;
m_b+="-->特殊符号";
m_b+="rn";
temp2=1;
break;
}
}
if(temp2==0){m_b+="error!";m_b+="rn";}
}
UpdateData(fal);
}
voidCPro119Dlg::OnDoubleclickedButton1()
{
//TODO:Addyourcontrolnotificationhandlercodehere
}
voidCPro119Dlg::OnChangeEdit1()
{
}
voidCPro119Dlg::OnChangeEdit2(){
}
五实验结果
六.实验体会
通过编译原理的这次程序实验,在自已动手体验的情况下,更加透彻地理解
了词法分析的过程,以及该算法。对于以后由模型向程序代码的转化能力上,有
了很大的锻炼。以后我会更加专心的研究计算机知识,不断将现实中遇到的实际
问题,向程序方面转变,做到灵活运用所学知识
教师评价优良中及格不及格教师签名日期
本文发布于:2023-03-10 09:41:30,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/1678412491134650.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:词法分析.doc
本文 PDF 下载地址:词法分析.pdf
留言与评论(共有 0 条评论) |