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

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

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


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » Транспилятор в Си от Юрия » Lex и кириллица в кодировке UTF-8. Возможно ли?


Lex и кириллица в кодировке UTF-8. Возможно ли?

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

1

Может ли lex (flex) разбирать кириллицу в кодировке UTF-8? Для ответа на этот вопрос проведем небольшой эксперимент.
Создадим новый текстовый файл с именем new.ll. Откроем его в редакторе и добавим следующее содержание:

Код:
%{
#include <stdio.h>
%}

bom     \xEF\xBB\xBF
white   [ \t]


digit    [0-9]
hex_digit   {digit}|[aA]|[bB]|[cC]|[dD]|[eE]|[fF]
latin    [a-zA-Z]
cyrillic1 	\xD0[\x81\x90-\xBF]
cyrillic2 	\xD1[\x80-\x8F\x91]
cyrillic	{cyrillic1}|{cyrillic2}
letter    {cyrillic}|{latin}
%%
stop|стоп            { return 0;}
если|if            	{ puts("Ключевое слово 'если'"); }
иначе|else            { puts("Ключевое слово 'иначе'"); }
цикл|do            	{ puts("Ключевое слово 'цикл'"); }
пока|while            { puts("Ключевое слово 'пока'"); }
для|for            	{ puts("Ключевое слово 'для'"); }

{letter}({letter}|{digit}|_)* 	{ puts("Идентификатор"); }
0(b|д)(0|1)+        	{ puts("Двоичная константа"); }
0x{hex_digit}+        	{ puts("Шестнадцатиричная константа"); }
{digit}{digit}*         { puts("Целая константа"); }

"="                { puts("Токен 'ПРИСВОИТЬ'"); }
"+"                { puts("Токен 'ПЛЮС'"); }
"-"                { puts("Токен 'МИНУС'"); }
"*"                { puts("Токен 'ЗВЕЗДОЧКА'"); }
"/"                { puts("Токен 'СЛЭШ'"); }
"("                { puts("Токен 'Л_СКОБКА'"); }
")"                { puts("Токен 'П_СКОБКА'"); }
"{"                { puts("Токен 'Л_ФИГ_СКОБКА'"); }
"}"                { puts("Токен 'П_ФИГ_СКОБКА'"); }
"["                { puts("Токен 'Л_КВ_СКОБКА'"); }
"]"                { puts("Токен 'П_КВ_СКОБКА'"); }
";"                { puts("Токен 'ТОЧКА_С_ЗАПЯТОЙ'"); }
{white}             	{ ;  }
\n                  	{ ; }
{bom}               	{ ;  }
.                   	{ puts("Неизвестный символ"); }

После сохранения, в консоли генерируем С-файл командой: flex -8 -o new.c new.ll
Если все прошло благополучно, то появится новый файл с именем new.c. Скомпилируем его командой: gcc new.c -o new -lfl
Если компилятор ругается, что не может найти библиотеку, попробуйте вместо ключа -lfl -ll. В Linux может понадобиться установить дополнительный пакет командой: sudo apt-get install libfl-dev
Справившись с этим, запускаем на исполнение: ./new Программа ждет ввода. Попробуем скормить ей текст следующего содержания:

цел следующий_символ (цел индекс)
{
симв врем = строка [индекс];
индекс = индекс +10;
0b00110011
0д1111110
0x1234abcdef
}

Лично у меня программа справилась с разбором, вернув следующий результат:

Код:
Идентификатор
Идентификатор
Токен 'Л_СКОБКА'
Идентификатор
Идентификатор
Токен 'П_СКОБКА'
Токен 'Л_ФИГ_СКОБКА'
Идентификатор
Идентификатор
Токен 'ПРИСВОИТЬ'
Идентификатор
Токен 'Л_КВ_СКОБКА'
Идентификатор
Токен 'П_КВ_СКОБКА'
Токен 'ТОЧКА_С_ЗАПЯТОЙ'
Идентификатор
Токен 'ПРИСВОИТЬ'
Идентификатор
Токен 'ПЛЮС'
Целая константа
Токен 'ТОЧКА_С_ЗАПЯТОЙ'
Двоичная константа
Двоичная константа
Шестнадцатиричная константа
Токен 'П_ФИГ_СКОБКА'

