2013-11-26 3 views
2

Учитывая эту грамматику:неоднозначных грамматик (BNF ОБОЗНАЧЕНИЯ)

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

Как доказать, что она неоднозначна?

+1

Вы можете предоставить два разных вывода того же предложения. –

+0

Найдя два возможных анализа для некоторого предложения. Попробуйте следующее: 'Если true, то s1; s2' – rici

+0

Этот вопрос уже задан и дан ответ: http://stackoverflow.com/questions/4788148/what-is-the-easiest-way-of-telling-whether-a-bnf-grammar-is-domiguous- или-нет? RQ = 1 –

ответ

2

Если вы можете нарисовать две деревья синтаксического разбора (или, что то же самое, написать два левых деривации) для того же предложения, то грамматика неоднозначна. Для этого не существует общего алгоритма (двусмысленность - неразрешимая проблема), но для многих грамматик это не сложно.

Достаточно примера @rici.

If true then s1; s2 

Одно дерево синтаксического анализа является

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

Я дам вам работать другой.

Смежные вопросы