Шаг 1, написать шаблонизатор на русифицированном Си
а) написать шаблонизатор (на русифицированном Си)
Шаблонизатор прикручивается и работает
Но так как он читает грамматику, а грамматика на английском, то это не полностью русский код.
============================================================================================================
Шаг 2, UTF-8 -> lexer1
а) Глядя на определение UTF-8 надо:
а.а) написать .lex-грамматику для UTF-8 по-английски (она потребуется для того, чтобы lexer1 мог парсить UTF-8)
а.б) при помощи flex сгенерировать лексер lexer1
parser1 умеет разбирать UTF-8,
однако состоит из английского кода, сгенерированного программой lex
============================================================================================================
Шаг 3, lex -> lex1
а) Глядя на грамматику lex (она же есть в исходниках?)
а.а) Написать по-английски (потому что bison умеет только так) русскую .yacc-грамматику для lex
(то есть, сама она по-английски, но токены там это русские буквы)
а.б) при помощи bison сгенерировать парсер parser1
б) прикрутить lexer1 к parser1
б.а) написать действия в грамматику (на си, или на русифицированном си, если получится)
б.б) написать алгоритм построения ДКА (на русифицированном си)
б.в) отладить эту программу, назовём lex1
lex1 умеет читать utf-8, и его грамматика позволяет читать правила, записанные по-русски.
На выходе он генерирует русифицированный си.
lex1 скомпонован из английского кода, сгенерированного стандартным lex и стандартным bison, и русифицированного си
этот генератор сможет парсить русские исходники грамматики, а так же генерировать исходники на русифицированном си
(потребуется ещё шаблонизатор в составе)
============================================================================================================
Шаг 4, yacc -> yacc1
а) глядя на грамматику yacc надо:
а.а) написать .yacc-грамматику по-английски, понимающую русский синтаксис (она потребуется для того, чтобы yacc1 мог парсить русские правила)
а.б) при помощи bison сгенерировать parser2
а.в) прикрутить lexer1 к parser2
а.г) написать алгоритм построения таблиц LALR (на русифицированном си)
а.д) прикрутить шаблонизатор
а.е) отладить эту программу yacc1
yacc1 умеет читать utf-8, понимает русифицированные исходники, генерирует русифицированный Си
однако состоит из английского кода (сгенерированного утилитой bison), английского кода parser1 и кода на русифицированном Си для генерации таблиц LALR
============================================================================================================
Шаг 5, Переписать шаблонизатор, используя lex1 и yacc2
это позволит грамматике шаблонизатора быть написанной на русском языке
кирилличность исходников увеличится
Нельзя переписать шеблонизатор раньше шага Д, так как неизвестно, нужна ли ему КС-грамматика, вероятно нужна.
============================================================================================================
Шаг 6, UTF8->lexer2
а) Глядя на определение UTF-8 надо:
а.а) написать .lex-грамматику для UTF-8 по-русски (она потребуется для того, чтобы lexer2 мог парсить UTF-8)
а.б) при помощи lex1 сгенерировать лексер lexer2
============================================================================================================
Шаг 7, lex -> lex2
а) Глядя на грамматику lex (она же есть в исходниках?)
а.а) Написать по-русски грамматику (потому что yacc1 умеет русские буквы) русскую .yacc-грамматику для lex2
(то есть, сама она по-русски, и токены там это русские буквы)
а.б) при помощи yacc1 сгенерировать парсер parser3
утилита lex2 написана целиком на русифицированном си (parser3 - это та часть, которая генерируется, она тоже на русифицированном си)
============================================================================================================
Шаг 8, yacc -> yacc2
а) глядя на грамматику yacc надо:
а.а) написать .yacc-грамматику по-русски, понимающую русский синтаксис (она потребуется для того, чтобы yacc2 мог парсить русские правила)
а.б) при помощи yacc1 сгенерировать parser4
а.в) прикрутить lexer2 к parser4
а.г) написать алгоритм построения таблиц LALR (на русифицированном си), исправления будут только в части использования лексера
а.д) отладить эту программу yacc2
yacc2 умеет читать utf-8, понимает русифицированные исходники, генерирует русифицированный Си
и состоит из русского кода (сгенерированного утилитой yacc1), русского кода parser3 и кода на русифицированном Си для генерации таблиц LALR
============================================================================================================
Шаг 9
используя утилиты lex2 и yacc2 написать язык программирования, похожий на русифицированный Си
============================================================================================================
Шаг 10, переписать шаблонизатор на новый язык программирования
============================================================================================================
Шаг 11
Спортировать lex2 на новый язык программирования -> lex3
============================================================================================================
Шаг 12
Спортировать yacc2 на новый язык программирования -> yacc3
============================================================================================================
Шаг 13, переписать язык из шага И на использование lex3 & yacc 3
============================================================================================================
Шаг 14, финальное документирование
Есть язык программирования ЯП2, у него есть синтаксис, и неважно как этот язык там работает.
Есть утилиты lex3 и yacc3, написанные на языке ЯП2 и неважно откуда и как они взялись,
потому что алгоритмы построения ДКА известны, таблиц LALR известны.
Здесь нехватает описания того, как ЯП2 генерирует выполняемый код,
но он и не генерирует, он составляет таблицы и использует шаблонизатор.
А там все происходит магически.
============================================================================================================
Почему нельзя просто:
0) написать на языке Си интерпретатор языка ЯП2
1) написать описание синтаксиса языка ЯП2
2) написать на языке ЯП2 алгоритм построения ДКА
3) написать на языке ЯП2 алгоритм построения LALR-таблиц
4) написать на языке ЯП2 программу-шаблонизатор
5) написать на языке ЯП2 lex3 и yacc3
Писать грамматику языка ЯП2 в этом случае придётся на английском и это лишняя работа,
это делать не хочется, потому что в моём варианте синтаксис этого языка описывается уже на кириллических грамматиках,
а если делать "в лоб", то они ещё будут не готовы
============================================================================================================
Ранее по теме:
Как-же, как-же, написать нам русский yacc ?
Написать интерпретатор языка 1Скрипт на C
Генерирование процессорного кода от ассемблера через LLVM
Ланит-Терком пилит свой «РуСи»
Русский язык - самый-самый. И точка.
Отредактировано Лис (2023-04-01 16:24:54)