编译原理标准实验报告.docx
《编译原理标准实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理标准实验报告.docx(63页珍藏版)》请在冰豆网上搜索。
![编译原理标准实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/21/1d6b22f1-5fcf-4d8f-b8e5-83010d00712c/1d6b22f1-5fcf-4d8f-b8e5-83010d00712c1.gif)
编译原理标准实验报告
编译原理实验报告
江苏科技大学电子信息学院
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)