У цьому завданні ви повинні написати програму, яка читає регулярний вираз і генерує іншу програму, яка виводить, чи приймається введення рядка цим регулярним виразом. Вихід повинен бути програмою, написаною тією ж мовою, що і ваша публікація.
Вхідні дані
Вхід - це регулярний вираз r, що відповідає наступному ABNF (початкове правило виробництва REGEX
):
REGEX = *( STAR / GROUP / LITERAL / ALTERNATIVE )
STAR = REGEX '*'
GROUP = '(' REGEX ')'
LITERAL = ALPHA / DIGIT
ALTERNATIVE = REGEX '|' REGEX
Якщо введення не відповідає цій граматиці, поведінка вашої програми не визначена.
Інтерпретація
Інтерпретуйте вхід як регулярний вираз, де *
зірка Клінова (що означає повтор лівого аргументу нульовий або більше разів ), |
є альтернативою, (
а )
група і жоден оператор зовсім не об'єднані. Групування має перевагу над зіркою, зірка має перевагу над конкатенацією, конкатенація має перевагу над альтернативною.
Кажуть, що рядок прийнято, якщо регулярний вираз відповідає всій рядку.
Вихідні дані
Вихід програми - це інша програма, написана на тій самій мові, що і ваша заявка, яка читає рядок s у визначеному для виконання режимі під час виконання, виводить, чи приймає r , а потім припиняє. Вихід може бути виконаний визначеним користувачем способом, хоча для прийнятих та відхилених програм повинно бути лише два різних виходи.
Ви можете припустити, що вхід вашої вихідної програми ніколи не перевищує 2 16 -1 байт.
Обмеження
Ні ваша програма, ні будь-яка програма, породжена вашим поданням, не можуть використовувати вбудовані функціональні можливості або бібліотеки
- відповідні регекси
- перетворити регулярні вирази
- складати регулярні вирази
- генерувати парсери з граматики
- спростіть проблему таким чином, щоб ваше подання стало банальним
Оцінка балів
Оцінка вашого подання - це кількість символів. Виграє подання з найменшим балом.
Тестові шафи
Усі тестові масиви містять регулярний вираз, набір прийнятих рядків, набір відхилених рядків та приклад програми на C99, яка є дійсним висновком (гіпотетичного) подання C99.
(порожній регулярний вираз)
Приймаються рядки
- (порожній вхід)
Відхилені рядки
- foo
- бар
- баз
- quux
Приклад програми
#include <stdio.h>
int main() {
char input[65536];
gets(input);
return input[0] != 0;
}
(b|)(ab)*(a|)
( a
та b
чергування)
прийнятих рядків
a
ba
abababababa
abab
відхилені рядки
afba
foo
babba
Приклад програми
#include <stdio.h>
int main() {
char input[65536];
int state = 0;
for (;;) switch (state) {
case 0: switch (getchar()) {
case 'a': state = 1; break;
case 'b': state = 2; break;
case EOF: return 0;
default: return 1;
} break;
case 1: switch (getchar()) {
case 'b': state = 2; break;
case EOF: return 0;
default: return 1;
} break;
case 2: switch (getchar()) {
case 'a': state = 1; break;
case EOF: return 0;
default: return 1;
} break;
}
(0|1(0|1)*)(|A(0|1)*1)
(двійкові числа з плаваючою комою)
прийнятих рядків
- 10110100
- 0
- 1A00001
відхилені рядки
- 011
- 10А
- 1A00
- 100A010
return (regex.match(stdin) is not null)
не дозволяється.