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

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

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



Лабораторный стенд

Сообщений 31 страница 33 из 33

1

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

0

31

Ну, и основной файл. Совсем небольшой.
main.r
[html]<head>
<meta charset="UTF-8"><style>
.code{display:block;overflow-x:auto;color:#ffaa00;font-family:'Courier New'; font-size:10pt;tab-size: 4;background:#2b211c}
.coments {color:#707070;font-style:italic}
.digit {color:#ff3a83}
.del1 {color:#a6deff}
.del2 {color:#ffaa00}
.oper {color:#f6f080}
.keyw {color:#37a8ed}
.var {color:#ffffff}
.ident {color:#ffffff}
.funct {color:#a6deff}
.str {color:#80ff80;font-style:italic}
.macro {color:#9f9fd0;font-style:italic}
LI {background:#2b211c; padding:0.2em; padding-left:0.5em}
.rownumber {background:#3b312c;color:#abb2bf}
</style></head>
<div class="code-box"><strong class="legend" >Код:</strong><div class="blockcode"><div class="scrollbox" style="overflow: auto; height: 40em"><table class = "code"><tr><td style="border: 1px solid #2b211c;background:#2b211c"><pre class = "rownumber" style="margin: 0; line-height: 150%">   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
  39
  40
  41
  42
  43
  44
  45
  46
  47
  48
  49
  50
  51
  52
  53
  54
  55
  56
  57
  58
  59
  60
  61
  62
  63
  64
  65
  66
  67
  68
  69
  70
  71
  72
  73
  74
  75
  76
  77
  78
  79
  80
</pre></td><td style="border: 1px solid #2b211c;background:#2b211c"><pre class = "code" style="margin: 0; line-height: 150%"><span class="macro">#вставка    "library.h" </span>
<span class="macro">#вставка    "textbuffer.h" </span>
<span class="macro">#вставка    "ASTtree.h" </span>
<span class="macro">#вставка    "code_utf16.h" </span>
<span class="macro">#вставка &lt;locale.h&gt; //Во избежание "крокозяблей" на выводе</span>
<span class="macro">#вставка "time.h" </span>
<span class="macro">#вставка "lexer.rh"</span>
<span class="macro">#вставка "html_gen.rh"</span>
<span class="macro">#вставка "windows.h"</span>

<span class="coments">// при подключении файлов из других папок будьте внимательны с путями,</span>
<span class="coments">// так как перед компиляцией С/С++ файлы будут находится в папке .src/</span>

<span class="ident">ТБуфер</span> <span class="ident">исходник</span> = {<span class="ident">НОЛЬ</span>, <span class="ident">НОЛЬ</span>, <span class="digit">0</span>, <span class="digit">0</span>};
<span class="ident">ТБуфер</span> <span class="ident">код_html</span> = {<span class="ident">НОЛЬ</span>, <span class="ident">НОЛЬ</span>, <span class="digit">0</span>, <span class="digit">0</span>};
<span class="ident">ТАСД</span>   <span class="ident">дерево</span>;

<span class="coments">// моя программа - единственный идентификатор в котором разрешен пробел</span>
цел <span class="funct">main</span><span class="del1">(</span><span class="del1">)</span>
{
   
<span class="funct">setlocale</span><span class="del1">(</span><span class="ident">LC_ALL</span>, <span class="str">&quot;&quot;</span><span class="del1">)</span>;
<span class="funct">system</span><span class="del1">(</span><span class="str">&quot;cls&quot;</span><span class="del1">)</span>;
<span class="coments">//==============================================================</span>
    <span class="coments">// Загружаем исходный код из файла в буфер</span>
    <span class="coments">//==============================================================</span>
<span class="coments">//симв имя_файла [20] = "test.ru";</span>
<span class="coments">//симв имя_файла1 [20] = "test.html";</span>
<span class="coments">//исходник.имя_файла = имя_файла;</span>
    <span class="coments">// файл_в_буфер(&исходник);</span>
<span class="coments">//==============================================================</span>
    <span class="coments">// Загружаем исходник из буфера обмена</span>
    <span class="coments">//==============================================================</span>
<span class="ident">HWND</span> <span class="ident">hwnd</span> = <span class="funct">GetConsoleWindow</span><span class="del1">(</span><span class="del1">)</span>;
  <span class="funct">OpenClipboard</span><span class="del1">(</span><span class="ident">hwnd</span><span class="del1">)</span>;
  <span class="ident">исходник</span>.<span class="ident">длина_текста</span> = <span class="funct">strlen</span><span class="del1">(</span><span class="del1">(</span>симв *<span class="del1">)</span> <span class="funct">GetClipboardData</span><span class="del1">(</span><span class="ident">CF_TEXT</span><span class="del1">)</span><span class="del1">)</span>+<span class="digit">1</span>;
    <span class="funct">выделить_память</span><span class="del1">(</span><span class="del2">&amp;</span><span class="ident">исходник</span>,<span class="ident">исходник</span>.<span class="ident">длина_текста</span><span class="del1">)</span>;
    <span class="ident">исходник</span>.<span class="ident">текст</span>[<span class="ident">исходник</span>.<span class="ident">длина_текста</span>-<span class="digit">1</span>] = <span class="str">'\0'</span>;
    <span class="funct">strcpy</span><span class="del1">(</span><span class="del1">(</span>симв *<span class="del1">)</span> <span class="ident">исходник</span>.<span class="ident">текст</span>, <span class="del1">(</span>char*<span class="del1">)</span><span class="funct">GetClipboardData</span><span class="del1">(</span><span class="ident">CF_TEXT</span><span class="del1">)</span><span class="del1">)</span>;
    <span class="funct">CloseClipboard</span><span class="del1">(</span><span class="del1">)</span>;

<span class="funct">перекодировать_в_UTF16</span><span class="del1">(</span><span class="del2">&amp;</span><span class="ident">исходник</span><span class="del1">)</span>;
    <span class="coments">// пчтф16(исходник.текст16);</span>
       
    <span class="coments">//вызываем лексер и разбиваем код на лексемы</span>
    <span class="funct">лексер</span><span class="del1">(</span><span class="del2">&amp;</span><span class="ident">исходник</span>, <span class="del2">&amp;</span><span class="ident">дерево</span><span class="del1">)</span>;
<span class="coments">//АСДраспечатать_все_токены(&дерево);</span>
<span class="coments">//======================================</span>
<span class="coments">// Генерируем html-код</span>
<span class="coments">//======================================</span>
<span class="funct">генерировать_html</span><span class="del1">(</span><span class="del2">&amp;</span><span class="ident">код_html</span>, <span class="del2">&amp;</span><span class="ident">дерево</span><span class="del1">)</span>;
<span class="coments">//======================================</span>
<span class="coments">//сохраняем в файл_в_буфер</span>
<span class="coments">//======================================</span>
<span class="coments">//пчтф16(L"\n Содержимое сгенерированного файла:\n");</span>
<span class="coments">//wprintf(код_html.текст16);</span>
<span class="coments">//перекодируем html-код в UTF8</span>
<span class="coments">//перекодировать_UTF16_в_UTF8( &код_html);</span>
<span class="coments">//код_html.имя_файла = имя_файла1;</span>
    <span class="coments">//буфер_в_файл(&код_html);</span>
    <span class="coments">//=======================================</span>
    <span class="coments">// сохраняем в буфер обмена</span>
    <span class="coments">//======================================= </span>
    <span class="ident">size_t</span>  <span class="ident">len</span>   = <span class="del1">(</span><span class="ident">size_t</span><span class="del1">)</span> <span class="ident">код_html</span>.<span class="ident">длина_текста16</span>+<span class="digit">1</span> ;
    <span class="ident">HGLOBAL</span> <span class="ident">hMem</span>  = <span class="funct">GlobalAlloc</span><span class="del1">(</span><span class="ident">GMEM_MOVEABLE</span>, <span class="ident">len</span>*<span class="digit">2</span><span class="del1">)</span>;
    <span class="funct">memcpy</span><span class="del1">(</span><span class="funct">GlobalLock</span><span class="del1">(</span><span class="ident">hMem</span><span class="del1">)</span>, <span class="ident">код_html</span>.<span class="ident">текст16</span>, <span class="ident">len</span>*<span class="digit">2</span><span class="del1">)</span>;
  <span class="funct">OpenClipboard</span> <span class="del1">(</span><span class="ident">hwnd</span><span class="del1">)</span>;
    <span class="funct">EmptyClipboard</span><span class="del1">(</span><span class="del1">)</span>;
    <span class="funct">SetClipboardData</span><span class="del1">(</span><span class="ident">CF_UNICODETEXT</span>, <span class="ident">hMem</span><span class="del1">)</span>; <span class="coments">// #include <windows.h></span>
    <span class="funct">CloseClipboard</span><span class="del1">(</span> <span class="del1">)</span>;
    <span class="funct">GlobalUnlock</span><span class="del1">(</span><span class="ident">hMem</span><span class="del1">)</span>;
       
<span class="funct">АСДосвободить_память</span><span class="del1">(</span><span class="del2">&amp;</span><span class="ident">дерево</span><span class="del1">)</span>;
<span class="funct">освободить_память</span><span class="del1">(</span><span class="del2">&amp;</span><span class="ident">исходник</span><span class="del1">)</span>;
<span class="funct">освободить_память</span><span class="del1">(</span><span class="del2">&amp;</span><span class="ident">код_html</span><span class="del1">)</span>;
<span class="coments">//wprintf(исходник.текст16);</span>
<span class="coments">//симв с;</span>
<span class="coments">//с=читз();</span>
<span class="oper">вернуть</span> <span class="digit">0</span>;
} </pre></td></tr></table></div></div></div>[/html]
Немного переписал файл main.r Теперь исходный текст, подлежащий переводу в html, загружается через буфер обмена, а сгенерированный html-код возвращается снова в буфер обмена. Привязал программу к кнопочке на панели инструментов AkelPad. Теперь стадия тестирования.

Отредактировано Евгений (2022-05-13 22:40:14)

0

32

Наш первый проект подошел к завершению. Что-то получилось, что-то не очень. Программа еще достаточно сырая, но доработкой я позанимаюсь позже. Получилось посмотреть, что на русском вполне нормально можно писать программы. Теперь есть возможность визуально оценить, как выглядит код на русском. Как он выглядел бы в редакторе с подсветкой синтаксиса. Мы посмотрели, как на основе лексического анализатора довольно легко осуществить такую подсветку. Вопрос деревьев и массивов рассмотрен лишь наполовину, а второй половинкой (работой с деревом) мы позанимаемся в следующем проекте. Что получилось не очень... Исходный текст кода с html-подсветкой увеличивается примерно в четыре раза и часто не влезает в допустимые 64 КБ. Кроме того, мне совсем не нравится, как выглядят блоки кода в мобильных устройствах. К сожалению моих знаний html не достаточно, чтобы побороть эту проблему. Если ее вообще можно побороть. А может кто-то предложит альтернативный вариант... Любые вопросы, пожелания, мнения жду в соседней ветке.
В процессе программирования на русском мне частенько не хватает букв i, j, k для организации циклов. Для одиночного цикла я использую переменную индекс, а вот для вложенных циклов хорошего варианта пока не нашел. Если у кого есть хорошая идея, будет здорово.

0

33

Евгений написал(а):

2. Разбираемся с кодировками и приводим к UTF-16
        Почему UTF-16? Удобно.

Это верно в частном случае для кириллицы. Символов Уникода более 65536, потому при кодировании их в UTF-16 может оказаться более одной пары байт, да 🤓. Поскольку функция перекодировать_в_UTF16 корректно работает на ограниченном подмножестве, возможно, название типа кириллица_в_UTF16 окажется более подходящим.

Евгений написал(а):

4. Анализируем выданные лексером токены и формируем выходной текст обрамляя нужные лексемы html- тэгами.
        Область html для меня темная, будем разбираться по ходу пьесы.

Не уверен, что правильно понял, что здесь происходит, но на всякий случай - компании Микрософт и Красная Шляпа придумали Language Server Protocol. Теперь почти каждый редактор кода его поддерживает. Дополнение читает исходник, разбирает его и отдаёт редактору информацию - как и что отображать. Таким образом поддержка новых языков разом добавляется сразу во все совместимые редакторы (это в теории, на практике придётся ещё написать для каждого редактора прослойку).

0