算符優先分析

2021-09-29 19:32:50 字數 3829 閱讀 6142

算符優先分析

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...