算符優先分析

1. 已知算符優先關係矩陣以下表:spa

 

+code

*blog

itable

(class

)語法

#程序

+im

>margin

<img

<

<

>

>

*

>

>

<

<

>

>

i

>

>

   

>

>

(

<

<

<

<

=

 

)

>

>

   

>

>

#

<

<

<

<

 

=

 寫出符號串(i+i)*i#的算符優先分析過程。

文法:

S → #E#

E → E+T | T

T → T*F | F

F → (E) | i

2.接上個做業(P121練習1),完成4),5)兩個步驟。

1)計算FIRSTVT和 LASTVT。

2)找三種關係對。

3)構造算符優先關係表。

4)是否算符優先文法?

5)給出輸入串(a,(a,a))#的算符優先分析過程。

答:

(1)

FIRSTVT(S) = { a , Λ , ( }

FIRSTVT(T) = {  a , Λ , (  , , }

LASTVT(S) = { a , Λ , ) }

LASTVT(T) = {  a , Λ , (  , , }

(2)

=:(T) #S#

<:#S (T ,S

>:S#  T) T,

(3)

  a Λ ( ) , #
a      

>

> >
Λ       > > >
( < < < = <  
)       > > >
, < < < > >  
# < < <     =

(4)

答:是算符優先文法,由於終結符和符號之間不存在兩種關係。

(5)

3.嘗試編寫自下而上的語法分析程序。

能夠只寫表達式部分。

 

void Isleft( )
{
   Stack s;
  k=1;
  S[k]=’#’;
  do{ 
    a=S[k+1]
    if (S[k]∈VT) j=k;
    else j=k-1;
    while(S[j]>a)
    {
       do{
        Q=S[j];
        if(S[j-1] ∈VT) j=j-1;
        else j=j-2;
      }while(S[j]>Q);
      //
      k=j+1;
      S[k]=N;
    }
    if(S[j]<a || S[j]=a)
    {
       k=k+1;
      S[k]=a;
    }
  }while(a!=’#’);
}

 

4.寫出a+b*(c-d)+e/(c-d)↑n 的逆波蘭表達式,三元式,四元式。

 逆波蘭表達式:abcd-*+ecd↑n-/+

三元式:

(1) ( - , c , d )

(2) ( * , b , (1) )

(3) ( / , e , (1) )

(4) ( ↑ , (3) , n )

(5) ( + , a , (2) )

(6) ( + , (5) , (4) )

四元式:

( - , c , d , (1) )

( * , b , (1) , (2) )

( / , e , (1) , (3) )

( ↑ , (3) , n , (4) )

( + , a , (2) , (5) )

( + , (5) , (3) , (6) )

相關文章
相關標籤/搜索