Вывод: lex (flex) может быть успешно использован для создания компилятора русского языка программирования.
Показанный пример носит иллюстративный характер и не претендует на безошибочность для всех случаев.

Отредактировано Евгений (2023-09-23 09:44:44)

0

2

1) Да, такой вариант написан кажется где-то в стандарте Unicode (что при желании всё-таки можно использовать flex). Проблемы там с диапазонами символов, буквой 'Ё', обработкой ударе́ний.

2) Есть неэффективное, но решение - Lex принимает байты, выдаёт на выходе буквы. А уже от уровня букв дальше как получится (либо yacc-ом, либо своим алгоритмом).

3) Есть и альтернативные новые лексеры, которые уже умеют UTF-8 (но я ни одним не пользовался, кроме gplex, а он не считается).

4) Lex в любом случае придётся переписывать (потому что он написан не на кириллице, потому что при его написании использовался шаблонизатор М4)

5) Появилось новое требование к редактированию текстов, которого не было во времена создания Lex - двунаправленность. Теперь нужно не просто отслеживать позиции символов (такой механизм в Lex встроен), но и заменять одни конструкции на другие на всю глубину модели Смысл-Текст (т.е. меняем смысл и должны быть способны модифицировать текст).

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

0

3

Если есть возможность писать на flex и bison (первый до уровня букв, второй всё остальное), что же останавливает нас, как проект? Вон у NuShaman есть какой-то рекурсивный спуск, но нет массивов. Массивы он хочет ассоциативные. Поэтому надо сделать какое-нибудь дерево (например красно-чёрное дерево) на русифицированном Си, и инструкции как такой библиотекой пользоваться (как инсталлировать, как линковать со своим проектом). Без подробных описаний и рассказов что и как, людям очень сложно вливаться в проекты (например в виртуальную машину никто не хочет).

Отредактировано Лис (2023-09-23 04:14:36)

0

4

Код:
/*
A flex program consists of three sections, separated by %% lines.
The first section contains declarations and option settings.
The second section is a list of patterns and actions, and
the third section is C code that is copied to the generated scanner, usually small routines related to the code in the actions.
 
code inside of % { and % } is copied through verbatim near the beginning of the generated C source file.
it may just set up variables.
*/

%{
#include <stdio.h>
#include "semantics.h"
#include "bison-grammar.tab.h"

%}

%option bison-bridge
%option noyywrap

%%
%{
/* Codepoint надо перевести в кодировку UTF-8 */
        fprintf(stderr, "yylex is called\n");
%}

%{
	/* буквы под знаком ударения */
%}
\xD0\xB0\xCC\x81 { fprintf(stderr, "CHECKPOINT1 ");yylval->symbol.isStressed = true; yylval->symbol.code = 1; fprintf(stderr, "CHECKPOINT3 "); return A; }
\xD0\xB5\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return E; }
\xD1\x91\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return JO; }
\xD0\xB8\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return I; }
\xD0\xBE\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return O; }
\xD1\x83\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return U; }
\xD1\x8B\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return Y; }
\xD1\x8D\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return EH; }
\xD1\x8E\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return JU; }
\xD1\x8F\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return JA; }

\xD0\x90\xCC\x81 { fprintf(stderr, "CHECKPOINT2 ");yylval->symbol.isStressed = true; yylval->symbol.code = 1; fprintf(stderr, "CHECKPOINT4 "); return A; }
\xD0\x95\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return E; }
\xD0\x81\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return JO; }
\xD0\x98\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return I; }
\xD0\x9E\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return O; }
\xD0\xA3\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return U; }
\xD0\xAB\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return Y; }
\xD0\xAD\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return EH; }
\xD0\xAE\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return JU; }
\xD0\xAF\xCC\x81 { yylval->symbol.isStressed = true; yylval->symbol.code = 1; return JA; }


%{
	/* буквы склеенные с диактрическими знаками */
%}
\xD0\x95\xCC\x88 { return JO; }
\xD0\xB5\xCC\x88 { return JO; }
\xD0\x98\xCC\x86 { return JJ; }
\xD0\xB8\xCC\x86 { return JJ; }

%{
	/* Заглавные буквы */
%}
\xD0\x90 { /* Codepoint = "\x04\x10"*/ return A; }
\xD0\x91 { /* Codepoint = "\x04\x11"*/ return B; }
\xD0\x92 { /* Codepoint = "\x04\x12"*/ return V; }
\xD0\x93 { /* Codepoint = "\x04\x13"*/ return G; }
\xD0\x94 { /* Codepoint = "\x04\x14"*/ return D; }
\xD0\x95 { /* Codepoint = "\x04\x15"*/ return E; }
\xD0\x81 { /* Codepoint = "\x04\x01"*/ return JO; }
\xD0\x96 { /* Codepoint = "\x04\x16"*/ return ZH; }
\xD0\x97 { /* Codepoint = "\x04\x17"*/ return Z; }
\xD0\x98 { /* Codepoint = "\x04\x18"*/ return I; }
\xD0\x99 { /* Codepoint = "\x04\x19"*/ return JJ; }
\xD0\x9A { /* Codepoint = "\x04\x1A"*/ return K; }
\xD0\x9B { /* Codepoint = "\x04\x1B"*/ return L; }
\xD0\x9C { /* Codepoint = "\x04\x1C"*/ return M; }
\xD0\x9D { /* Codepoint = "\x04\x1D"*/ return N; }
\xD0\x9E { /* Codepoint = "\x04\x1E"*/ return O; }
\xD0\x9F { /* Codepoint = "\x04\x1F"*/ return P; }
\xD0\xA0 { /* Codepoint = "\x04\x20"*/ return R; }
\xD0\xA1 { /* Codepoint = "\x04\x21"*/ return S; }
\xD0\xA2 { /* Codepoint = "\x04\x22"*/ return T; }
\xD0\xA3 { /* Codepoint = "\x04\x23"*/ return U; }
\xD0\xA4 { /* Codepoint = "\x04\x24"*/ return F; }
\xD0\xA5 { /* Codepoint = "\x04\x25"*/ return KH; }
\xD0\xA6 { /* Codepoint = "\x04\x26"*/ return C; }
\xD0\xA7 { /* Codepoint = "\x04\x27"*/ return CH; }
\xD0\xA8 { /* Codepoint = "\x04\x28"*/ return SH; }
\xD0\xA9 { /* Codepoint = "\x04\x29"*/ return SHH; }
\xD0\xAA { /* Codepoint = "\x04\x2A"*/ return JQ; }
\xD0\xAB { /* Codepoint = "\x04\x2B"*/ return Y; }
\xD0\xAC { /* Codepoint = "\x04\x2C"*/ return Q; }
\xD0\xAD { /* Codepoint = "\x04\x2D"*/ return EH; }
\xD0\xAE { /* Codepoint = "\x04\x2E"*/ return JU; }
\xD0\xAF { /* Codepoint = "\x04\x2F"*/ return JA; }
%{
	/* Строчные буквы */
%}
\xD0\xB0 { /* Codepoint = "\x04\x30"*/ return A; }
\xD0\xB1 { /* Codepoint = "\x04\x31"*/ return B; }
\xD0\xB2 { /* Codepoint = "\x04\x32"*/ return V; }
\xD0\xB3 { /* Codepoint = "\x04\x33"*/ return G; }
\xD0\xB4 { /* Codepoint = "\x04\x34"*/ return D; }
\xD0\xB5 { /* Codepoint = "\x04\x35"*/ return E; }
\xD1\x91 { /* Codepoint = "\x04\x51"*/ return JO; }
\xD0\xB6 { /* Codepoint = "\x04\x36"*/ return ZH; }
\xD0\xB7 { /* Codepoint = "\x04\x37"*/ return Z; }
\xD0\xB8 { /* Codepoint = "\x04\x38"*/ return I; }
\xD0\xB9 { /* Codepoint = "\x04\x39"*/ return JJ; }
\xD0\xBA { /* Codepoint = "\x04\x3A"*/ return K; }
\xD0\xBB { /* Codepoint = "\x04\x3B"*/ return L; }
\xD0\xBC { /* Codepoint = "\x04\x3C"*/ return M; }
\xD0\xBD { /* Codepoint = "\x04\x3D"*/ return N; }
\xD0\xBE { /* Codepoint = "\x04\x3E"*/ return O; }
\xD0\xBF { /* Codepoint = "\x04\x3F"*/ return P; }
\xD1\x80 { /* Codepoint = "\x04\x40"*/ return R; }
\xD1\x81 { /* Codepoint = "\x04\x41"*/ return S; }
\xD1\x82 { /* Codepoint = "\x04\x42"*/ return T; }
\xD1\x83 { /* Codepoint = "\x04\x43"*/ return U; }
\xD1\x84 { /* Codepoint = "\x04\x44"*/ return F; }
\xD1\x85 { /* Codepoint = "\x04\x45"*/ return KH; }
\xD1\x86 { /* Codepoint = "\x04\x46"*/ return C; }
\xD1\x87 { /* Codepoint = "\x04\x47"*/ return CH; }
\xD1\x88 { /* Codepoint = "\x04\x48"*/ return SH; }
\xD1\x89 { /* Codepoint = "\x04\x49"*/ return SHH; }
\xD1\x8A { /* Codepoint = "\x04\x4A"*/ return JQ; }
\xD1\x8B { /* Codepoint = "\x04\x4B"*/ return Y; }
\xD1\x8C { /* Codepoint = "\x04\x4C"*/ return Q; }
\xD1\x8D { /* Codepoint = "\x04\x4D"*/ return EH; }
\xD1\x8E { /* Codepoint = "\x04\x4E"*/ return JU; }
\xD1\x8F { /* Codepoint = "\x04\x4F"*/ return JA; }


