2010-09-24 19 views
0

Si vous avez la grammaire comme ceci:Quand les parenthèses sont-elles utilisées dans EBNF?

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

Et puis la phrase A = B + C * A, vous obtenez cette gauche dérivation:

<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 

Mais qu'en est-A = B + (C * UNE)?

Répondre

0

(C * A) n'a pas besoin d'un parent, car * a une plus grande priorité. Un cas où vous le verriez est A = B * (C + B).

Vous ne le voyez pas dans les deux dernières lignes car <factor> va être un ou un <id>. Dans ce cas, il n'y a pas + donc il doit être <id>.

+0

Je ne peux pas trouver une faille dans le code de James alors je dois me tromper –

2

A = B + (C * A)?

cinq premières étapes, comme ci-dessus, puis ...

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

Nominalement vous réduisez deux étapes en une avec l'avant-dernière règle, mais le résultat est assez clair. –