2

Это грамматика:Конфликт в CLR разборе

S' -> S 
S-> aBc|bCc|aCd|bBd 
B ->e 
C ->e 

Я разобран в CLR, то свёртка/свёртка возник конфликт. Что делать дальше? Я приложил свою решённую проблему ниже.

Parse Table

This is process

ответ

3

Кто-нибудь, пожалуйста, скажите мне, что делать дальше

Err ... исправить конфликт?

Это очень ясно, даже просто из последних двух спектаклей, когда парсер встречает С или D после е:

B -> e . {c, d} 
C -> e . {c, d} 

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

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

Предлагаю изменить грамматику таким образом, чтобы конфликт не возникал. Вы знаете, что вся грамматика может производить только aec, bec, aed и bed. Посмотрите, что лучше в последовательности, чтобы сделать отдельную продукцию, которая будет уменьшаться однозначно.

+1

Он уменьшил/уменьшил конфликт. Так у нас нет решения для этого? Вместо того, чтобы менять грамматику. – Niroj

+2

Ну ... некоторые генераторы парсеров позволяют вам указать приоритет определенных токенов, но, поскольку вы изучаете теорию языка и автомат, я не думаю, что вам разрешено использовать концепцию конкретной реализации в задаче. Вот ссылка на связанную статью о бизоне: http://www.gnu.org/software/bison/manual/html_node/Reduce_002fReduce.html – LeleDumbo