0

如果你有这样的语法:

<assign> → <id> = <expr> 
<id> → A | B | C 
<expr> → <expr> + <term> 
         |  <term> 
<term> → <term> * <factor> 
         |  <factor> 
<factor> → ( <expr> ) 
          | <id>

然后句子 A = B + C * A,你得到这个最左边的推导:

<assign> => <id> = <expr> 
         => A = <expr> 
         => A = <expr> + <term> 
         => A = <term> + <term> 
         => A = <factor> + <term> 
         => A = <id> + <term> 
         => A = B + <term> 
         => A = B + <term> * <factor> 
         => A = B + <factor> * <factor> 
         => A = B + <id> * <factor> 
         => A = B + C * <factor> 
         => A = B + C * <id> 
         => A = B + C * A

但是 A = B + ( C * A ) 呢?

4

2 回答 2

2

A = B + ( C * A )?

前五步,同上,然后...

     => A = B + <term>  
     => A = B + <factor>    
     => A = B + ( <expr>) 
     => A = B + ( <term> )  
     => A = B + ( <term> * <factor> ) 
     => A = B + ( <factor> * <factor> ) 
     => A = B + ( <id> * <id> ) 
     => A = B + (  C   *   A  )
于 2010-09-24T20:07:28.370 回答
0

( C * A )不需要括号,因为 * 具有更高的优先级。您会看到它的一种情况是在A = B * ( C + B ).

您在最后两行中看不到它,因为<factor>将 eval 为 a<term> + <term>或 an <id>。在这种情况下,没有 + 所以它必须是<id>.

于 2010-09-24T20:05:02.620 回答