2013-11-26 101 views
2

鑑於這種語法:曖昧語法(BNF符號)

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

如何證明它是模糊的?

+1

你可以提供同一個句子的兩個不同的派生。 –

+0

通過爲某個句子找到兩個可能的解析。試試這個:'如果真的那麼s1; s2' – rici

+0

這個問題已經被問及並回答:http://stackoverflow.com/questions/4788148/what-is-the-easiest-way-of-telling-whether-a-bnf-grammar-is-ambiguous-或-不?RQ = 1 –

回答

2

如果您可以爲同一個句子繪製兩個解析樹(或者等同地寫兩個最左邊的派生詞),則語法是不明確的。沒有一般的算法可以做到這一點(歧義是一個不可判定的問題),但對於許多語法來說並不難。

@rici給出的示例就足夠了。

If true then s1; s2 

一個分析樹

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

我會讓你的工作的另一個。