← Все публикации

Формальные грамматики и как их описать

В описании любого нормального формального языка есть смешные таблички о том, из чего строится синтаксис. Там чаще всего или стрелочки с варицаиями или текстовые с двоеточиями. Вот это текстовое с двоеточиями называется формой Бэкуса-Наура, и напоминает конструктор лего для описания языка: простые обозначения из которых собирается почти что угодно. Типа вот для номера телефона, записываемого в форме строго типа +7 (495) 555-66-77 можно составить описание:

<номер> ::= "+7" <пусто> "(" <цифра> <цифра> <цифра> ")" <пусто> <номер>
<номер> ::= <цифра> <цифра> <цифра> <дефис> <цифра> <цифра> <дефис> <цифра> <цифра>
<цифра> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<пусто> ::= " "
<дефис> ::= "-"

Отдельные кусочки в угловых скобочках можно называть, например, токенами. Мне вот лично очень нравится вот эта эдакая **каскадность **описания: по традиции того как БНФ записываются, самая скучная конкретика идёт в конце, а читая подряд сверху вниз ты на каждой строчке ловишь небольшое предвкушение что да тут что-то новое, но недостающие термины мне сейчас объяснят в следующей строке. Главное держать в памяти что там было и попутно разворачивать эту головоломку. Есть в этом что-то поэтическое, как будто тебе дораскрыавют персонажа по шагам.

Самое прикольное что по БНФ можно расписывать и какие-то более глупые штуки типа вот например "типичный гороскоп" в духе "Сегодня Меркурий благоволит успех. Не упустите момент":

<horo> ::= <start> <space> <prediction> <space> <advice>
<start> ::= "Сегодня" | "На этой неделе" | "В ближайшее время"
<prediction> ::= <subject> <space> <verb> <space> <object>
<subject> ::= "Меркурий" | "Юпитер" | "удача" | "звезды"
<verb> ::= "благоволит" | "способствует" | "принесет" | "указывает на"
<object> ::= "успех" | "перемены" | "важную встречу" | "финансовую удачу"
<advice> ::= "Не упустите момент" | "Будьте внимательны" | "Прислушайтесь к интуиции"

Ну или можно вместо гороскопа взять какое-то типа "бизнес-письмо" или что-то такое. На некоторых курсах таким паттернам и учат, просто возможно немного более высокоуровнево. Это нормально, потому что естественные языки будут обрастать своими правилами своей грамматики и деформации языка, которым обычно нужно больше контекста чем аналогичным токенам в формальных языках, чтобы фразы звучали некоряво, но выразительность "всех возможных вариантов" поражает. Чем-то рифмуется с таблицами Кэли.

Но прикольно, что в таких применениях и без всякого эй!ай! получается немножко магии когда задаёшь все результаты и получаешь в ответ правдоподобно звучащий текст.
🔮🏴‍☠️

Этот же пост в Telegram ↗