Завдання, подане нижче, вимагає ознайомлення з формальною теорією аналізатора. Якщо ви не знаєте, що задається питанням, оскільки ви не знаєте, що означають терміни, безтекстові граматики та набори першого / наступного курсу охоплені у багатьох університетських курсах.
Я можу порекомендувати цей курс по Стенфорду , зокрема роздатковий матеріал 08 та 09 (зі сторінки 7). Я також видобув шпаргалку з цих роздаткових матеріалів - я рекомендую кожному, хто спробує цю проблему, прочитати її .
Напишіть програму або функцію, яка дає без контексту граматику, знаходить наступний набір кожного нетерміналу. Неофіційно наступний набір нетерміналів - це набір терміналів і $
(означає кінець вводу), які ви, можливо, зможете знайти після цього терміналу у дійсному реченні.
Вхід подається у вигляді одного друкованого рядка ASCII або масиву друкованих рядків ASCII. Ви можете виводити набори в будь-якому розумному форматі, використовуючи $
(як буквальний вихід, або рядок всередині набору тощо) для позначення кінця введення. Ви можете припустити, що вхід завжди дійсний відповідно до наведеного нижче формату.
Контекстна вільна граматика подається дуже спрощеним чином. Кожен рядок містить одну продукцію. Кожне виробництво - це розділений пробілом список символів. Термінал - це рядок символів, оточений апострофами (наприклад '**'
). Для простоти ви можете припустити, що термінали не містять пробілів, але було б добре, якщо ваша програма це дозволяє. Нетермінальним може бути будь-який рядок, що не містить пробілів або $
. Порожня продукція (як правило, позначається ε) - це просто лінія, що містить лише нетермінальний лівий бік. Перший рядок - це виробництво, що визначає стартовий символ.
Як приклад, наступна граматика:
S → aSa | bSb | ε
Показується як:
S 'a' S 'a'
S 'b' S 'b'
S
Приклад входів / виходів:
In:
S 'a' S 'a'
S 'b' S 'b'
S
Out:
S {'a', 'b', $}
In:
S A B C
A 'a'
A C 'b'
A
B C
B 'd' A
B
C 'e'
C 'f'
Out:
S {$}
A {'d', 'e', 'f'}
B {'e', 'f'}
C {'b', 'e', 'f', $}
In:
Start Alice Bob
Alice Charlie 'a'
Alice
Bob Bob 'a' Alice Charlie
Bob '!!!'
Charlie 'b'
Charlie
Out:
Start {$}
Alice {'a', '!!!', 'b', $}
Bob {'a', $}
Charlie {'a', $}
Виграє найкоротший код у байтах.