\xEF\xBB\xBF { fprintf(stderr, "BOM found\n"); return BOM; }

\x0A { return EOL; }
\x20 { return SPACE; }
\x2C { return COMMA; }


[\x00-\xFF] { fprintf(stderr, "\nError: 0x%02X\n", (unsigned int)(unsigned char)(yytext[0])); return ERROR; }

%{
/*
. { return ERROR; }
*/
%}

%%

0

5

Код:
%{
#include <stdio.h>
#include "semantics.h"

int yylex(); 
int yyerror(); 

void process_letter(russian_symbol* s);

%}

%union {
    russian_symbol symbol;
}

%define api.pure full

%token /* А, 1 */ A
%token /* Б, 2 */ B
%token /* В, 3 */ V
%token /* Г, 4 */ G
%token /* Д, 5 */ D
%token /* Е, 6 */ E
%token /* Ё, 7 */ JO
%token /* Ж, 8 */ ZH
%token /* З, 9 */ Z
%token /* И, 10 */ I
%token /* Й, 11 */ JJ
%token /* К, 12 */ K
%token /* Л, 13 */ L
%token /* М, 14 */ M
%token /* Н, 15 */ N
%token /* О, 16 */ O
%token /* П, 17 */ P
%token /* Р, 18 */ R
%token /* С, 19 */ S
%token /* Т, 20 */ T
%token /* У, 21 */ U
%token /* Ф, 22 */ F
%token /* Х, 23 */ KH
%token /* Ц, 24 */ C
%token /* Ч, 25 */ CH
%token /* Ш, 26 */ SH
%token /* Щ, 27 */ SHH
%token /* Ъ, 28 */ JQ
%token /* Ы, 29 */ Y
%token /* Ь, 30 */ Q
%token /* Э, 31 */ EH
%token /* Ю, 32 */ JU
%token /* Я, 33 */ JA

