算符优先分析
| 
 
 
 
 
 
 | + | * | i | ( | ) | # | 
| + | > | < | < | < | > | > | 
| * | > | > | < | < | > | > | 
| i | > | > | > | > | ||
| ( | < | < | < | < | = | |
| ) | > | > | > | > | ||
| # | < | < | < | < | = | 
写出符号串(i+i)*i#的算符优先分析过程。
答:算符优先分析过程如下:
| 步骤 | 栈 | 关系 | 输入串 | 动作 | 
| (1) | # | < | (i+i)*i# | 移进 | 
| (2) | #( | < | i+i)*i# | 移进 | 
| (3) | #(i | > | +i)*i# | 归约 | 
| (4) | #(N | < | +i)*i# | 移进 | 
| (5) | #(N+ | < | i)*i# | 移进 | 
| (6) | #(N+i | > | )*i# | 归约 | 
| (7) | #(N+N | > | )*i# | 归约 | 
| (8) | #(N | < | )*i# | 移进 | 
| (9) | #(N) | > | *i# | 归约 | 
| (10) | #N | < | *i# | 移进 | 
| (11) | #N* | < | i# | 移进 | 
| (12) | #N*i | > | # | 归约 | 
| (13) | #N*N | > | # | 归约 | 
| (14) | #N | 
 | # | 接受 | 
2.接上个作业(P121练习1),完成4),5)两个步骤。
1)计算FIRSTVT和 LASTVT。
2)找三种关系对。
3)构造算符优先关系表。
4)是否算符优先文法?
5)给出输入串(a,(a,a))#的算符优先分析过程。
答:
文法为:S->a | ^ | (T)
T->T,S | S
(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)输入串(a,(a,a))#的算符优先分析过程如下:
| 步骤 | 栈 | 关系 | 输入串 | 动作 | 
| (1) | # | < | (a,(a,a))# | 移进 | 
| (2) | #( | < | a,(a,a))# | 移进 | 
| (3) | #(a | > | ,(a,a))# | 归约 | 
| (4) | #(N | < | ,(a,a))# | 移进 | 
| (5) | #(N, | < | (a,a))# | 移进 | 
| (6) | #(N,( | < | a,a))# | 移进 | 
| (7) | #(N,(a | > | ,a))# | 归约 | 
| (8) | #(N,(N | < | ,a))# | 移进 | 
| (9) | #(N,(N, | < | a))# | 移进 | 
| (10) | #(N,(N,a | > | ))# | 归约 | 
| (11) | #(N,(N,N | > | ))# | 归约 | 
| (12) | #(N,(N | = | ))# | 移进 | 
| (13) | #(N,(N) | > | )# | 归约 | 
| (14) | #(N,N | > | )# | 归约 | 
| (15) | #(N | = | )# | 移进 | 
| (16) | #(N) | > | # | 归约 | 
| (17) | #N | 
 | # | 接受 
 | 
3.尝试编写自下而上的语法分析程序。
可以只写表达式部分。
答:程序如下:
void Isleft( )
{
   Stack s;
  k=1;
  S[k]=’#’;
  do{ 
    a=S[k+1]//把下一个输入符号读进a中;
    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);
      // 把S[j+1]…S[k]归约为某个N;
      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 的逆波兰表达式,三元式,四元式。
答:逆波兰表达式:(1) abcd-*+ecd-n↑/+
三元式:(1) (- c,d)
(2) (↑ (1),n)
(3) (/ e,(2))
(4) (* b,(1))
(5) (+ a,(4))
(6) (+ (4),(3))
四元式:(1) (- c,d,t1)
(2) (↑ t1,n,t2)
(3) (/ e,t2,t3)
(4) (* b,t1,t4)
(5) (+ a,t4,t5)
(6) (+ t5,t3,t6)
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号