📄 编译原理的算符优先文法[网页版]).htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0063)http://bsonline.cvv.cn/lxl/bsarticle/printpage.asp?ArticleID=63 -->
<HTML><HEAD><TITLE>编译原理的算符优先文法[网页版]:)</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312"><LINK
href="编译原理的算符优先文法[网页版]).files/STYLE.css" type=text/css rel=stylesheet>
<META content="MSHTML 6.00.2900.2604" name=GENERATOR></HEAD>
<BODY leftMargin=2 topMargin=0 marginheight="0" marginwidth="0">
<TABLE cellSpacing=0 cellPadding=0 width="90%" border=0>
<TBODY>
<TR>
<TD>
<P align=center><FONT
size=6>编译原理的算符优先文法[网页版]:)</FONT><BR>作者:bs 转贴自:本站原创 点击数:431</P>
<P><FONT color=#ff0000><STRONG>c.asp</STRONG></FONT></P>
<P><% Option Explicit
%><BR><html><BR><title>算符优先关系表生成程序</title><BR><style><BR>body {
font-size: 14px }<BR>input { font-size: 14px; height: 20px; border:
1px, solid; border-color: #666666; background: #ffffff }<BR>table {
border: solid 1 #999999; }<BR>tr,td { border: solid 1 #999999;
}<BR></style><BR><body><BR><%
<BR>'*********************************************************************************************<BR>'==============================<BR>Dim
P(), a() '动态数组<BR>Dim stack(), tempStack,
tabStr '动态数组前两个,tabstr为字符串<BR>ReDim stack(1,
0) '初始化数组<BR>stack(0, 0) = 0<BR>stack(1, 0) = 0<BR>Dim
F() '动态数组<BR>Dim str, strArray '前者为字符串,后者为字符数组<BR>Dim tempStrP,
tempStra, countP, counta, m, n, tempm, tempn, TEMP, ERR<BR>Dim i, j,
k<BR>Dim Firstvt, strFirstvt, Lastvt,
strLastvt<BR>'==============================<BR>str =
Trim(Request.Form(str))<BR>Response.write <li>您输入的文法为: <font
color=blue><b> & str &
</b></font></li><br><BR>strArray = split(str,
)<BR>If Not checkInput() or str = Then '第一次检查输入文法是否符合要求,防止P->E
E|F类型错误<BR> Response.Write(<li>文法输入错误!<a
href=a.htm>返回</a></li>)<BR> Response.End<BR>End
If<BR>Call chStr '改变有“|”的文法为两个式子<BR>str = Join(strArray, )<BR>If Not
checkInput() or str = Then '第二次检查输入文法是否符合要求,防止P->
P->E类型错误<BR> Response.Write(<li>文法输入错误!<a
href=a.htm>返回</a></li>)<BR> Response.End<BR>End
If<BR>'--------------------------求P(m)数组的最大维数,并给P(m)赋值<BR>tempStrP =
Left(str, 1)<BR>For i = 1 to Len(str)-1 '非终结符组成字符串<BR> If
Mid(str, i, 1) = then '以空格来隔开各个文法,如果空格存在,说明有一个非终结符<BR> tempStrP
= tempStrP & Mid(str, Instr(i, str, )+1, 1)<BR> End
IF<BR>Next<BR>For i = 0 to Len(tempStrP)-2 '去掉重复<BR> tempStrP =
Left(tempStrP,i+1) & Replace(Mid(tempStrP, i+2), Mid(tempStrP, i+1,
1), )<BR>Next<BR>tempStrP = Replace(tempStrP, , )<BR>countP =
Len(tempStrP) '得到非终结符的个数<BR>m = countP - 1<BR>ReDim
P(m) '定义非终结符数组的维数<BR>For i = 0 to
m '给非终结符数组赋值<BR> P(i) = Mid(tempStrP, i+1,
1)<BR>Next<BR>'--------------------------求a(n)数组的最大维数,并给a(n)赋值<BR>tempStra
= Replace(Replace(str, ,), ->, ) '得到除去 和文法表达的->的字符串<BR>For i =
0 to m '得到除去非终结符的字符串<BR> tempStra =
Replace(tempStra, P(i), )<BR>Next<BR>For i = 0 to
Len(tempStra)-2 '去掉重复<BR> tempStra = Left(tempStra,i+1) &
Replace(Mid(tempStra, i+2), Mid(tempStra, i+1, 1), )<BR>Next<BR>tempStra =
Replace(tempStra, , )<BR>counta = Len(tempStra) '得到终结符的个数<BR>n =
counta - 1<BR>ReDim a(n)<BR>For i = 0 to
n '给终结符数组赋值<BR> a(i) = Mid(tempStra, i+1,
1)<BR>Next<BR>'--------------------------------------------------------<BR>ReDim
F(m, n) '动态生成数组F(m,
n)<BR>'--------------------------按规则(1)对F(m, n)赋初值,并将F(m,
n)为真的符号对放入栈stack中<BR>For i = 0 to m<BR> For j = 0 to n<BR> If
pToa(P(i), a(j)) or PToQa(P(i), a(j)) Then '如果p->a 或
p->Qa<BR> F(i, j) = 1<BR> pushStack P(i),
a(j) '放入栈 Stack 中<BR> Else<BR> F(i, j) =
0<BR> End If<BR>
Next<BR>Next<BR>'--------------------------输出F(m,
n)数组的初值<BR>'Response.write(<li>F( & m+1 & , & n+1 &
)数组初值如下表</li>)<BR>'outForL()<BR>'--------------------------下面执行(2)<BR>'Response.write
tempstrp<BR>While Ubound(stack, 2) > 0<BR> tempStack =
Split(popStack(), )<BR> For i = 0 to
Ubound(strArray)<BR> If Mid(strArray(i), 4, 1) =
tempStack(0) Then '如果p->Q…<BR> tempm = Instr(tempStrP,
Left(strArray(i), 1)) - 1 'F(m, n)的 m
值**************************<BR> tempn = Instr(tempStra,
tempStack(1)) - 1 'F(m, n)的 n
值**************************<BR> If F(tempm, tempn) = 0
Then<BR> F(tempm, tempn) =
1<BR> pushStack Left(strArray(i), 1),
tempStack(1)<BR> End If<BR> End If<BR>
Next<BR>Wend<BR>'--------------------------输出F(m,
n)数组的终值<BR>'Response.write(<li>F( & m+1 & , & n+1 &
)数组终值如下表</li>)<BR>'outForL()<BR>'--------------------------开始生成Firstvt集合<BR>ReDim
strFirstvt(m+1)<BR>strFirstvt(0) = 0<BR>For i = 0 to m<BR> FirstVt =
,<BR> For j = 0 to n<BR> If F(i, j) and Not
Instr(Firstvt, a(j)) Then<BR> Firstvt = Firstvt & a(j)
& ,<BR> Else<BR> Firstvt = Firstvt<BR> End
If<BR> Next<BR> strFirstvt(i+1) = Replace(FirstVt, ,,
)<BR> Response.write <li> & P(i) & 的FirstVt集合为:
{ <b><font color=red><BR> If Len(FirstVt) >= 2
Then<BR> Response.write Replace(Mid(FirstVt, 2, Len(FirstVt) - 2 ),
,, </font></b>, <b><font color=red>)<BR> End
If<BR> Response.write </font></b>
}</li><br><BR>Next<BR>'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR>'ReDim
F(m, n) '动态生成数组F(m,
n)<BR>'--------------------------按规则(1)对F(m, n)赋初值,并将F(m,
n)为真的符号对放入栈stack中<BR>For i = 0 to m<BR> For j = 0 to n<BR> If
pTo_a(P(i), a(j)) or PToaQ(P(i), a(j)) Then '如果p->..a 或
p->..aQ<BR> F(i, j) = 1<BR> pushStack P(i),
a(j) '放入栈 Stack 中<BR> Else<BR> F(i, j) =
0<BR> End If<BR>
Next<BR>Next<BR>'--------------------------输出F(m,
n)数组的初值<BR>'Response.write(<li>F( & m+1 & , & n+1 &
)数组初值如下表</li>)<BR>'outForL()<BR>'--------------------------下面执行(2)<BR>'Response.write
tempstrp<BR>While Ubound(stack, 2) > 0<BR> tempStack =
Split(popStack(), )<BR> For i = 0 to
Ubound(strArray)<BR> If Mid(strArray(i),
Len(strArray(i)), 1) = tempStack(0)
Then '如果p->..Q '++++++<BR>
tempm = Instr(tempStrP, Left(strArray(i), 1)) - 1 'F(m, n)的 m
值**************************<BR> tempn = Instr(tempStra,
tempStack(1)) - 1 'F(m, n)的 n
值**************************<BR> If F(tempm, tempn) = 0
Then<BR> F(tempm, tempn) =
1<BR> pushStack Left(strArray(i), 1),
tempStack(1)<BR> End If<BR> End If<BR>
Next<BR>Wend<BR>'--------------------------输出F(m,
n)数组的终值<BR>'Response.write(<li>F( & m+1 & , & n+1 &
)数组终值如下表</li>)<BR>'outForL()<BR>'--------------------------开始生成Lastvt集合<BR>ReDim
strLastvt(m+1)<BR>strLastvt(0) = 0<BR>For i = 0 to m<BR> LastVt =
,<BR> For j = 0 to n<BR> If F(i, j) and Not
Instr(Lastvt, a(j)) Then<BR> Lastvt = Lastvt & a(j) &
,<BR> Else<BR> Lastvt = Lastvt<BR> End If<BR>
Next<BR> strLastvt(i+1) = Replace(LastVt, ,, )<BR>
Response.write <li> & P(i) & 的LastVt集合为: { <b><font
color=red> <BR> If Len(LastVt) >= 2
Then<BR> Response.write Replace(Mid(LastVt, 2, Len(LastVt) - 2 ), ,,
</font></b>, <b><font color=red>)<BR> End
If<BR> Response.write </font></b>
}</li><br><BR>Next<BR>'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR>'--------------------------此处生成优先关系表<BR>tabStr
= <BR>For i = 0 to Ubound(strArray)<BR> For j = 4 to
Len(strArray(i)) - 1<BR> If Instr(tempStra,
Mid(strArray(i), j, 1)) > 0 And Instr(tempStra, Mid(strArray(i), j + 1,
1)) > 0 Then<BR> tabStr = tabStr & a(Instr(tempStra,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -