ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » другое разное » Как получить русские lex и yacc


Как получить русские lex и yacc

Сообщений 1 страница 10 из 10

1

Шаг 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)

0

2

Обозначим функции программ буквами:
Л - лексер
П - парсер
Ш - шаблонизатор
Ф - полезная функция утилиты

Обозначим языки буквами
Р - русский
А - английский

Верхним индексом будем записывать откуда-куда работает функция, нижним индексом - на чём написан её текст.

Мы начинаем с

lexАA<-A = ЛАA<-A, ПАA<-A, ШАA<-A, ФА
yaccАA<-A = ЛАA<-A, ПАA<-A, ШАA<-A, ФА

главный алгоритм преобразовывает нечто в памяти в другое в памяти, там языки не важны (мне так сейчас навскидку кажется).

А закончить надо комплектом
лексерРР<-Р = ЛРР<-Р, ПРР<-Р, ШРР<-Р, ФР
парсерРР<-Р = ЛРР<-Р, ПРР<-Р, ШРР<-Р, ФР

На вход могут подаваться грамматики
Г - грамматика

Верхним индексом будем записывать функцию программы и алфавит языка описываемого грамматикой, нижним индексом - каким языком алфавитом написан текст грамматики.

Например
[html]Г<sub>А</sub><sup>Л<sub>.</sub><sup>.&lt;-Р</sup></sup>[/html] - грамматика русского лексера, написанная в английском синтаксисе

Ещё надо учесть транслятор (компилятор/интерпретатор)
ТА.<-А - это gcc который компилирует английский текст и сам написан на английском языке
ТА.<-Р - это "русифицированный" gcc который компилирует русский текст, но сам написан на английском языке
ТР.<-Р - это транслятор, написанный на русском языке, который принимает на вход русский язык

Шаг 1:
пишем ГАЛ^Р
пишем ГАП^Р
пишем ФРA<-A, это функция "подстановки в шаблон"
но есть зависимости времени сборки от
ЛАA<-A (на вход подаётся ГАЛ^Р )
ПАA<-A (на вход подаётся ГАП^Р )
Компилируем код при помощи
ТА.<-Р (на вход подаём ФРA<-A), к результату линкуем Л^Р и П^Р)

Шаг 2:
пишем ЛАР<-A,
собираем при помощи ЛАA<-A и ПАA<-A

(...расписывать лень...)

Вообще мне это проверку типов напоминает.
Может написать маленькую прожку, чтобы она компилятором проверилась?

Отредактировано Лис (2023-03-31 20:12:07)

0

3

Пару мыслей... Про лексер и генератор лексера. В лексере сложных моментов два: разбор чисел и разбор идентификаторов. Их можно сделать или на регулярных выражениях (то есть использовать библиотеку регулярок) или на таблицах ( с ними придется повозиться) Использовать lex большой необходимости нет, проще сразу делать свой русский генератор лексера.
С парсером хуже. С одной стороны yacc на вход получает токены, а это практически числа, с другой  прикрутить к нему русифицированный си будет не просто

0

4

Я думаю, что описание грамматики flex можно прочитать
тут:
https://github.com/westes/flex/blob/master/src/scan.l
и тут:
https://github.com/westes/flex/blob/master/src/parse.y

бизоновая грамматика ему наверное нужна потому, что правила-действия записываются на языках си и с++,
а это значит, что нужно уметь обрабатывать вложенные скобки. Можно было бы обойтись счётчиком, но со стеком наверняковее.

0

5

Что не так с программой flex?

1) нужно придумать русскоязычное слово вместо латинского lex и использовать только его, иначе латиница расползается по документации
2) самое главное - на вход поступают байты, а должно на вход поступать что угодно (токены)
  без этого нельзя сделать два уровня lex - отдельно для UTF-8 и отдельно для синтаксиса языка
3) утилита должна была быть сынтегрирована с большим количеством компиляторов и платформ, из-за этого в ней много опций и мелких деталей, что удлинняет изучение
  поэтому можно написать новый lex, главное чтобы у него выходной интерфейс выдавал то, что нужно на вход yacc
4) правила имеющегося lex без имён и не в ABNF
  непонятно, хорошо это или плохо
5) метаинформация flex недоступна в тексте программы
  и без имён правил такой метаинформации меньше

Всё это поводы для того, чтобы написать новую программу для генерирования ДКА-автоматов по входному языку

программа lex группирует буквы в куски текста, поэтому можно назвать её "кускователь" (сокращённо "кус").
программа yacc группирует (связывает) куски текста по правилам, можно назвать её "связыватель" (сокращённо "связ");

Отредактировано Лис (2023-07-26 05:29:09)

0

6

Неужели Лис действительно не допёр до проблемы курицы и яйца, которая имеет место при попытке сделать всё на русском языке? Вот что дают амбиции быть главным в сумме с лапками (т.е. с некомпетентностью и отсутствием опыта в решении таких задач). Сумма амбиций и некомпетентности - это идеальный рецепт для неудачи. Бывает, конечно, что дуракам везёт, но Лис уже много лет не сдвинулся с мёртвой точки. Я же уже несколько лет назад объяснял, что английский язык в инструментах разработки образует порочный круг, который не нужно пытаться пройти с нуля, потому что у круга нет нуля. Нуль есть у спирали и это транзисторы. Если же речь идёт о средствах разработки, то нужно просто перекрасить этот круг в другой цвет, начиная с любой точки и действуя в любом порядке. Главное - нужно реально красить, а не только одни планы строить. Этим я и занимался в проекте ЯОС, предприняв специальные усилия к тому, чтобы частично перекрашенный круг оставался работоспособным в течение всего срока перекрашивания, который неизбежно растянется. Поскольку Лис пытается строить свой план начиная от русифицированного Си, а не от транзисторов, он всё равно уже не сможет соблюсти условие полной кирилличности. Компилятор-то внутри остаётся на английском и это миллионы строк. А значит, все вот эти самоограничения на использование английского - это в любом случае лицемерие. Также компилятор и линукс, в котором он живут, остаются заимствованными из недружественных стран. Поэтому и заявления о том, что "мы делаем всё своё" были бы лицемерием. Мне казалось, что Лис отверг план перекрашивания круга по той причине, что это не его план (т.е. из-за того, что если Лис не главный, то так неинтересно), А теперь смотрю - может и правда не понял просто. Потому что фактически всё равно занялся перекрашиванием круга, попутно долепляя к нему совершенно лишние детали. Ну или морочит голову немногочисленным собеседникам, чтобы максимально подавить реально полезные действия по русификации и создать максимально ущербную пародию на процесс русификации ИТ. Склоняюсь именно к этой версии уже давно. Во всяком случае, lex и yacc вообще не нужны, когда нужно создавать не по 10 языков программирования в день, а всего 2 или 3. Возможно, Лис прочитал книгу Дракона, где про них написано и решил, что там написана правда. Но, как я уже говорил, лексер и парсер для простого языка программирования спокойно пишутся руками, на практике они зачастую так и написаны, и лично я это тоже неоднократно делал. Лапками, конечно, они не пишутся. Но як слишком здоровый, он может и на рога поднять. Им нужен зайчик или мышка (полевая, а не компьютерная).

Отредактировано БудДен (2023-07-28 08:12:58)

0

7

Вот частично русифицированный рукописный лексер активного Оберона:

https://tvoygit.ru/budden/ja-o-s/src/br … canner.Mod

Написанный мной лексер тоже где-то есть, но лень искать. Хотя не совсем лень.

https://tvoygit.ru/budden/jar/src/branc … очего.lisp

- это уже написанный лично мной фрагмент лексера старой версии Яра - остальные
части лексера лежат по соседству.

В обоих не используется ни генератор лексеров, ни регулярные выражения. Как говорится, если у вас была проблема
и вы решили применить для неё регулярные выражения, то теперь у вас две проблемы. Не знаю насчёт моего лексера, но лексер активного Оберона
достаточно быстрый.

Отредактировано БудДен (2023-07-28 08:16:45)

