Насколько легко найти строку, которая приводит к конфликту в парсере SLR (1) по сравнению с LR (1) - PullRequest
0 голосов
/ 15 декабря 2018

Известно, что парсеры SLR (1) обычно имеют меньше состояний, чем LR (1).Но легче или труднее из-за этого найти строку, которая приводит к конфликту в парсере SLR (1) по сравнению с LR (1) и почему?

Заранее спасибо.

1 Ответ

0 голосов
/ 15 декабря 2018

Допустим, у вас есть некоторый CFG, и вы создаете парсер SLR (1) и парсер LR (1) для этой грамматики.Если у вас нет конфликтов сдвига / уменьшения или уменьшения / уменьшения, то все готово - нет никаких строк, которые приводят к конфликтам.С другой стороны, если такой конфликт существует, то да, есть строка, которая приводит к конфликту.Вы можете найти такую ​​строку, работая в обратном направлении через автомат: найти путь от начального состояния до состояния с конфликтом сдвиг / уменьшение или уменьшение / уменьшение и выписать серию терминалов и нетерминалов, которые ведут вас туда.Если это все терминалы, отлично!Вы получили свою строкуЕсли там есть какие-либо нетерминалы, так как парсер LR отслеживает самый правый вывод в обратном порядке, выберите самый правый нетерминал в найденной последовательности и повторите этот процесс, чтобы расширить его дальше.В конце концов вы получите вашу строку.

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

...