Когда круглые скобки используются в EBNF? - PullRequest
0 голосов
/ 25 сентября 2010

Если у вас есть такая грамматика:

<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)?

Ответы [ 2 ]

2 голосов
/ 25 сентября 2010

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  )
0 голосов
/ 25 сентября 2010

( C * A ) не нуждается в парене, потому что * имеет больший приоритет.Один из случаев, когда вы видите это в A = B * ( C + B ).

Вы не видите его в последних двух строках, потому что <factor> будет иметь значение <term> + <term> или <id>.В этом случае нет +, поэтому это должно быть <id>.

...