Что такое неоднозначная контекстно-свободная грамматика?

Я не очень хорошо понимаю концепцию неоднозначности в контекстно-свободных грамматиках. Если бы кто-нибудь мог мне помочь и объяснить концепцию или предоставить хороший ресурс, я был бы очень признателен.

3 ответа

T * U;

Это объявление указателя или умножение? Вы не можете сказать, пока не знаете, что T а также U на самом деле

Таким образом, синтаксис выражения зависит от семантики (значения) выражения. Это не зависит от контекста - на языке без контекста это может быть только одно, а не два. (Вот почему они не позволили таким выражениям быть допустимыми утверждениями в D.)

Другой пример:

T<U> V;

Это использование шаблона или это операция больше или меньше? (Вот почему они изменили синтаксис на T!(U) V в D - круглые скобки имеют только одно использование, тогда как каретки имеют другое использование.)

Как бы вы проанализировали это:

if condition_1 then if condition_2 then action_1 else action_2

К какому "если" принадлежит "еще"?

В Python это:

if condition_1:
    if condition_2:
        action_1
    else:
        action_2

а также:

if condition_1:
    if condition_2:
        action_1
else:
    action_2

Рассмотрим входную строку, распознаваемую по контекстно-свободной грамматике. Строка получается неоднозначно, если она имеет два или более различных крайних левых вывода или разбирает деревья по вашему желанию. Грамматика неоднозначна, если она генерирует строки неоднозначно. Например, грамматика S -> E + E | E * E - неоднозначная грамматика, поскольку она выводит строку x + x * x неоднозначно, иными словами, существует более одного дерева разбора для представления выражения (на самом деле их два). Грамматику можно сделать не двусмысленной, изменив грамматику на:

E -> E + T | T

T -> T * F | F

F -> (E) | Икс

Реорганизованная грамматика всегда будет выводить строку однозначно, т. Е. Вывод всегда будет производить одно и то же дерево разбора.

Другие вопросы по тегам