Проблемы с парсером, поиск конца параметра, возникновение конфликтов сдвига/уменьшения

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

параметр: end_parameter запятая

(Этот тип данных представляет собой просто список, поэтому нет ничего, что указывало бы на его завершение — просто он останавливается, когда элементы не разделяются запятой)

И end_parameter определен ниже и делает то, что должен. Анализатор работает с другими типами данных, распознавая правую фигурную скобку как конец, но я получаю ошибки сдвига/уменьшения, когда устанавливаю тип, заканчивающийся отсутствием запятой. У кого-нибудь есть предложения?


person Elizabeth B    schedule 13.09.2012    source источник
comment
Покажите немного больше своей грамматики, правило parameter: end_parameter comma, вероятно, не является источником вашей проблемы.   -  person phlogratos    schedule 13.09.2012
comment
Я думаю, что мой главный вопрос в том, как вы ищете отсутствие чего-то? надо как-то искать отсутствие запятой   -  person Elizabeth B    schedule 14.09.2012
comment
Нельзя искать отсутствие чего-то, потому что никогда не знаешь, последует ли что-то позже. Это похоже на проблему остановки, и доказано, что она неразрешима, см. en.wikipedia.org/wiki/Halting_problem   -  person phlogratos    schedule 14.09.2012
comment
Приведите больше примеров того, как будет выглядеть ваш ввод (возможно, с отсутствующими частями), и пример того, как вам нужен вывод, и вы, вероятно, получите ответ в течение нескольких минут. Без этого остается только гадать.   -  person Michael    schedule 02.10.2012


Ответы (1)


Вы распознаете вещи, записывая правила, которые соответствуют тому, чем они являются, а не тому, чем они не являются. Таким образом, для списка параметров, разделенных запятыми без запятой в конце, вы должны использовать:

parameter_list : parameter
               | parameter_list ',' parameter
               ;

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

Вы редко получаете конфликты из-за одного правила — конфликты обычно возникают из-за взаимодействия нескольких правил.

person Chris Dodd    schedule 13.09.2012