⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 一个基于ll(1)文法的语法分析程序.htm

📁 LL(1)分析文法的一种
💻 HTM
📖 第 1 页 / 共 2 页
字号:
st;<BR>&nbsp;&nbsp; 
st.init();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
//初始化<BR>&nbsp;&nbsp; 
st.push('#');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp; 
st.push(Vn[0]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
//#与识别符号入栈<BR>&nbsp;&nbsp; j=0;<BR>&nbsp;&nbsp; h=1;<BR>&nbsp;&nbsp; 
w=str[0];<BR>&nbsp;&nbsp; 
cout&lt;&lt;"步骤&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
"&lt;&lt;"分析栈&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
"&lt;&lt;"剩余输入串&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
"&lt;&lt;" 所用产生式"&lt;<ENDL;<BR />opt1:<BR>&nbsp;&nbsp; 
cout&lt;<H<<"??????????????? 显示步骤<br />&nbsp;&nbsp;&nbsp; 
j++;<BR>&nbsp;&nbsp;&nbsp;&nbsp; w=str[j];<BR>&nbsp;&nbsp;&nbsp;&nbsp; goto 
opt1;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; else 
<BR>&nbsp;&nbsp;&nbsp;&nbsp; error();<BR>&nbsp;}<BR>&nbsp;&nbsp; else 
<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; if(X=='#')<BR>&nbsp;&nbsp;&nbsp; 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(X==w)<BR>&nbsp;&nbsp; { 
<BR>&nbsp;&nbsp;&nbsp; 
cout&lt;&lt;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
"&lt;&lt;"接受!"&lt;<ENDL<<ENDL;?????? <br />&nbsp;&nbsp; 
}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp; 
error();<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
else&nbsp; <BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
p=location(X,Vn);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
q=location(w,Vt);<BR>&nbsp;&nbsp;&nbsp; string 
S("NULL");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
if(M[p][q]==S)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
//查找二维数组中的产生式<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
error();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
else<BR>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string 
str0=M[p][q];&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
cout&lt;&lt;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
"&lt;<X<<"-->"&lt;<STR0<<ENDL;?????? 显示对应的产生式<br 
/>&nbsp;&nbsp;&nbsp;&nbsp;if(str0=="$")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto 
opt1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;{length=str0.getlength();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
//逆序进栈<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
for(m=length-1;m&gt;=0;m--)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
st.push(str0[m]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto 
opt1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp; 
}<BR>}<BR>main()<BR>{&nbsp;&nbsp; <BR>&nbsp;int i,k,n,r;<BR>&nbsp;&nbsp;&nbsp; 
char Vn[100],Vt[100],select;<BR>&nbsp;&nbsp;&nbsp; string 
M[100][100];<BR>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"* 文件名称: 语法分析"&lt;<ENDL;<BR 
/>&nbsp;&nbsp;&nbsp; cout&lt;&lt;"* 摘&nbsp;&nbsp;&nbsp; 要: 
对任意输入LL(1)文法的分析表及字符串,本程序能自动判断所给字符串是"&lt;<ENDL;<BR />&nbsp;&nbsp;&nbsp; 
cout&lt;&lt;"*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
否为该文法的句子,并能给出分析过程。"&lt;<ENDL;<BR />&nbsp;&nbsp;&nbsp; 
cout&lt;&lt;"*--------------------------------------------------------------------*"&lt;<ENDL;<BR 
/>&nbsp;&nbsp;&nbsp; cout&lt;<ENDL<<ENDL;<BR 
/>&nbsp;opt2:&nbsp;<BR>&nbsp;cout&lt;&lt;"请输入非终结符个数:";<BR>&nbsp;cin&gt;&gt;n;<BR>&nbsp;cout&lt;&lt;"请输入终结符(#号表示结束)Vt:";<BR>&nbsp;for(i=0;i&lt;100;i++)<BR>&nbsp;{<BR>&nbsp;&nbsp;cin&gt;&gt;Vt[i];<BR>&nbsp;&nbsp;if(Vt[i]=='#')<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;r=i;<BR>&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;&nbsp;&nbsp; 
for (i=0;i<N;I++)<BR 
/>&nbsp;{<BR>&nbsp;&nbsp;cout&lt;&lt;"请输入非终结符Vn["&lt;<i<<"]Vn:";<br></i<<"]Vn:";<br>&nbsp;&nbsp;cin&gt;&gt;Vn[i];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
cout&lt;&lt;"请输入此非终结符对应各终结符的产生式右部,$表示空串:"; 
<BR>&nbsp;&nbsp;for(k=0;k&lt;=r;k++)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp; 
cin&gt;&gt;M[i][k];<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>opt3:<BR>&nbsp;&nbsp;&nbsp; 
cout&lt;&lt;"请输入要分析的字符串,且以#结束:";<BR>&nbsp;&nbsp;&nbsp; analyse(Vn, Vt, 
M);<BR>&nbsp;&nbsp;&nbsp; 
cout&lt;&lt;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
************************请选择***********************"&lt;<ENDL;<BR 
/>&nbsp;&nbsp;&nbsp; 
cout&lt;&lt;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
1: 
输入字符串"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&lt;<ENDL;<BR />&nbsp;&nbsp;&nbsp; 
cout&lt;&lt;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
2: 
输入新分析表"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&lt;<ENDL;<BR />&nbsp;&nbsp;&nbsp; 
cout&lt;&lt;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
0: 退&nbsp; 
出"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&lt;<ENDL;<BR />opt4:<BR>&nbsp;&nbsp;&nbsp; 
cin&gt;&gt;select;<BR>&nbsp;&nbsp;&nbsp; 
switch(select)<BR>&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 
'1': {goto opt3;break;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '2': 
{goto opt2;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '0': 
{break;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:&nbsp; 
{cout&lt;&lt;"输入错误!请重新选择:"&lt;<ENDL;<BR 
/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto 
opt4;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
break;}<BR>&nbsp;}<BR>&nbsp;&nbsp;&nbsp; return 
0;<BR>}<BR></P><B><BR><BR>版权声明:CSDN是本Blog托管服务提供商。如本文牵涉版权问题,CSDN不承担相关责任,请版权拥有者直接与文章作者联系解决。</B><BR></DIV>
<DIV class=postfoot>发表于 2004年07月11日 7:59 PM </DIV></DIV><LINK 
href="http://blog.csdn.net/happyjyr/Services/Pingback.aspx" rel=pingback><!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://blog.csdn.net/happyjyr/archive/2004/07/11/39184.aspx"
dc:identifier="http://blog.csdn.net/happyjyr/archive/2004/07/11/39184.aspx"
dc:title="一个基于LL(1)文法的语法分析程序"
trackback:ping="http://blog.csdn.net/happyjyr/services/trackbacks/39184.aspx" />
</rdf:RDF>
--><FONT face=宋体></FONT><BR>
<DIV id=comments>
<H3>评论</H3>
<DIV class=post>
<DIV class=postTitle><A title="permalink: 回复:一个基于LL(1)文法的语法分析程序" 
href="http://blog.csdn.net/happyjyr/archive/2004/07/11/39184.aspx#39281">#</A>&nbsp;<A 
name=39281></A>回复:一个基于LL(1)文法的语法分析程序 <SPAN>2004-07-11 10:59 PM </SPAN><A 
id=Comments.ascx_CommentList__ctl0_NameLink target=_blank>seacloud</A> </DIV>
<DIV class=postText>stack和string为什么不用C++的标准类呢? <BR>毕竟你的工作主要是文法分析,而几乎有一半的代码 
<BR>在处理stack和string. <BR><A id=Comments.ascx_CommentList__ctl0_EditLink 
href="javascript:__doPostBack('Comments.ascx$CommentList$_ctl0$EditLink','')"></A></DIV></DIV><BR>
<DIV class=post>
<DIV class=postTitle><A title="permalink: 回复:一个基于LL(1)文法的语法分析程序" 
href="http://blog.csdn.net/happyjyr/archive/2004/07/11/39184.aspx#39954">#</A>&nbsp;<A 
name=39954></A>回复:一个基于LL(1)文法的语法分析程序 <SPAN>2004-07-12 9:17 PM </SPAN><A 
id=Comments.ascx_CommentList__ctl1_NameLink target=_blank>happyjyr</A> </DIV>
<DIV 
class=postText>  当时做这个程序的时候是刚刚接触C++,还不知道C++的标准类的使用,只好自己动手编制,这也是这个程序的最大的缺点.一直没有改动程序,谢谢提议,我会尽快做出改进. 
<BR><A id=Comments.ascx_CommentList__ctl1_EditLink 
href="javascript:__doPostBack('Comments.ascx$CommentList$_ctl1$EditLink','')"></A></DIV></DIV><BR></DIV></A>
<DIV class=CommentForm id=commentform>
<H3>发表评论</H3>
<TABLE class=CommentForm>
  <TBODY>
  <TR>
    <TD width=75>标题:</TD>
    <TD><INPUT id=PostComment.ascx_tbTitle style="WIDTH: 300px" size=40 
      value=回复:一个基于LL(1)文法的语法分析程序 name=PostComment.ascx:tbTitle> <SPAN 
      id=PostComment.ascx_RequiredFieldValidator1 
      style="DISPLAY: none; COLOR: red" initialvalue="" 
      evaluationfunction="RequiredFieldValidatorEvaluateIsValid" 
      display="Dynamic" errormessage="<br>请输入标题" 
      controltovalidate="PostComment.ascx_tbTitle"><BR>请输入标题</SPAN> </TD></TR>
  <TR>
    <TD width=75>大名:</TD>
    <TD><INPUT id=PostComment.ascx_tbName style="WIDTH: 300px" size=40 
      name=PostComment.ascx:tbName> <SPAN 
      id=PostComment.ascx_RequiredFieldValidator2 
      style="DISPLAY: none; COLOR: red" initialvalue="" 
      evaluationfunction="RequiredFieldValidatorEvaluateIsValid" 
      display="Dynamic" errormessage="<br>请输入尊姓大名" 
      controltovalidate="PostComment.ascx_tbName"><BR>请输入尊姓大名</SPAN> </TD></TR>
  <TR>
    <TD>网址:</TD>
    <TD><INPUT id=PostComment.ascx_tbUrl style="WIDTH: 300px" size=40 
      name=PostComment.ascx:tbUrl> </TD></TR>
  <TR>
    <TD colSpan=3>评论&nbsp; <SPAN id=PostComment.ascx_RequiredFieldValidator3 
      style="DISPLAY: none; COLOR: red" initialvalue="" 
      evaluationfunction="RequiredFieldValidatorEvaluateIsValid" 
      display="Dynamic" errormessage="<br>请输入评论" 
      controltovalidate="PostComment.ascx_tbComment"><BR>请输入评论</SPAN> <BR><TEXTAREA id=PostComment.ascx_tbComment style="WIDTH: 381px; HEIGHT: 193px" name=PostComment.ascx:tbComment rows=10 cols=50></TEXTAREA> 
    </TD></TR>
  <TR>
    <TD colSpan=3><INPUT language=javascript class=Button id=PostComment.ascx_btnSubmit onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " type=submit value=提交 name=PostComment.ascx:btnSubmit>&nbsp;&nbsp;&nbsp; 
      <INPUT id=PostComment.ascx_chkRemember type=checkbox 
      name=PostComment.ascx:chkRemember><LABEL 
      for=PostComment.ascx_chkRemember>记住我?</LABEL></TD></TR>
  <TR>
    <TD><SPAN id=PostComment.ascx_Message 
  style="COLOR: red"></SPAN></TD></TR></TBODY></TABLE></DIV></DIV>
<P id=footer>Powered by: <BR><A id=Footer1_Hyperlink2 
href="http://scottwater.com/blog" name=Hyperlink1><IMG alt="" 
src="一个基于LL(1)文法的语法分析程序.files/100x30_Logo.gif" border=0></A> <A 
id=Footer1_Hyperlink3 href="http://asp.net/" name=Hyperlink1><IMG alt="" 
src="一个基于LL(1)文法的语法分析程序.files/PoweredByAsp.Net.gif" border=0></A> <BR>Copyright 
© happyjyr </P>
<SCRIPT language=javascript type=text/javascript>
<!--
	var Page_Validators =  new Array(document.all["PostComment.ascx_RequiredFieldValidator1"], document.all["PostComment.ascx_RequiredFieldValidator2"], document.all["PostComment.ascx_RequiredFieldValidator3"]);
		// -->
</SCRIPT>

<SCRIPT language=javascript type=text/javascript>
<!--
var Page_ValidationActive = false;
if (typeof(clientInformation) != "undefined" && clientInformation.appName.indexOf("Explorer") != -1) {
    if ((typeof(Page_ValidationVer) != "undefined") && (Page_ValidationVer == "125"))
        ValidatorOnLoad();
}

function ValidatorOnSubmit() {
    if (Page_ValidationActive) {
        return ValidatorCommonOnSubmit();
    }
    return true;
}
// -->
</SCRIPT>
</FORM></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -