Равны ли эти 2 грамматики?

У меня есть следующая грамматика, которая неоднозначна и, конечно, не slr1:

E -> E+A+A | E+A-A | E-A+A | E-A-A | T
T -> T+A | T-A | A
A -> A*B | A/B | B
B -> (E) | x

Я использовал правило преобразования, которое:

E -> E + T  ----->  E -> TE'
                    E' -> +TE' | ε

так что первая грамматика превращается в это:

E -> T E' .
E' -> + A + A E' .
E' -> + A - A E' .
E' -> - A + A E' .
E' -> - A - A E' .
E' -> .
T -> A T' .
T' -> + A T' .
T' -> - A T' .
T' -> .
A -> B A' .
A' -> * B A' .
A' -> / B A' .
A' -> .
B -> ( E ) .
B -> x .

Это устраняет неоднозначность, но по-прежнему не является slr1. Трансформация правильная. После этого я стираю правила T и устанавливаю их на E'. Таким образом, окончательная грамматика slr1 выглядит следующим образом:

E -> A E' .
E' -> + A + A E' .
E' -> + A - A E' .
E' -> - A + A E' .
E' -> - A - A E' .
E' -> + A .
E' -> - A .
E' -> .
A -> B A' .
A' -> * B A' .
A' -> / B A' .
A' -> .
B -> ( E ) .
B -> x .

Теперь у меня 2 вопроса.

  1. 2 финальные грамматики равны ?? Я определяю равенство, говоря, что эти две грамматики должны принимать одни и те же предложения. Кажется, что они делают.
  2. Верен ли тот факт, что я стер правила Т?? В моем упражнении я прошу изменить самый первый на slr1, и все, что я придумал, было последним. Thx в продвинутом и извините за мой английский.

person Kostas Ayfantop    schedule 25.11.2017    source источник


Ответы (1)


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

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

Во-первых, неправильное представление: левая рекурсия — это не то же самое, что неоднозначность, и, следовательно, левая факторизация и устранение левой рекурсии не устраняют неоднозначность. В частности, ваше утверждение о том, что «это устраняет двусмысленность, но по-прежнему не является SLR (1)», ошибочно. Преобразование не устраняет двусмысленность; грамматика по-прежнему не является SLR(1), потому что она по-прежнему неоднозначна.

E                   E
T E'                T E'
A T' E'             A T' E'
B A' T' E'          B A' T' E'
x A' T' E'          x A' T' E'
x T' E'             x T' E'
x + A T' E'         x E'
x + B A' T' E'      x + A + A E'
x + x A' T' E'      x + B A' + A E'
x + x T' E'         x + x A' + A E'
x + x + A T' E'     x + x + A E'
x + x + B A' T' E'  x + x + B A' E'
x + x + x A' T' E'  x + x + x A' E'
x + x + x T' E'     x + x + x E'
x + x + x E'        x + x + x
x + x + x

Ошибка заключается в стирании T правил. Вы начинаете с

E -> T E' .
T -> A T' .
T' -> + A T' .
T' -> - A T' .
T' -> .

Отсюда можно легко стереть T, так как он используется только в одном месте:

E -> A T' E'.
T' -> + A T' .
T' -> - A T' .
T' -> .

Однако стереть T' не так просто, потому что он рекурсивный. И, в любом случае, в E' нет производства, использующего T', поэтому добавление новых производств в E' не является механическим устранением T'.

Однако произведения, которые вы решили добавить к E', на самом деле устраняют двусмысленность. Так молодец, в этом смысле. Но обратите внимание, что вы могли бы сделать это без устранения левой рекурсии:

E -> E + A + A .
E -> E + A - A .
E -> E - A + A .
E -> E - A - A .
E -> A + A .
E -> A - A .
E -> A .
A -> A * B .
A -> A / B .
A -> B .
B -> ( E ) .
B -> x .

Эта грамматика однозначна по той же причине, что и ваша: операторы + и - разлагаются на последовательность троичных операций, которым, возможно, предшествует одна бинарная операция (в случае последовательность аддитивных операторов содержит нечетное число операторов). Но это не SLR(1). В самом деле, это не LR(k) для любого k, потому что невозможно узнать, должна ли последовательность операций начинаться с тернарной или бинарной операции, пока мы не узнаем, четное или нечетное число операторов.

