2010-09-24 6 views
0

Если у вас есть грамматик так:Когда круглые скобки используются в EBNF?

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

ответ

0

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

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

+0

Я не могу найти ошибку в коде Джеймса, поэтому я должен быть неправильно –

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 ) 
+0

Номинально вы разрушаться два шага в один с предпоследним правилом, но результат достаточно ясен. –