词法分析

更新时间:2023-03-10 09:41:31 阅读: 评论:0

泰山南天门-瑜珈练习

词法分析
2023年3月10日发(作者:协议合同范本)

课程名称编译技术实验名称实验一、词法分析

班级姓名学号仪器组号___实验日期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 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 实用文体写作网旗下知识大全大全栏目是一个全百科类宝库! 优秀范文|法律文书|专利查询|