Все таки сложно поверить, что
полную версию записи оператора WriteLn требуется представить в виде
автоматной грамматики. Это возможно, но сложно. Рекомендую перепроверить задание и посмотреть примеры выполнения, которые вы наверняка разбирали на лекциях.
Вот я попытался набросать автоматную грамматику упрощённого оператора WriteLn с поддержкой вывода строковых констант и целых числовых в десятичной форме. Без модификаторов вывода вроде "WriteLn(15:3);". Без арифметических выражений. Для удобства восприятия я исключил из терминальных символов заглавные буквы и использовал их для обозначения нетерминальных символов. Комментарии указаны в С++ стиле (//).
Код
S->writeln(A
A->);
A->'B // начало строки
B->aB
B->bB
B->cB
... // Перечисляем все буквы
B->zB
B->!B // Пошли символы
B->''B // Одинарная кавычка только в экранированном варианте (2 раза подряд)
... // Все остальные символы
B->',C // Конец строки с пробелами после запятой
B->',E // Без пробелов
C->_C // Под подчёркиванием я имел ввиду пробел
C->_E
A->0D // Начало числа
A->1D
... // Все остальные цифры
A->9D
A->-D // Для отрицательного числа
A->+D // Можно указывать и +
D->0D
D->1D
... // Все остальные цифры
D->9D
D->,C // Конец числа с пробелами
D->,E // Конец числа без пробелов после запятой
E->'B // E аналогично A, но не может заканчивать оператор (нет правила E->);)
E->0D
E->1D
...
E->9D
E->-D
E->+D
Надеюсь я нигде не ошибся.
Сильно упрощённый вариант записи оператора и уже такие сложности в грамматике... Устраивает такой вариант?