%token D0 D1 D2 D3 D4 D5 D6 D7 D8 D9
%token DOT QUESTION EXCLAIMATION COMMA SEMICOLON DOUBLEDOT MULTIPOINT L_QUOTE R_QUOTE
%token LB RB
%token LBS RBS
%token LBC RBC
%token QUOT DQUOT BACKQUOT
%token PLUS MINUS SLASH MULT EQU LESS MORE
%token TILDA UNDERBAR BACKSLASH PIPE AMPERSAND PERCENT CIRCUMFLEX RUBLE NUMBER
%token FR_L_QUOTE FR_R_QUOTE


%token /* byte order mark */ BOM
%token /* whitespace */ SPACE
%token /* end of line */ EOL
%token /* unknow character */ ERROR

%type <symbol> A B V G D E JO ZH Z I JJ K L M N O P R S T U F KH C CH SH SHH JQ Y Q EH JU JA
%type <symbol> letter

%start all

%%

all
	: file YYEOF { fprintf(stderr, "Final: success\n"); YYACCEPT; }
	| file ERROR { fprintf(stderr, "Final: error\n"); YYABORT; }
	;

file 
	: file-body { fprintf(stderr, "file without BOM\n"); }
	| BOM file-body { fprintf(stderr, "file with BOM\n"); }
	| BOM { fprintf(stderr, "File contain only BOM\n"); }
	;

file-body
	: file-body any-token
	| any-token
	;
any-token
	: letter { process_letter( & $1); }
	| SPACE { fprintf(stderr, "SPACE "); }
	| COMMA { fprintf(stderr, "COMMA "); }
	| EOL { fprintf(stderr, "EOL "); }
	;
letter
	: A | B | V | G | D | E | JO | ZH | Z | I | JJ | K | L | M | N | O | P | R | S | T | U | F | KH | C | CH | SH | SHH | JQ | Y | Q | EH | JU | JA
	;

/* Знак точки обозначает любой символ, кроме символа конца строки */

%%

void process_letter(russian_symbol* s)
{
	fprintf(stderr, "LETTER ");
	if (s->isStressed)
	{
    fprintf(stderr, "STRESSED ");
	}
}

0

6

Лис написал(а):

1) Да, такой вариант написан кажется где-то в стандарте Unicode (что при желании всё-таки можно использовать flex). Проблемы там с диапазонами символов, буквой 'Ё', обработкой ударе́ний.

Поправил свой пример. Теперь букву Ё обрабатывает корректно.

0

7

Мне показалось что Вы сейчас делает ошибку, создаете некий инструмент в отрыве от среды исполнения. Дело в том что современные АПИ в интернете сталкиваются с гораздо более изошрёнными кодировками, и используют специфические интсрументы наподобиее стеганографии для пересылки кода. И это тренд.

Врядли можно создать некий абстрактный язык в не зависимости от платформы.

На мой взгляд вообще компилятор не так важен как линковщик. Если хотите чтоб ваш компилятор кто то захотел использовать, стелайте его лучшим, добавте вот таких фичь например как ниже рассказано.

Ну и уже выберите архитектуру по вкусу. RISK-V?  Intel 8051, 6502 etc.

https://github.com/qntm/base2048

Можно использовать кодировку База2048, если у вас команды токонизированы.

На хороших компьютерах еще есть коды видеодрайвера.

2343 безопасных символа, дают 385 байтов кода на твит.

Если сделать это в виде Твит Бота, то скорее всего ваш компилятор заметят. Но не надо пренебрегать различными символами из разных стран в самом начале.

ABug 12: The making of BBC Micro Bot (Dominic Pajak) bbcmicrobot Acorn Computer coding Twitter 8-bit

