1) для того, чтобы описать какой-нибудь язык формально, нужно описать его грамматику.
Причём сделать это не так, как делали инженеры СССР ("для общего понимания"), а чтобы компьютер тоже мог этим пользоваться.
2) если мы рассматриваем подход "с раскруткой", то в начале нет ничего,
и парсер грамматики БНФ придётся писать вручную (но всё равно по грамматике).
3) работу можно упростить, приняв предположения:
3.1) что сначала мы обходимся без лексера (грамматика идёт прямо от символов)
3.2) что мы не обрабатываем комментарии (они усложняют грамматику, а этап первый)
3.3) с пробелами не ясно - можно добавить, можно не добавлять (они же "для читаемости")
4) Я думаю, что первая грамматика должна быть без пробелов.
Используя её можно будет описать первый язык для регулярных выражений,
и затем сделать двухэтапный парсинг (регулярки-бнф), который как раз будет вырезать ПРОБЕЛЫ.
При наличии лексера будет обоснование почему пробелы можно (и пора́, и своевре́менно) вводить в синтаксис языков следующего уровня..
Написать парсер БНФ методом рекурсивного спуска нужно для того, чтобы
в памяти получить описание грамматики, и применить к нему различные алгоритмы
(выявления неоднозначностей, левой рекурсии, и т.п.).
А ты прямо кодом языка программирования (в его синтаксисе) объекты в памяти создай, и всё проверь, скажут они.
Создавайте. Я бы выбрал JavaScript - он объектный, всемирно доступный, хорошо подходит для демонстрации результатов.
Наличие такого инструмента позволит создавать уже более сложные грамматики, например с комментариями.
Вручную это пока как-то не получается...
анализируемый_файл | ε | непустой_файл непустой_файл | содержательная_часть_файла | непустой_файл_начинающийся_с_пробелов непустой_файл_начинающийся_с_пробелов | череда_пробелов_и_разделителей_строк | череда_пробелов_и_разделителей_строк содержательная_часть_файла содержательная_часть_файла | возможно_предкомментированная_грамматика_бнф | возможно_предкомментированная_грамматика_бнф финальные_комментарии_или_белое_место финальные_комментарии_или_белое_место | череда_пробелов_и_разделителей_строк | череда_комментариев_с_однострочным_в_конце | череда_пробелов_и_разделителей_строк череда_комментариев_с_однострочным_в_конце | череда_комментариев_вцп | череда_пробелов_и_разделителей_строк череда_комментариев_вцп возможно_предкомментированная_грамматика_бнф | череда_комментариев цепочка_пустых_строк_вцп грамматика_бнф | грамматика_бнф грамматика_бнф | вереница_правил вереница_правил | возможно_предкомментированное_правило | возможно_предкомментированное_правило_вцп цепочка_пустых_строк_вцп вереница_правил возможно_предкомментированное_правило_вцп | возможно_предкомментированное_правило | возможно_предкомментированное_правило цп возможно_предкомментированное_правило | многострочный_комментарий_вцп правило | многострочный_комментарий_вцп рс_вцп правило | правило правило | нетерминал_вцп правая_часть_правила | нетерминал_вцп многострочный_комментарий_вцп правая_часть_правила | нетерминал_вцп рс_вцп правая_часть_правила | нетерминал_вцп многострочный_комментарий_вцп рс_вцп правая_часть_правила | нетерминал_вцп однострочный_комментарий рс_вцп правая_часть_правила правая_часть_правила | цепочка_разделитель_частей_правила_вцп череда_альтернатив череда_альтернатив | возможно_предкомментированная_альтернатива | возможно_предкомментированная_альтернатива цепочка_альтернатив_продолжение | возможно_предкомментированная_альтернатива_вцп рс_вцп цепочка_альтернатив_продолжение | возможно_предкомментированная_альтернатива_вцп однострочный_комментарий рс_вцп цепочка_альтернатив_продолжение | возможно_предкомментированная_альтернатива_вцп многострочный_комментарий_вцп цепочка_альтернатив_продолжение | возможно_предкомментированная_альтернатива_вцп многострочный_комментарий_вцп рс_вцп цепочка_альтернатив_продолжение цепочка_альтернатив_продолжение | цепочка_разделитель_альтернатив череда_альтернатив | цепочка_разделитель_альтернатив_вцп череда_альтернатив | цепочка_разделитель_альтернатив_вцп многострочный_комментарий_вцп череда_альтернатив | цепочка_разделитель_альтернатив_вцп однострочный_комментарий рс_вцп череда_альтернатив возможно_предкомментированная_альтернатива_вцп | возможно_предкомментированная_альтернатива | возможно_предкомментированная_альтернатива цп возможно_предкомментированная_альтернатива | альтернатива | многострочный_комментарий_вцп альтернатива альтернатива | вереница_терминалов_или_нетерминалов вереница_терминалов_или_нетерминалов | терминал_или_нетерминал | терминал_или_нетерминал_вцп вереница_терминалов_или_нетерминалов терминал_или_нетерминал_вцп | терминал_или_нетерминал | терминал_или_нетерминал цп терминал_или_нетерминал | цепочка_обозначающая_ничто | терминал | нетерминал терминал | цепочка_маркирующая_начало_терминала цепочка_элементов_терминала цепочка_маркирующая_конец_терминала цепочка_элементов_терминала | элемент_терминала | элемент_терминала цепочка_элементов_терминала элемент_терминала | символ_как_есть_кроме_начала_цепочки_маркирующей_выход | символ_в_виде_шестнадцатеричного_кода символ_в_виде_шестнадцатеричного_кода | цепочка_различитель_шестнадцатеричного_кода цепочка_шестнадцатеричных_цифр цепочка_шестнадцатеричных_цифр | символ_шестнадцатеричный_цифровой | символ_шестнадцатеричный_цифровой цепочка_шестнадцатеричных_цифр нетерминал_вцп | нетерминал | нетерминал цп нетерминал | символ_подчёркивание | символ_подчёркивание символ_подчёркивание | символ_подчёркивание нетерминал_без_начального_подчёркивания нетерминал_без_начального_подчёркивания | слово_или_словосочетание | слово_или_словосочетание символ_подчёркивание слово_или_словосочетание | слово | словосочетание слово | первый_элемент_слова | первый_элемент_слова вереница_элементов_слова вереница_элементов_слова | последующий_элемент_слова | последующий_элемент_слова вереница_элементов_слова первый_элемент_слова | символ_кириллический последующий_элемент_слова | символ_кириллический | символ_арабский_цифровой словосочетание | первое_слово_словосочетания | первое_слово_словосочетания цепочка_разделитель_слов_в_словосочетании череда_слов_словосочетания череда_слов_словосочетания | элемент_череды_слов_словосочетания | элемент_череды_слов_словосочетания цепочка_разделитель_слов_в_словосочетании череда_слов_словосочетания элемент_череды_слов_словосочетания | последующее_слово_словосочетания первое_слово_словосочетания | слово последующее_слово_словосочетания | вереница_элементов_слова череда_комментариев_с_однострочным_в_конце | череда_однострочных_комментариев | череда_комментариев череда_однострочных_комментариев череда_комментариев_вцп | череда_комментариев | череда_комментариев цп череда_комментариев | элемент_череды_комментариев | элемент_череды_комментариев череда_комментариев элемент_череды_комментариев | череда_однострочных_комментариев рс_вцп | череда_многострочных_комментариев череда_однострочных_комментариев | однострочный_комментарий | однострочный_комментарий рс_вцп череда_однострочных_комментариев череда_многострочных_комментариев | многострочный_комментарий | многострочный_комментарий_вцп череда_многострочных_комментариев | многострочный_комментарий_вцп череда_пробелов_и_разделителей_строк череда_многострочных_комментариев однострочный_комментарий | символ_правая_наклонная_черта символ_правая_наклонная_черта | символ_правая_наклонная_черта символ_правая_наклонная_черта цепочка_символов_кроме_перевода_строки многострочный_комментарий_вцп | многострочный_комментарий | многострочный_комментарий цп многострочный_комментарий | символ_открывающая_круглая_скобка символ_звёздочка продолжение_комментария_документационного_многострочного | символ_правая_наклонная_черта символ_звёздочка продолжение_комментария_отладочного_многострочного продолжение_комментария_документационного_многострочного | цепочка_конец_документационного_комментария | тело_комментария_документационного_многострочного цепочка_конец_документационного_комментария тело_комментария_документационного_многострочного | элемент_комментария_документационного_многострочного | элемент_комментария_документационного_многострочного тело_комментария_документационного_многострочного элемент_комментария_документационного_многострочного | символ_как_есть_кроме_звёздочки | символ_звёздочка символ_как_есть_кроме_закрывающей_круглой_скобки цепочка_конец_документационного_комментария | символ_звёздочка символ_закрывающая_круглая_скобка продолжение_комментария_отладочного_многострочного | цепочка_конец_отладочного_комментария | тело_комментария_отладочного_многострочного цепочка_конец_отладочного_комментария тело_комментария_отладочного_многострочного | элемент_комментария_отладочного_многострочного | элемент_комментария_отладочного_многострочного тело_комментария_отладочного_многострочного элемент_комментария_отладочного_многострочного | символ_как_есть_кроме_звёздочки | символ_звёздочка символ_как_есть_кроме_правой_наклонной_черты цепочка_конец_отладочного_комментария | символ_звёздочка символ_правая_наклонная_черта цепочка_символов_кроме_перевода_строки | символ_как_есть_кроме_начала_разделителя_строк | символ_как_есть_кроме_начала_разделителя_строк цепочка_символов_кроме_перевода_строки цепочка_пустых_строк_вцп | цепочка_пустых_строк | цепочка_пустых_строк цп цепочка_пустых_строк | пустая_строка | пустая_строка продолжение_череды_разделителей_строк пустая_строка | начальный_элемент_череды_разделителей_строк начальный_разделитель_череды_разделителей_строк продолжающий_элемент_череды_разделителей_строк продолжение_череды_разделителей_строк | продолжающий_элемент_череды_разделителей_строк | продолжающий_элемент_череды_разделителей_строк продолжение_череды_разделителей_строк | продолжающий_элемент_череды_разделителей_строк продолжающий_разделитель_череды_разделителей_строк продолжение_череды_разделителей_строк начальный_элемент_череды_разделителей_строк | цепочка_разделитель_строк продолжающий_элемент_череды_разделителей_строк | цепочка_разделитель_строк начальный_разделитель_череды_разделителей_строк | цп продолжающий_разделитель_череды_разделителей_строк | цп череда_пробелов_и_разделителей_строк | цепочка_пробельный_символ_или_разделитель_строк | цепочка_пробельный_символ_или_разделитель_строк череда_пробелов_и_разделителей_строк рс_вцп | цепочка_разделитель_строк | цепочка_разделитель_строк цп цп | цепочка_пробельных_символов цепочка_пробельных_символов | цепочка_пробельный_символ | цепочка_пробельный_символ цепочка_пробельных_символов цепочка_пробельный_символ_или_разделитель_строк | цепочка_пробельный_символ | цепочка_разделитель_строк цепочка_пробельный_символ | символ_пробел | символ_табуляция цепочка_разделитель_строк | цепочка_разделитель_строк_линукс | цепочка_странный_разделитель_строк цепочка_разделитель_строк_линукс | символ_перевода_строки цепочка_странный_разделитель_строк | символ_возврата_каретки | символ_возврата_каретки символ_перевода_строки цепочка_обозначающая_ничто | символ_ничто цепочка_разделитель_частей_правила_вцп | цепочка_разделитель_частей_правила | цепочка_разделитель_частей_правила цп цепочка_разделитель_частей_правила | символ_вертикальная_черта цепочка_разделитель_альтернатив_вцп | цепочка_разделитель_альтернатив | цепочка_разделитель_альтернатив цп цепочка_разделитель_альтернатив | символ_вертикальная_черта цепочка_разделитель_слов_в_словосочетании | символ_подчёркивание цепочка_маркирующая_начало_терминала | символ_передние_лапки цепочка_маркирующая_конец_терминала | символ_задние_лапки цепочка_различитель_шестнадцатеричного_кода | символ_левая_наклонная_черта символ_кодепоинта_юникода символ_как_есть_кроме_начала_разделителя_строк | символ_как_есть_кроме_особых | символ_звёздочка | символ_задние_лапки | символ_правая_наклонная_черта | символ_закрывающая_круглая_скобка символ_как_есть_кроме_звёздочки | символ_как_есть_кроме_особых | символ_задние_лапки | символ_правая_наклонная_черта | символ_закрывающая_круглая_скобка символ_как_есть_кроме_правой_наклонной_черты | символ_как_есть_кроме_особых | символ_звёздочка | символ_задние_лапки | символ_закрывающая_круглая_скобка символ_как_есть_кроме_закрывающей_круглой_скобки | символ_как_есть_кроме_особых | символ_звёздочка | символ_задние_лапки | символ_правая_наклонная_черта символ_как_есть_кроме_начала_цепочки_маркирующей_выход | символ_как_есть_кроме_особых | символ_звёздочка символ_как_есть_кроме_особых | символ_кириллический | символ_арабский_цифровой | символ_вертикальная_черта | символ_подчёркивание | символ_левая_наклонная_черта | символ_открывающая_круглая_скобка | символ_передние_лапки символ_шестнадцатеричный_цифровой | символ_арабский_цифровой | символ_английский_эй | символ_английский_би | символ_английский_си | символ_английский_ди | символ_английский_и | символ_английский_эф символ_арабский_цифровой | символ_арабский_ноль | символ_арабский_единица | символ_арабский_двойка | символ_арабский_тройка | символ_арабский_четвёрка | символ_арабский_пятёрка | символ_арабский_шестёрка | символ_арабский_семёрка | символ_арабский_восьмёрка | символ_арабский_девятка символ_кириллический | символ_кириллический_заглавный | символ_кириллический_строчный символ_открывающая_круглая_скобка | «(» символ_закрывающая_круглая_скобка | «)» символ_звёздочка | «*» символ_правая_наклонная_черта | «/» символ_возврата_каретки | «\u000D» символ_перевода_строки | «\u000A» символ_табуляция | «\u0009» символ_пробел | «\u0020» символ_ничто | «\u03B5» символ_подчёркивание | «_» символ_передние_лапки | «\u00AB» символ_задние_лапки | «\u00BB» символ_вертикальная_черта | «|» символ_левая_наклонная_черта | «\u005C» символ_кодепоинта_юникода | «u» символ_английский_эй | «A» | «a» символ_английский_би | «B» | «b» символ_английский_си | «C» | «c» символ_английский_ди | «D» | «d» символ_английский_и | «E» | «e» символ_английский_эф | «F» | «f» символ_арабский_ноль | «0» символ_арабский_единица | «1» символ_арабский_двойка | «2» символ_арабский_тройка | «3» символ_арабский_четвёрка | «4» символ_арабский_пятёрка | «5» символ_арабский_шестёрка | «6» символ_арабский_семёрка | «7» символ_арабский_восьмёрка | «8» символ_арабский_девятка | «9» символ_кириллический_заглавный | «А» | «Б» | «В» | «Г» | «Д» | «Е» | «Ё» | «Ж» | «З» | «И» | «Й» | «К» | «Л» | «М» | «Н» | «О» | «П» | «Р» | «С» | «Т» | «У» | «Ф» | «Х» | «Ц» | «Ч» | «Ш» | «Щ» | «Ъ» | «Ы» | «Ь» | «Э» | «Ю» | «Я» символ_кириллический_строчный | «а» | «б» | «в» | «г» | «д» | «е» | «ё» | «ж» | «з» | «и» | «й» | «к» | «л» | «м» | «н» | «о» | «п» | «р» | «с» | «т» | «у» | «ф» | «х» | «ц» | «ч» | «ш» | «щ» | «ъ» | «ы» | «ь» | «э» | «ю» | «я»
См. также
Как обрабатывать комментарии?
Отредактировано Лис (2024-11-19 13:19:35)