Как завершить бесконечную последовательность рекурсии в Bison? - PullRequest
0 голосов
/ 04 февраля 2019

Я новичок в Bison и изо всех сил пытаюсь понять, как изобразить «один или несколько» или «ноль или более» (то есть + и * в регулярном выражении).

Я пытаюсь создать грамматику вроде:

слово слово ... слово;

Однако я не уверен, где ядолжен завершить рекурсивную последовательность.Везде, где я интуитивно думаю, я должен поместить некоторые токены-терминаторы, вызывающие конфликты сдвига.

Пока мне удалось создать грамматику:

word_list 
    : word { printf("parsed first word: %s\n", $1); }
    | word_list word { printf("parsed following: %s\n", $2); };

word : WORD { $$ = $1; }

Это почти то, чего я хочу:

Вход : this is something; Выход :

parsed first word: this
parsed following: is
parsed following: something

Если я продолжу вводить ввод, он всегда будет иметь путь | word_list word, поэтомуКак я могу назначить токен, по сути, для выхода из этой рекурсии?

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

По сути, я пытаюсь создать связанный список того, что считается словом генерацией синтаксического анализатора верхнего уровня (т. Е. Надеюсь, что смогу объединить списки на нетерминалах более высокого уровня и разрешить %startвернуть один список).

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 04 февраля 2019

Рекурсия естественным образом заканчивается, когда встречается что-то отличное от WORD;вам не нужно ничего делать.Конечно, для успешного разбора следующий токен должен быть в наборе word_list FOLLOW.

...