0

8

> Вот частично русифицированный рукописный лексер активного Оберона:
> https://tvoygit.ru/budden/ja-o-s/src/br … canner.Mod

Это хорошо, что есть такая программа с текстом. Хорошо для тех людей, которым нравится Оберон. Но если рассматривать финальный результат, который надо получить, должен ли код на Обероне там быть? Он русифицированный, но... зависимость по документации сохранится, а её надо разорвать.

> Написанный мной лексер:
> https://tvoygit.ru/budden/jar/src/branc … очего.lisp

Ты большой молодец, что пишешь программы, и делишься ими под коммунистическими лицензиями. Хорошо для тех людей, которым нравится lisp. Но если рассматривать идеальный результат, должен ли там быть lisp? Он русифицированный, но...

> В обоих не используется ни генератор лексеров, ни регулярные выражения.

По моему мнению неиспользование доказательного программирования и слабая документированность - это недостатки, а не достоинства как ты предлагаешь считать.

0

9

Лис, у тебя нет ни финального результата, ни идеального. Не могу понять, что ты пытаешься сказать про "зависимость по документации". Зависимость по документации решается созданием документации, и в случае ЯОС такая документация есть:

https://tvoygit.ru/budden/ja-o-s/src/br … е-языка.md

Задача "сделать всё своё с нуля" тобой не решается, а значит, Оберон подходит в качестве отправной точки не хуже, чем Си, как минимум. Что ты видишь в качестве конечного результата я не знаю, да и не важно, потому что предвижу, что никакого результата не будет всё равно - тенденции за время твоей деятельности вполне позволяют так предполагать в качестве основной версии.

Но я говорил вообще не про то, понятно, что переводить тему ты любишь и умеешь. Т.е. совершенно неважно, на чём написаны эти два примера и кто их написал. Я говорил о том, что ты решаешь задачу, которую вообще не нужно решать. Генераторы лексера и парсера, такие как lex и yacc, очень слабо относятся к доказательному программированию, там грабель сколько хочешь.

Вот тебе реализация языка Си без lexx и yacc: https://github.com/TinyCC/tinycc/blob/m … texi#L1026 - весьма известный проект от автора QEMU (ну, если не считать, что в QEMU был русский в качестве негра, который, возможно, и является реальным автором). Написано не мной, на Си, и язык, который компилируется - тоже Си. Теперь ты не можешь перевести тему на Оберон или лисп. Посмотрим, что ты будешь дальше делать.

Просто ты некомпетентен в том, чем пытаешься рулить, отсюда и качество твоего стратегического (и тактического) планирования.

Отредактировано БудДен (2023-07-28 18:03:54)

0

10

> Генераторы лексера и парсера очень слабо относятся к доказательному программированию

Верно. Потому что их не отнесли. Но могли бы.

> Я говорил о том, что ты решаешь задачу, которую вообще не нужно решать.

Ты это уже говорил раньше, я знаю твою точку зрения и частично согласен с ней. Но не полностью.

> Оберон подходит в качестве отправной точки не хуже, чем Си, как минимум.

Твоя точка зрения имеет право на существование, ты можешь пиарить твой подход другим людям, для этого на этом форуме есть специальный раздел. Но я животное, и твои аргументы на меня не действуют (не вообще, а по этому конкретному вопросу). Потому что моя логика основывается на других фактах, и размышления приводят к другим выводам.

C точки зрения интернета неважно где ты напишешь твои мысли - поисковики везде ищут одинаково.

> не важно, потому что предвижу, что никакого результата не будет всё равно

Просто не трать время на этот форум тогда.
Иди к Юрию на compiler.su, он специалист по разработке языков с экспертизой - не подкопаться, ты сможешь писать комментарии к его статьям.

> ты некомпетентен в том, чем пытаешься рулить, отсюда и качество твоего стратегического (и тактического) планирования.

Такая тема где-то уже была, наткнусь - слинкую.

Отредактировано Лис (2023-07-28 19:40:36)

0


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » другое разное » Как получить русские lex и yacc