https://twitter.com/bbcmicrobot/status/ … 4701931522

это исходники популярной игры элита 1984 года упакованные в одну картинку со стегонаграфией 900х900 пикселов (потому что больше нельзя в Твитер послать)

Отредактировано ignat99 (2023-09-23 17:39:47)

0

8

> Мне показалось

Ясно. Хорошо, что Вы это поняли.

Так-то у нас есть виртуальная машина с оригинальной архитектурой команд (Сказочная колесница), собственная кодировка символов (УТКА) и собственный стандарт кодирования (КРЯ-8).

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

0

9

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

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

Допустим что у них у всех Мипс и одинаковые опкоды (что в природе не бывает, но пусть будет), то все равно адреса памяти, ПЗУ и ОС разные. Вообщем хитрорыжетупомордый опять ляпнул какую то херню в которой не лапой не мордой не разу не попадал. Ну может только во сне почудилось и перепутал уточку жирную с кодировкой символов.

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

====

Поймите меня правильно. У меня не праздный интерес. Просто в России 200 национальностей. И общая база для всех их языков это древне-ливийский и скорее сербский (Да да - тот самый единый Вавилонский язык). А не новодел из фарси(таджики), турецкого(тюрки), санскрита(моголы) и латинского(румынские евреи и сефарды) под названием русский.

Есть большая раздница между фонетическим алфавитом, слоговым письмом и консонантным письмом с графической аффазией (независимость от симметрии насамом деле зависимость и абугида) тифинаг.
Вообщем огласовка зависит от симметрии буквы и её поворота. Как эскимоско-аулетское Канадское слоговое письмо.
Потому что из Сибири туда в Америку ушли наши древние предки - индейцы Канады.

Точно так же они ушли и в Африку и Ливию и через Сомали и Эфиопию с сонгайским письмом (да я работал в СомалиЛенде), а до того в Дагестан (табасаранский) и Азербайжан (шемоханский). И в окресности Гуджарата с Брахми и похожим на брахми Армянским языком (естественно древнейшим) так как там было и Согдийское письмо и государство Лулань на территории пустыни Тадмулокань в Казахстане возле Тибета (И да я был в Тибете и в Казахстане тоже была экспедиция) откуда и пришли на кораблях греки.

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

А уж на нем воротите что хотите хоть укро-польско-мамелюкский, хоть французкий, хоть русский, хоть немецкий идиш и вообще любой другой 200 летний еврейский новодел.
Я уж не говорю за исковерканый рутенский-русенский язык бритых бритов - инглесский - английский (Церковь (Iglesia)- Пах (Ingle)).

Но не надо трогать грязными рыжими укро-польскими лапами наши древние северные наречия подобные великому языку санскрит с 5000 летней историей. Да же если к его фальсификации приложили руки те самые бриты из "Общества старьевщиков" и "Клуба дилетантов".

Отредактировано ignat99 (2023-09-24 15:44:42)

0

10

Лис написал(а):

Если есть возможность писать на flex и bison (первый до уровня букв, второй всё остальное), что же останавливает нас, как проект? Вон у NuShaman есть какой-то рекурсивный спуск, но нет массивов. Массивы он хочет ассоциативные. Поэтому надо сделать какое-нибудь дерево (например красно-чёрное дерево) на русифицированном Си, и инструкции как такой библиотекой пользоваться (как инсталлировать, как линковать со своим проектом). Без подробных описаний и рассказов что и как, людям очень сложно вливаться в проекты (например в виртуальную машину никто не хочет).

Отредактировано Лис (2023-09-23 04:14:36)

В Delphi  есть класс TList. Вероятно, ассоциативные массивы можно сделать с помощью этого класса. В любом случае это будеть проще, чем пристыковать к проекту NuShaman библиотеку на Си.

0


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » Транспилятор в Си от Юрия » Lex и кириллица в кодировке UTF-8. Возможно ли?