模糊语法(BNF注释)

时间:2013-11-26 17:42:08

标签: algorithm parsing grammar ambiguous-grammar

鉴于这个语法:

<Program>     ::= <Stmt> | <Program>; <Stmt>  
<Conditional> ::= If <Bool> then <Program>  
<Bool>        ::= true | false  
<Stmt>        ::= <Conditional> | s1 | s2 

我如何证明它含糊不清?

1 个答案:

答案 0 :(得分:2)

如果你可以为同一个句子绘制两个解析树(或者等效地,写两个最左边的派生词),那么语法是不明确的。没有通用算法可以做到这一点(歧义是一个不可判定的问题),但对于许多语法来说并不难。

@rici给出的例子就足够了。

If true then s1; s2

一个解析树

    <Program>
    /     |  \
<Program> ; <Stmt>
    |         |
 <Stmt>       s2
   /|\__________
  / |     \     \
If <Bool> then <Program>
    |              |
    true         <Stmt>
                   |
                   s1

我会让你解决另一个。