<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Win32.Utf8 on Алексей Пахунов</title>
    <link>https://blog.not-a-kernel-guy.com/tags/win32.utf8/</link>
    <description>Recent content in Win32.Utf8 on Алексей Пахунов</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ru-ru</language>
    <lastBuildDate>Wed, 31 Oct 2007 15:58:11 -0700</lastBuildDate>
    <atom:link href="https://blog.not-a-kernel-guy.com/tags/win32.utf8/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>SAL аннотации</title>
      <link>https://blog.not-a-kernel-guy.com/2007/10/31/260/</link>
      <pubDate>Wed, 31 Oct 2007 15:58:11 -0700</pubDate>
      <guid>https://blog.not-a-kernel-guy.com/2007/10/31/260/</guid>
      <description>&lt;p&gt;В последнее время я немного забросил Win32.Utf8 - на работе завал, так что, приходя домой, делать ничего особенного не хочется. Тем не менее, проект потихоньку движется и, на сегодняшний день, я добрался до разбора SAL аннотаций.&lt;/p&gt;&#xA;&lt;p&gt;Основной источник информации, которым я пользуюсь - это заголовок sal.h из поставки Visual C++. В нем содержится достаточно подробное описание того, как составляются конструкции вроде &lt;code&gt;__deref_inout_ecount_part_opt&lt;/code&gt;. Кроме того, там же определены макросы, преобразующие SAL аннотации в набор директив для статического анализатора PREfast. По ним достаточно просто понять как SAL аннотации «работают на самом деле».&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Аналогичный заголовок есть в Platform SDK для Windows 2003 - specstrings.h. В Windows SDK для Vista все еще более запутано.&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Навигация по AST</title>
      <link>https://blog.not-a-kernel-guy.com/2007/09/23/241/</link>
      <pubDate>Sun, 23 Sep 2007 23:17:57 -0700</pubDate>
      <guid>https://blog.not-a-kernel-guy.com/2007/09/23/241/</guid>
      <description>&lt;p&gt;Продолжаю возиться с &lt;a href=&#34;https://blog.not-a-kernel-guy.com/tags/win32.utf8/&#34;&gt;синтаксическим анализом&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Основное преимущество, которое даёт использование &lt;a href=&#34;http://en.wikipedia.org/wiki/Abstract_syntax_tree&#34;&gt;AST&lt;/a&gt; по сравнению с техникой разбора снизу вверх (bottom-up parsing) – это возможность отложить анализ разобранного текста «на потом». Это может быть удобно по разным причинам. В случае Win32.Utf8 это удобно тем, что требования к анализатору формируются прямо в процессе работы над проектом. По большому счёту я понятия не имею, что получиться в конечном итоге. :-)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Отладка абстрактного синтаксического дерева (AST)</title>
      <link>https://blog.not-a-kernel-guy.com/2007/09/16/238/</link>
      <pubDate>Sun, 16 Sep 2007 21:19:10 -0700</pubDate>
      <guid>https://blog.not-a-kernel-guy.com/2007/09/16/238/</guid>
      <description>&lt;p&gt;Во время работы над парсером постоянно возникала необходимость посмотреть как выглядит тот или иной кусок дерева или все дерево целиком. Недолго думая, я попробовал выводить его в виде XML, - получилось довольно неплохо.&lt;/p&gt;&#xA;&lt;p&gt;Исходный код на C:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;LPVOID;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Дерево, полученное после синтаксического разбора:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;translation_unit&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;external_declaration&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;declaration&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;init_list_declaration&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;declaration_specifiers&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;declaration_specifier&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;storage_class_specifier&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       typedef&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/storage_class_specifier&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/declaration_specifier&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;declaration_specifier&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;type_specifier&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;builtin_type&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        void&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/builtin_type&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/type_specifier&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/declaration_specifier&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/declaration_specifiers&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;init_declarator&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;declarator&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;pointer&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/pointer&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;direct_declarator&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       LPVOID&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/direct_declarator&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/declarator&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/init_declarator&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/init_list_declaration&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   ;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/declaration&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/external_declaration&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/translation_unit&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Построение абстрактного синтаксического дерева</title>
      <link>https://blog.not-a-kernel-guy.com/2007/09/02/233/</link>
      <pubDate>Sun, 02 Sep 2007 22:04:58 -0700</pubDate>
      <guid>https://blog.not-a-kernel-guy.com/2007/09/02/233/</guid>
      <description>&lt;p&gt;Алгоритм работы Win32.Utf8 состоит из трех основных шагов:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Исходные заголовки пропускаются через стандартный препроцессор;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Полученный код парсится и трансформируется в дерево объектов, описывающее функции, типы и связи между ними;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Полученное дерево используется для генерации кода по заданным шаблонам.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;На данный момент я работаю над вторым этапом. Цель – построенное дерево должно быть компактным, его структура должна облегчать последующий анализ во время генерации кода. В тоже время дерево должно включать всю информацию необходимую для генерации корректного кода.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Как собрать DParser for Python с помощью Visual C&#43;&#43; 2005?</title>
      <link>https://blog.not-a-kernel-guy.com/2007/08/28/231/</link>
      <pubDate>Tue, 28 Aug 2007 23:24:31 -0700</pubDate>
      <guid>https://blog.not-a-kernel-guy.com/2007/08/28/231/</guid>
      <description>&lt;p&gt;Существует два способа собрать DParser for Python под Windows:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Легкий – воспользоваться GCC из MinGW и немного пошаманить;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Интересный – попытаться сделать тоже самое с помощью Visual C++ 2005.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Естественно, что я выбрал второй вариант. :-)&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;(На самом деле причина довольно прозаична – не хотелось собирать один проект двумя разными компиляторами).&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Регулярное выражение. Симпатишное :-)</title>
      <link>https://blog.not-a-kernel-guy.com/2007/08/22/225/</link>
      <pubDate>Wed, 22 Aug 2007 09:57:56 -0700</pubDate>
      <guid>https://blog.not-a-kernel-guy.com/2007/08/22/225/</guid>
      <description>Стандартный обработчик пробелов в DParser распознаёт пробелы, табуляцию, переводы строк, C-подобные комментарии и директивы “#line”. Мне нужно было отсеивать ещё и “#pragma” директивы, которые препроцессор от Visual C++ любезно оставляет в коде. Для этого понадобилось определить свой обработчик пробельных символов:&#xA;re_whitespace = re.compile(r&amp;#39;(\\s+|/\\*(.|\\n)*?\\*/|//.*\\n|(^\\s*\\#.*$((?&amp;lt;=\\\\)\\n.*$)*))+&amp;#39;, re.M) def whitespace(loc): m = re_whitespace.match(loc.buf, loc.s) if m: loc.s = m.end() loc.line += m.group().count(&amp;#39;\\n&amp;#39;) Из интересного тут только само регулярное выражение. Мне понадобилось н-дцать попыток, чтобы довести его до ума.</description>
    </item>
    <item>
      <title>DParser  vs. PLY</title>
      <link>https://blog.not-a-kernel-guy.com/2007/08/21/224/</link>
      <pubDate>Tue, 21 Aug 2007 16:18:40 -0700</pubDate>
      <guid>https://blog.not-a-kernel-guy.com/2007/08/21/224/</guid>
      <description>Переделал разбор С заголовков на DParser – получил ускорение в 10 раз. Мелочь, а приятно. :-)&#xA;PS. Под профайлером разница меньше, - раз шесть всего, но тоже впечатляет.</description>
    </item>
    <item>
      <title>Первый блин - комом</title>
      <link>https://blog.not-a-kernel-guy.com/2007/08/17/222/</link>
      <pubDate>Fri, 17 Aug 2007 11:22:03 -0700</pubDate>
      <guid>https://blog.not-a-kernel-guy.com/2007/08/17/222/</guid>
      <description>&lt;p&gt;Нахваливал я тут PLY, а зря. Разбор двух с половиной мегабайтного заголовка с построением синтаксического дерева занимает верных полторы минуты. И это на AMD Opteron 250 2.4GHz. Эталонный Althon XP, по всей видимости, будет делать то же самое минут десять. Это никуда не годиться.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Парсер C кода</title>
      <link>https://blog.not-a-kernel-guy.com/2007/08/16/221/</link>
      <pubDate>Thu, 16 Aug 2007 14:36:57 -0700</pubDate>
      <guid>https://blog.not-a-kernel-guy.com/2007/08/16/221/</guid>
      <description>&lt;p&gt;Поиск парсера для C кода – по-прежнему увлекательное занятие. Для &lt;a href=&#34;https://blog.not-a-kernel-guy.com/2007/08/12/220/&#34;&gt;Win32.Utf8&lt;/a&gt; мне нужен был парсер для анализа заголовочных файлов Win32 API и извлечения из них прототипов функций и объявлений структур. Требований к нему было не очень много:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Win32.Utf8</title>
      <link>https://blog.not-a-kernel-guy.com/2007/08/12/220/</link>
      <pubDate>Sun, 12 Aug 2007 22:40:20 -0700</pubDate>
      <guid>https://blog.not-a-kernel-guy.com/2007/08/12/220/</guid>
      <description>&lt;p&gt;Я тут совсем недавно &lt;a href=&#34;https://blog.not-a-kernel-guy.com/2007/06/03/193/&#34;&gt;удивлялся&lt;/a&gt; почему нет библиотек, эмулирующих поддержку UTF-8 на уровне Win32 API. Т.е. такая библиотека реализует, скажем, CreateFileUtf8 в дополнение к предлагаемым системой CreateFileA и CreateFileW, а макрос CreateFile будет выбирать нужную реализацию уже из трех вариантов. Надо сказать, что по итогам обсуждения моё недоумение нисколько не уменьшилось. Даже ссылки на Michael Caplan - авторитета в этой области не помогли. Это, впрочем, как раз очень понятно. Набивать свои шишки куда как интереснее, чем послушать что говорят умные люди уже ходившие по этим граблям. :-)&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
