Однозначная грамматика в неоднозначную

Я не знаю, является ли это правильным сайтом, чтобы спросить об этом. Но мы изучаем неоднозначность грамматики. Включая самый левый вывод и самый правый вывод. Моя практическая проблема заключается в следующем:

E -> E * E | E + E | N
N -> 0N | 1N |
Output: 0110 + 110 * 01111

Есть ли способ сделать его двусмысленным? И есть ли какие-нибудь советы, как сделать грамматику неоднозначной?


person Yodism    schedule 18.01.2015    source источник


Ответы (1)


Учитывая вашу грамматику, это явно двусмысленно. Здесь он не определяет предпочтения между операторами + и *.

Как вы сказали, если вам нужно разобрать этот 0110 + 110 * 01111, это можно сделать двумя способами: -

  1. 0110 + 110 * 01111 ----> (0110 + 110) * 01111

  2. 0110 + 110 * 01111 ----> 0110 + (110 * 01111)

Таким образом, эта грамматика довольно неоднозначна, поскольку не определяет приоритет оператора. Также не предусмотрена ассоциативность операторов.

Очевидно, что устранение неоднозначности за счет указания различий между конфликтующими случаями зависит от правил производства, заданных грамматикой. Некоторые вещи, возникающие при анализе сверху вниз, - это левое факторинг и левая рекурсия, приводящие к неоднозначным грамматикам.

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

person Am_I_Helpful    schedule 18.01.2015
comment
Я использую эту грамматику в порядке E -> E * E | E + E | 0E | 1E, потому что я пытаюсь сделать это одной строкой. Или это можно сделать одной строкой? - person Yodism; 18.01.2015
comment
Нет, вам нужно устранить неоднозначность, используя другой нетерминальный E', такой как E-> E';, а затем попытаться решить эту проблему. - person Am_I_Helpful; 18.01.2015
comment
Значит, это невозможно в одной строке грамматики? - person Yodism; 18.01.2015
comment
Точно, вам нужно устранить неоднозначность, добавив новые нетерминалы. Просто пройдите по ссылкам для неоднозначных грамматик. - person Am_I_Helpful; 18.01.2015
comment
Разве не верно и то, что E -> E + E неоднозначно само по себе, поскольку оно не определяет ассоциативность +? То есть a + b + c может быть проанализировано либо как (a + b) + c, либо как a + (b + c). Несмотря на то, что в обычной арифметике результат один и тот же, результаты могут быть другими, если мы, например, складываем числа с плавающей запятой. - person jacobq; 18.12.2015
comment
Да, именно поэтому у нас есть ассоциативность операторов почти во всех языковых спецификациях, скажем, в Java и т. д. @iX3. Кстати, я уже упоминал этот момент в своем ответе. - person Am_I_Helpful; 18.12.2015