编译原理标准实验报告.docx

上传人:b****6 文档编号:7149536 上传时间:2023-01-21 格式:DOCX 页数:63 大小:213.96KB
下载 相关 举报
编译原理标准实验报告.docx_第1页
第1页 / 共63页
编译原理标准实验报告.docx_第2页
第2页 / 共63页
编译原理标准实验报告.docx_第3页
第3页 / 共63页
编译原理标准实验报告.docx_第4页
第4页 / 共63页
编译原理标准实验报告.docx_第5页
第5页 / 共63页
点击查看更多>>
下载资源
资源描述

编译原理标准实验报告.docx

《编译原理标准实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理标准实验报告.docx(63页珍藏版)》请在冰豆网上搜索。

编译原理标准实验报告.docx

编译原理标准实验报告

 

编译原理实验报告

 

江苏科技大学电子信息学院

2005年8月19日

 

实验一:

词法分析设计2

实验二:

LL

(1)预测分析10

实验三:

逆波兰表达式的产生及计算26

实验四:

SLR

(1)语法分析设计48

实验五:

应用DAG进行局部优化52

 

实验一词法分析设计

一.实验目的

通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。

二.实验内容

用VC++/VB/JAVA语言实现对C语言子集的源程序进行词法分析。

通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示;同时进行标识符登记符号表的管理。

三.实验步骤

1.基于实验的内容,构造程序所需的模块

2.根据已建构的模块,写出各个模块的相应程序代码

3.在主函数中调用模块来完成所要得到的效果

四.参考答案

1.源程序

'#############################################################################################################

'####

'##存在问题:

如何能较好的判断符号的优先级?

##

'####

'#############################################################################################################

'****************************************************************************************************************

'定义变量

'****************************************************************************************************************

Dimstr_stack(1To20)AsString,str_inputAsString,str_outputAsString,currentAsString

Dimstack_pAsDouble,str_feihouzhuiAsString

'****************************************************************************************************************

'函数定义

'****************************************************************************************************************

PrivateSubchansheng()

DimiAsDouble,jAsDouble,int_lengthAsLong,stack_topAsString,temp_stack_pAsDouble

Dimstr_tempAsString,int_length2AsLong,successAsBoolean,str_temp_stack(1To20)AsString

DimmsgAsDouble

success=True

Fori=1To20

str_stack(i)=""

Next

str_input="":

str_output="":

current=""

i=1:

j=1:

stack_p=1

temp_stack_p=0'用于存放优先级较高的运算符的临时堆栈的指针

