
課程名稱編譯技術實驗名稱實驗一、詞法分析
班級姓名學號儀器組號___實驗日期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,感謝您對本站的認可!
本文鏈接:http://m.newhan.cn/zhishi/a/1678412491134650.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:詞法分析.doc
本文 PDF 下載地址:詞法分析.pdf
| 留言與評論(共有 0 條評論) |