2010-09-24 82 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 * 一个 )?

回答

0

(C * A)不需要paren,因为*具有更高的优先级。你会看到它的一个案例是A = B * (C + B)

您不会在最后两行看到它,因为<factor>将要评估为<term> + <term><id>。在这种情况下,没有+因此它必须是<id>

+0

我找不到詹姆斯的代码中的缺陷,所以我必须 – 2010-09-24 20:12:21

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

名义上你崩溃两步到一个是错的与倒数第二的规则,但结果是足够清楚的。 – 2010-09-24 20:10:24