算符優先分析
time limit: 1000 ms memory limit: 65536 kib
problem description
演算法優先分析法是一種不太規範的自下而上分析方法,分析速度快,特別適用於表示式的分析。為了便於大家理解和實踐算符優先分析法,本題目先給出乙個算符優先文法,請大家構造該文法的算符優先關係表。然後請對給定的輸入串進行算符優先分析,判斷其是否為該文法的乙個句子。
例如表示式文法:
e→e+t |t
t→t*f |f
f→(e) | i
該表示式文法是算符優先文法,其算符優先分析表為:
注意:構造算符優先分析表前,請先拓廣文法,例如引入非終結符q,令q→#e#。
input
輸入資料有多行。
第一行為乙個整數n(n<=50),代表文法中產生式的個數,其中不包括拓廣文法增加的產生式。
接下來的n行,每行給出乙個產生式。
最後一行給出待分析的輸入串,長度不超過50個符號。
output
要求輸出該文法的算符優先分析表,輸出格式請參考上面的**。
算符優先分析表中算符的排列順序為輸入文法時終結符出現的順序,#出現在最後。
算符之間的優先關係,分別用=、《和》表示,代表相同、低於和高於的優先關係。
第一行先輸出乙個空格,然後按順序輸出所有算符。
第二行開始第一列為對應的算符,接著輸出對應演算法之間的優先關係。
輸出的最後一行表示對輸入串的分析是否成功結束,如果成功分析結束輸出success,表示該輸入串是文法的乙個句子,否者輸出fail,表示該輸入串不是文法的乙個句子。
sample input
6
e->e+t
e->t
t->t*f
t->f
f->(e)
f->i
i+i*i
sample output
+*(
)i#+><<><>
*>><><>
(<<<=<
)>> > >
i>> > >
#<<< <=
success
#include
#include
using namespace std;
string str[30]
[100];
char st[30]
[100
],st1[30]
[100
],order[60]
,st2[
100][2
],st3[
100]
,st4[
100][2
];int num[30]
,num1[30]
,bj1[30]
,bj2[
150]
,sum[
100]
[100
],st3l,st4l;
char stack[
100]
,sta[
100]
;int top,top1,end1,number,bj0[
150]
;void
print
(char a)
}void
print1
(char a)
}void
print_stack()
void
print_sta()
intmain()
string str1,str2;
for(i=
0;i)else bj3=1;
}}else
else
if(bj2[p[j]]==
0)else bj3=1;
}if(bj!=1)
}if(j>0)
if((p[j-1]
<
'a'||p[j-1]
>
'z')
&&p[j]
>=
'a'&&p[j]
<=
'z')}}
if(bj==0)
bj=0;
for(j=nn-
1;j>=
0;j--)}
if(bj==0)
}//p=strtok(null,d);
//}}
order[l++]=
'#';bj2[
'#']=1
; st2[ll][0
]='#';st2[ll++][
1]=s; st2[ll][0
]=s;st2[ll++][
1]='#'
;memset
(sum,0,
sizeof
(sum));
for(i=
0;i}break;}
}}else}}
break;}
}}}for
(i=0
;ibreak;}
}}sum[l-1]
[l-1]=
2;//test9
cin>>sta;
cout<<
" ";
for(i=
0;i) cout<
; cout<
for(i=
0;i) cout<
}int flag=0;
end1=
strlen
(sta)
; sta[end1]
='#'
;end1++
; top=number=top1=0;
stack[0]
='#'
; bj0[
'#']=1
;/*for(i=0;i<150;i++)
cout
(i=0
;iwhile
(top>=0)
}if(mm==-1
) k=kk=-1
;for
(i=0
;i(order[i]
==sta[top1])}
if(k==-1
||kk==-1
)//cout<
if(sum[k]
[kk]==1
)else
if(sum[k]
[kk]==2
)else
if(sum[k]
[kk]==3
)else
//if(sta[top1]!='#') cout/else cout<
//print_sta();
//cout<
if(sum[k]
[kk]==1
)else
if(sum[k]
[kk]==2
)else
if(stack[mm]
=='#')}
else
if(sum[k]
[kk]==3
)}if(flag==
0) cout<<
"success"
<
else cout<<
"fail"
<
}return0;
}
算符優先分析
1.已知算符優先關係矩陣如下表 ii 寫出符號串 i i i 的算符優先分析過程。棧關係 輸入串動作 i i i 移進 i i i 移進 i i i 歸約 n i i 移進 n i i 移進 n i i 歸約 n n i 歸約 n i 移進 n i 歸約 n i 移進 n i 移進 n i 歸約 n...
算符優先分析
1.已知算符優先關係矩陣如下表 ii 寫出符號串 i i i 的算符優先分析過程。棧關係 輸出串動作 i i i 移進 i i i 歸約 n i i 移進 n i i 移進 n i i 歸約 n n i 移進 n n i 移進 n n i 歸約 n n n 歸約 n n 歸約 n 接受2.接上個作業...
作業十四 算符優先分析
1.已知算符優先關係矩陣如下表 ii 寫出符號串 i i i 的算符優先分析過程。棧關係 輸入串動作 i i i 移進 i i i 移進 i i i 歸約 n i i 移進 n i i 移進 n i i 歸約 n n i 歸約 n i 移進 n i 歸約 n i 移進 n i 移進 n i 歸約 n...