Но мы можем решить эту проблему (по сути, так же, как и ваша грамматика), сделав аддитивные операторы правоассоциативными:

E -> A + A + E .
E -> A + A - E .
E -> A - A + E .
E -> A - A - E .
# Rest of the grammar is the same

Эта грамматика, конечно, не LL(1); это не левый фактор. Но исходная задача не требовала грамматики LL(1), а приведенное выше — это SLR(1).

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

person rici    schedule 27.11.2017
comment
Я вас разочарую, потому что ни я, ни мои коллеги не получают никакой обратной связи. В Греции кризис все-таки коснулся университетов и их качества. Спасибо за ваш ответ и ваше объяснение, поскольку я все понял. Я буду придерживаться вашего решения, я потратил неделю, пытаясь его найти, и не мог поверить, что небольшое изменение, которое вы действительно решили, решило проблему! Я думаю, ключ был в том, чтобы понять, где была двусмысленность. В любом случае возник еще один вопрос: я знаю, как создавать таблицы LR (1) и т. Д., Но откуда вы знаете, что это не LR (k)? Я думал, что вы должны знать строку раньше, чтобы понять - person Kostas Ayfantop; 28.11.2017
comment
Как вы получаете x + x +? - person rici; 28.11.2017
comment
@kostas: левоассоциативное решение сложнее, но оно существует, если вы предпочитаете тернарный оператор. То есть x + x + x + x + x + x должен анализироваться как [+ [++ [++ x x x] x x] x]. (Моя грамматика, отличная от SLR(1), дает [++ [++ [+ x x] x x] x x].) - person rici; 28.11.2017
comment
о боже, я все путаю, да, ты прав. Мы не можем вывести x+x+. - person Kostas Ayfantop; 28.11.2017
comment
Когда мы говорим левоассоциативное решение, мы имеем в виду, что можем получить слова из левого и правого ?? Итак, можем ли мы преобразовать эту грамматику (окончательную версию, которую вы опубликовали), чтобы производить слова слева?? Я не совсем понимаю серию «x» и «[» из парсера, который вы описываете. Спасибо за все, кстати, вы действительно помогаете мне понять некоторые вещи - person Kostas Ayfantop; 28.11.2017
comment
@kostas: мы говорим, что вычитание (например) является левоассоциативным, потому что мы анализируем 1 - 2 - 3 так, как если бы оно было написано (1 - 2) - 3 (=-4), а не 1 - (2 - 3) (=2). Из стандартных арифметических операторов справа ассоциируется только возведение в степень. Как левые, так и правые ассоциативные операторы могут анализироваться слева направо с помощью синтаксического анализатора LR(k); левоассоциативные операторы используют леворекурсивные произведения, а правоассоциативные операторы — правую рекурсию. Поскольку синтаксические анализаторы LL(k) не могут обрабатывать левую рекурсию, они всегда производят правоассоциативные синтаксические анализы, которые необходимо настроить... - person rici; 28.11.2017
comment
... по семантическим правилам. (Это одна из причин, по которой я не вижу смысла тратить много времени на синтаксический анализ LL(k); что более важно, грамматики LL(k) намного сложнее читать, имхо.) - person rici; 28.11.2017
comment
Я использовал […] в своем синтаксическом анализе, чтобы заключить производство в скобки, фактически написав дерево синтаксического анализа как обход предварительного заказа. Троичные продукты соответствуют тройным узлам в дереве синтаксического анализа; поскольку не все узлы являются бинарными, необходимо какое-то заключение в скобки. У меня не хватило терпения рисовать деревья в виде ASCII-арта, но рисование деревьев — хорошее упражнение для понимания синтаксического анализа, поэтому я призываю вас попробовать. - person rici; 28.11.2017
comment
@kostas, наконец, я сочувствую твоей академической карьере; здесь, в Перу, — и это не оправдание кризисом — многие университеты также не реагируют на нужды своих студентов. Удачи. - person rici; 28.11.2017