第一范文网 - 专业文章范例文档资料分享平台

实验二 语法分析(算符优先)(2)

来源:用户分享 时间:2025/6/8 10:35:56 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

}

void CGrammarAnalysisDlg::CreateFristVT(Find* F) { }

void CGrammarAnalysisDlg::CreateLastVT(Find* F) {

for(int i=0;i

if(F[i].m_bIsVT) {

for(int j=0;j

{

for(int i=0;i

if(F[i].m_bIsVT) { }

for(int j=0;j

{ }

break;

}

//最后一角 nItem = T_LEN; nColumn = T_LEN;

m_nPriSheet[nItem][nColumn] = 0;

m_lst.SetItemText(nItem,nColumn+1,_T(\

}

m_nPriSheet[i][nColumn] = -1; break;

m_nPriSheet[i][nColumn] = 1; break;

}

}

}

}

break;

m_lst.SetItemText(i,nColumn+1,_T(\

case 1:

m_lst.SetItemText(i,nColumn+1,_T(\}

int CGrammarAnalysisDlg::FindTLocat(wchar_t strT) { }

int CGrammarAnalysisDlg::FindNTLocat(wchar_t strNT) {

if(F[i].m_strNTerm == m_strNTElem[j])

m_strFristVT[j] += F[i].m_strTerm;

}

void CGrammarAnalysisDlg::OnBnClickedBtnAnasysic() {

if(F[i].m_strNTerm == m_strNTElem[j])

m_strLastVT[j] += F[i].m_strTerm;

// TODO: 在此添加控件通知处理程序代码 //清空列表控件

int nCount = m_lbResult.GetCount(); for(int i=0;i

UpdateData(); //清空栈

m_stack.m_nTop = 0; //初值 int j,k = 1; CString Q;

m_stack.m_Ch[k] = (_T(\//

//int nLen = m_strSen.GetLength();

m_lbResult.DeleteString(0); for(int i=0;i

if(m_strNTElem[i] == strNT)

return i;

for(int i=0;i

if(strT = '#')

return T_LEN;

if(m_strTElem[i] == strT)

return i;

m_strSen += _T(\int i = -1; do { { nFrist = nLen;

nLen = str->Find('|',nFrist+1); CString

strProduce

=

i++;

str->Mid(nFrist+1,nLen-nFrist-1);

if(IsT(m_stack.m_Ch[k],0)) if(strProduce == strToProduce)

j = k; { else j = k-1;

CString strResult; int nItem = FindTLocat(m_stack.m_Ch[j].GetAt(0));

strResult = strNT;

int nColumn = FindTLocat(m_strSen[i]);

strResult += _T(\ strResult += strToProduce;

m_lbResult.AddString(strResult);

while(m_nPriSheet[nItem][nColumn] == 1) { k = j+1;

int nItem1,nColumn1; m_stack.m_Ch[k] = strNT; do break;

{ }

Q = m_stack.m_Ch[j]; }

if(IsT(m_stack.m_Ch[j-1],0)) }

j = j-1; nItem = FindTLocat(m_stack.m_Ch[j].GetAt(0)); else j= j-2;

nColumn = FindTLocat(m_strSen[i]);

//

nItem1 = FindTLocat(m_stack.m_Ch[j].GetAt(0)); }

nColumn1 = FindTLocat(Q.GetAt(0));

nItem = FindTLocat(m_stack.m_Ch[j].GetAt(0));

nColumn = FindTLocat(m_strSen[i]);

} while (m_nPriSheet[nItem1][nColumn1] != -1);

if(m_nPriSheet[nItem][nColumn] ==

-1

m_nPriSheet[nItem][nColumn] == 0)

CString strToProduce; { for(int m = j+1;m<=k;m++) k += 1;

{

m_stack.m_Ch[k] = m_strSen[i];

strToProduce += m_stack.m_Ch[m];

} }

else

//输出产生式

{

MessageBox(_T(\错误!\ POSITION pos = m_mapProduEX.GetStartPosition();

return; CString strNT; CString* str; }

while(pos) { }while(m_strSen[i] != '#');

m_mapProduEX.GetNextAssoc(pos,strNT,(void*&)str); MessageBox(_T(\成功!\

int nFrist = 0; int nLen = 0;

}

while(nLen+1 < str->GetLength())

||

五.结果分析及试验心得:

本次实验做起来有点复杂,我认为重点在对教材所给算法的理解及个变量存储形式的设计。好的存储形式不仅可简化对数据的操作,也可以精简程序的设计过程。

下面是我的有关变量存储形式的设计:

(1) 产生式:通过分析对已知的产生式进行了扩展,将产生式放入CMapStringToPtr的类型变量中存储,利用‘|’将统一非终结符的产生式隔开。使用时对CString的变量遍历,每次输出一个产生式;

(2) 终结符和非终结符:采用数组的形式存储,利用下标对应每一个字符; (3) FristVT和LastVT:利CString类型的数组存放,每个位置的元素 对应了一个非终结符;

(4) 算符优先表:利用二维数组存放其中无穷大表示空白,-1表示小于,0表示相等,1表示大于。

虽然在有些结构的设计上还不是太合理,但在实验中这种结构的设计给我完成实验提供了不上的便利。 关于程序的一点思考:

对于算符优先分析我们知道最大的便利就是可以跳过许多单非产生式,但是在程序的实现起来却是不太好处理,一般可采用两种方法:(1)通过每次输入的产生式,寻找扩展文法,在归约是利用扩展文法;这种方法增加了存储空间,但加快了归约过程的时间。(2)在归约过程中对每一产生式进行处理,这样节省了存储空间,但在时间效率上没有第一种的好。本次试验我采用的是第一种方法,但是个人觉得第二种方法更利于实现。

本次实验虽然做完了,但是程序的功能在很多方面还不完善,如不能自动输入产生式、输出的结果不直观等。这些都还需要在以后继续改进!

搜索更多关于: 实验二 语法分析(算符优先)(2) 的文档
实验二 语法分析(算符优先)(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c6e6lf7z31z9acj39pwbi_3.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top