编译原理实验报告1编译原理实验报告3Word格式.docx
- 文档编号:431794
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:15
- 大小:17.86KB
编译原理实验报告1编译原理实验报告3Word格式.docx
《编译原理实验报告1编译原理实验报告3Word格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告1编译原理实验报告3Word格式.docx(15页珍藏版)》请在冰点文库上搜索。
如果有,则规约;
5、判断最左数的方法为:
每次都判断最右边的i个字符(i:
n->
1)组成的字符串是否为短语,如果是,则词短语为本符号栈的句柄;
如果i=1,且该字符串不是短语,则符号栈没有句柄;
6、如果符号栈为#S,输入串为#,则接受;
7、如果输入串为#,而符号栈不是#S,则设置一个标记值为真,如果再进行一次分析,符号栈没有变化,则说明该句子不是文法的句子,提示退出。
6、错误处理
1、如果未输入文法,则提示输入文法;
2、如果文法有错误,既不是以类似于“S->
”开头的,则提示错误发生在第几行;
3、如果句子不是以“#”结尾的,或者句子中含有大写字母的,予以提示。
7、关键代码
1、
voidCGrammaanalysis_Dlg:
:
Onsort()
{
intn=0;
UpdateData();
inti,nLineCount=m_gramma1.GetLineCount();
//m_gramma是与edit控件关联的变量
CStringstrText;
//Dumpeverylineoftextoftheeditcontrol.
for(i=0;
i<
nLineCount;
i++)//检测每一句文法输入是否正确
{
//lengthoflinei:
intlen=m_gramma1.LineLength(m_gramma1.LineIndex(i));
m_gramma1.GetLine(i,strText.GetBuffer(len),len);
strText.ReleaseBuffer(len);
if(strText.IsEmpty())
break;
if(!
getin(i,strText))//整理
return;
//MessageBox(strText);
//输出得到的每行数据
}
m_gramma.Empty();
Delpare();
//显示新文法
seten();
key=1;
}
2、
boolCGrammaanalysisDlg:
getin(inti,CStringstrLine)//整理
charline_no=i+'
0'
;
if(!
isupper(strLine[0])||strLine[1]!
='
-'
||strLine[2]!
>
'
)
CStringerror="
TheSyntaxonline"
+(CString)line_no+"
iswrong!
pleasecheckandenteragain:
\n"
MessageBox(error);
returnfalse;
else
{
intm=0;
for(intj=0;
j<
strLine.GetLength();
j++)
{
if(strLine[j]!
|'
{
stotax[sto_tax][m++]=strLine[j];
continue;
}
else
stotax[sto_tax][m]='
\0'
sto_tax++;
stotax[sto_tax][0]=stotax[sto_tax-1][0];
stotax[sto_tax][1]=stotax[sto_tax-1][1];
stotax[sto_tax][2]=stotax[sto_tax-1][2];
m=3;
}
stotax[sto_tax][m]='
sto_tax++;
i=0;
startchar=stotax[0][0];
returnTRUE;
3、
Delpare()//转移、显示新文法
for(inti=0;
i<
sto_tax;
i++)
m_gramma+=stotax[i];
m_gramma.Delete(m_gramma.GetLength());
m_gramma+="
\r\n"
//m_gramma[m_gramma.GetLength()-1]="
m_gramma+='
UpdateData(false);
4、
seten()//查找短语
for(intj=0;
sizeof(stotax[0]);
if(isupper(stotax[0][j]))
for(inti=0;
{
if(stotax[i][0]==stotax[0][j])
{
for(intk=3;
k<
sizeof(stotax[i]);
k++)
{
setence[setnum]+=stotax[i][k];
}
setnum++;
}
}
5、
boolCGrammaanalysis_Dlg:
ishandle(CStringch)//判断是否为短语
for(inti=0;
setnum;
if(setence[i]==ch)
returntrue;
returnFALSE;
6、
voidCGrammaanalysisDlg:
Select_Collection()//求每条产生式的select集,存放在数组selectchars[30][30]中
for(inti=0;
intselect_num=0;
intkey1=0;
intkey2=0;
for(intj=3;
strlen(stotax[i]);
for(intm=0;
m<
colec0num;
m++)
if(colec0[m]==stotax[i][j])
key1=1;
if(key1==0)
key2=1;
break;
if(stotax[i][3]=='
)//产生式右边为0,则把follow集加入select集中
follownumkey=0;
follow_num=0;
Follow_Collection(stotax[i][0]);
for(intr=0;
r<
follow_num;
r++)
intkey5=0;
for(intv=0;
v<
select_num;
v++)
if(followchars[r]==selectchars[i][v])
key5=1;
if(key5==0)
selectchars[i][select_num++]=followchars[r];
selectchars[i][select_num]='
break;
if(key2==0)//表示产生式右边能推出0,则把first集和follow集加入select集中
first_num=0;
First_Collection(&
stotax[i][3]);
for(intq=0;
q<
first_num;
q++)
intkey3=0;
for(ints=0;
s<
s++)
if(firstchars[q]==selectchars[i][s])
key3=1;
if(key3==0)
selectchars[i][select_num++]=firstchars[q];
for(intp=0;
p<
p++)
intkey4=0;
for(intt=0;
t<
t++)
if(followchars[p]==selectchars[i][t])
key4=1;
if(key4==0)
selectchars[i][select_num++]=followchars[p];
else//表示产生式右边不能推出0,则把first集加入select集中
selectchars[i][select_num]='
7、voidCGrammaanalysis_Dlg:
Analyse_course()//分析
CStringinputchars="
"
//存放输入串
CStringanastack="
//符号栈
inti=0;
anastack+="
#"
anastack+='
while(m_setence[i]!
#'
if(isupper(m_setence[i]))
printf("
输入的字符串不能有大写字母:
);
}
inputchars+=m_setence[i];
i++;
inputchars+='
i=1;
m_analysis.DeleteAllItems();
m_analysis.InsertItem(0,"
0"
m_analysis.SetItemText(0,1,anastack);
m_analysis.SetItemText(0,2,inputchars);
m_analysis.SetItemText(0,3,"
预备"
while(!
(anastack[1]==startchar&
&
inputchars[1]=='
))
CStringjudger="
intn=anastack.GetLength();
for(intindex=1;
index<
anastack.GetLength()-1;
index++)
judger.Empty();
for(intindex1=index;
index1<
anastack.GetLength();
index1++)
judger+=anastack[index1];
if(ishandle(judger))
anastack.Delete(index,anastack.GetLength()-index);
intj;
//存储规约文法
for(j=0;
j++)//查找规约文法
CStringdep;
for(intk=3;
sizeof(stotax[j]);
dep+=stotax[j][k];
if(judger==dep)
break;
CStringded=stotax[j];
ded+='
anastack+=stotax[j][0];
anastack+='
charch[25];
itoa(i,ch,10);
m_analysis.InsertItem(i,ch);
m_analysis.SetItemText(i,1,anastack);
m_analysis.SetItemText(i,2,inputchars);
m_analysis.SetItemText(i,3,"
规约,用"
+ded);
i++;
gotoend;
anastack.Delete(anastack.GetLength()-1);
anastack+=inputchars[0];
anastack+='
inputchars.Delete(0);
charch[25];
itoa(i,ch,10);
m_analysis.InsertItem(i,ch);
m_analysis.SetItemText(i,1,anastack);
m_analysis.SetItemText(i,2,inputchars);
m_analysis.SetItemText(i,3,"
移进"
i++;
end:
if(anastack[1]==startchar&
inputchars[0]=='
接受"
return;
};
if(inputchars=="
MessageBox("
该输入串不是文法的句子!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)