str_input=InputBox("请输入待转换的非后缀式:

","输入非后缀式","(a+b*c)*d",3000,5000)&"#"

str_feihouzhui=str_input

int_length=Len(str_input)

int_length2=int_length

grid.Rows=100'初始化表格控件

grid.Cols=4

grid.TextMatrix(0,0)="当前符号"

grid.TextMatrix(0,1)="输入区"

grid.TextMatrix(0,2)="符号栈"

grid.TextMatrix(0,3)="输出区"

grid.ColWidth(0)=2100'设置列宽

grid.ColWidth

(1)=2100

grid.ColWidth

(2)=2075

grid.ColWidth(3)=3100

DoWhile(success)

current=Mid(str_input,1,1)

l0:

stack_top=str_stack(stack_p)

str_temp=""

SelectCasecurrent

Case"0"To"9","a"To"z"

str_output=str_output¤t

int_length2=int_length2-1

Case"*","/"

SelectCasestack_top

Case""

str_stack(stack_p)=current

int_length2=int_length2-1

Case"*","/","+","-","("

stack_p=stack_p+1

str_stack(stack_p)=current

int_length2=int_length2-1

EndSelect

Case"+","-"

SelectCasestack_top

Case""

str_stack(stack_p)=current

Forj=temp_stack_pTo1Step-1

Ifstr_temp_stack(temp_stack_p)<>""Then

stack_p=stack_p+1

str_stack(stack_p)=str_temp_stack(j)

temp_stack_p=temp_stack_p-1

EndIf

Next

int_length2=int_length2-1

Case"*","/"

str_output=str_output&str_stack(stack_p)'若优先级低于栈顶运算符,则弹出栈顶运算符并输出

Ifstack_p>1Then

stack_p=stack_p-1

Else

str_stack(stack_p)=""

EndIf

GoTol0

Case"+","-","("

stack_p=stack_p+1

str_stack(stack_p)=current

int_length2=int_length2-1

Forj=temp_stack_pTo1Step-1

Ifstr_temp_stack(temp_stack_p)<>""Then

stack_p=stack_p+1

str_stack(stack_p)=str_temp_stack(j)

temp_stack_p=temp_stack_p-1

EndIf

Next

EndSelect

Case"("

SelectCasestack_top

Case""

str_stack(stack_p)=current

int_length2=int_length2-1

Case"*","/","+","-","("

stack_p=stack_p+1

str_stack(stack_p)=current

int_length2=int_length2-1

EndSelect

Case")"

SelectCasestack_top

Case""

msg=MsgBox("错误,没有匹配的“(”。

","出错",1)

Case"*","/","+","-"

str_output=str_output&str_stack(stack_p)

Ifstack_p>1Then

stack_p=stack_p-1

EndIf

Case"("

Ifstack_p>1Then

stack_p=stack_p-1

Else

str_stack(stack_p)=""

EndIf

int_length2=int_length2-1

EndSelect

EndSelect

str_input=Right(str_input,int_length2)

Forj=1Tostack_p

str_temp=str_temp&str_stack(j)

Next

Ifcurrent="#"Then

Forj=stack_pTo1Step-1

IfNotstr_stack(stack_p)=""Then

str_output=str_output&str_stack(j)

Ifstack_p>1Then

stack_p=stack_p-1

Else

str_stack(stack_p)=""

EndIf

EndIf

Next

success=False

EndIf

grid.TextMatrix(i,0)=current

grid.TextMatrix(i,1)=str_input

grid.TextMatrix(i,2)=str_temp

grid.TextMatrix(i,3)=str_output

i=i+1

Loop

EndSub

PrivateSubcalculate()

DimmsgAsDouble,int_lengthAsDouble,iAsDouble,jAsDouble,int_length2AsDouble

Dimfuzhi(1To20)AsString,mAsDouble,nAsDouble,int_tempAsDouble

Ifcmd_chansheng.Enabled=FalseThen

msg=MsgBox("是否对已有逆波兰式进行计算?

",vbYesNo,"提示")

SelectCasemsg

Case6

GoTol1

Case7

Callchansheng

EndSelect

Else

Callchansheng

EndIf

l1:

str_input=str_output

str_temp=InputBox("请以“<变量名>=<数值>”的形式给待求算术表达式中的变量赋值,注意,各变量间以“,”隔开。

","赋值","a=1,b=2,c=3,d=4",3000,5000)

int_length2=Len(str_temp)

m=1:

n=2

Fori=1Toint_length2

current=Mid(str_temp,i,1)

SelectCasecurrent

Case"a"To"z"

fuzhi(m)=current

m=m+2

Case"0"To"9"

fuzhi(n)=current

n=n+2

EndSelect

Next

Picture1.Print"转换前的非后缀式为:

"&str_feihouzhui

Picture1.Print"待求的算术表达式为:

"&str_output

Picture1.Print"各变量的值为:

"&str_temp

stack_p=1

int_length=Len(str_input)

Fori=1Toint_length

current=Mid(str_input,i,1)

SelectCasecurrent

Case"a"To"z"

Forj=1TomStep2

Ifcurrent=fuzhi(j)Then

str_stack(stack_p)=fuzhi(j+1)

EndIf

Next

stack_p=stack_p+1

Case"+"

stack_p=stack_p-1

int_temp=CDbl(str_stack(stack_p-1))+CDbl(str_stack(stack_p))

str_stack(stack_p-1)=CStr(int_temp)

Case"-"

stack_p=stack_p-1

int_temp=CDbl(str_stack(stack_p-1))-CDbl(str_stack(stack_p))

str_stack(stack_p-1)=CStr(int_temp)

Case"*"

stack_p=stack_p-1

int_temp=CDbl(str_stack(stack_p-1))*CDbl(str_stack(stack_p))

str_stack(stack_p-1)=CStr(int_temp)

Case"/"

stack_p=stack_p-1

int_temp=CDbl(str_stack(stack_p-1))/CDbl(str_stack(stack_p))

str_stack(stack_p-1)=CStr(int_temp)

Case"0"To"9"

str_stack(stack_p)=current

stack_p=stack_p+1

EndSelect

Next

Ifstr_stack(stack_p)<>""Then

Picture1.Print"计算结果为:

"&str_stack(stack_p-1)

EndIf

EndSub

'**************************************************************************************************************

'定义操作

'**************************************************************************************************************

PrivateSubcmd_chansheng_Click()

cmd_chansheng.Enabled=False

cmd_calculate.Enabled=True

Callchansheng

EndSub

PrivateSubcmd_calculate_Click()

cmd_calculate.Enabled=False

Callcalculate

EndSub

PrivateSubcmd_exit_Click()

End

EndSub

PrivateSubcmd_main_Click()

Form3.Hide

Form_main.Show

EndSub

PrivateSubcmd_previous_Click()

Form3.Hide

Form2.Show

EndSub

PrivateSubcmd_reflesh_Click()

cmd_chansheng.Enabled=True

cmd_calculate.Enabled=True

grid.Clear

Picture1.Cls

EndSub

2.运行结果

实验二LL

(1)预测分析

一.实验目的

通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。

使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。

有利于提高学生的专业素质,为培养适应社会多方面需要的能力。

二.实验内容

1.对下列文法,用LL

(1)分析法对任意输入的符号串进行分析:

(1)E->TG

(2)G->+TG|—TG

(3)G->ε

(4)T->FS

(5)S->*FS|/FS

(6)S->ε

(7)F->(E)

(8)F->i

2.构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。

三.实验步骤

1.基于实验的内容,构造程序所需的模块

2.根据已建构的模块,写出各个模块的相应程序代码

3.在主函数中调用模块来完成所要得到的效果

四.参考答案

1.源程序

OptionExplicit

DimzjfAsString

Dimstack(50)AsString

Dimqu(50)AsString

Dimm,nAsInteger

PrivateSubForm_Activate()

RichTextBox1.Width=Me.Width

RichTextBox1.Height=CFFX.Height

EndSub

PrivateSubToolbar1_ButtonClick(ByValButtonAsComctlLib.Button)

DimFileNameAsString

Dimk,tAsInteger

DimesAsInteger

k=0

SelectCaseButton.Key

CaseIs="xj"

RichTextBox1.Text=""

RichTextBox1.Width=Me.Width

RichTextBox1.Height=CFFX.Height

MSFlexGrid1.Visible=False

RichTextBox1.Visible=True

CaseIs="dk"

CommonDialog1.Filter="TXT文件|*.TXT"'打开文件对话框

CommonDialog1.ShowOpen

FileName=CommonDialog1.FileName

RichTextBox1.FileName=FileName

RichTextBox1.Width=Me.Width

RichTextBox1.Height=CFFX.Height

StatusBar1.Panels

(1).Text="徐天霞"&FileName

MSFlexGrid1.Visible=False

RichTextBox1.Visible=True

CaseIs="bc"

CommonDialog1.DialogTitle="保存"

CommonDialog1.Filter="文本文件(*.txt)|*.txt"

CommonDialog1.ShowSave

FileName=CommonDialog1.FileName

RichTextBox1.SaveFileFileName

StatusBar1.Panels

(1).Text="徐天霞"&FileName

CaseIs="fx"

WhileMid(RichTextBox1.Text,k+1,1)<>""

qu(k)=Mid(RichTextBox1.Text,k+1,1)

k=k+1

Wend

MSFlexGrid1.Clear

es=LL()

RichTextBox1.Width=Me.Width

RichTextBox1.Height=Me.Height/2

MSFlexGrid1.Visible=True

Ifes>0Then

MsgBox"分析成功!

"

Else

MsgBox"分析失败!

"

EndIf

Fort=0To49

qu(t)=""

Nextt

CaseIs="tc"

UnloadMe

EndSelect

EndSub

 

PublicFunctionLL()AsInteger

Dimi,jAsInteger

DimFAsBoolean

DimkAsInteger

Dimchar2AsString

WithCFFX.MSFlexGrid1

.Cols=5

.Rows=100

Fork=1To4

.ColWidth(k)=1600

Nextk

.Row=0

.Col=0

.Text="步骤"

.Col=1

.Text="分析栈"

.Col=2

.Text="剩余输入串"

.Col=3

.Text="所用产生式"

.Col=4

.Text="动作"

EndWith

n=0

m=1

zjf="i()+-*/^"

stack(0)="#"

stack

(1)="E"

F=True

j=1

i=0

WithCFFX.MSFlexGrid1

.Row=m

.Col=0

.Text=Str(n)

.Col=1

k=0

char2=""

Whilestack(k)<>""

char2=char2&stack(k)

k=k+1

Text=char2

Wend

.Col=2

k=0

char2=""

Whilequ(k)<>""

char2=char2&qu(k)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 企业管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1