<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411567&amp;view=findpost&amp;p=3832676</guid>
        <pubDate>Tue, 16 Jun 2020 20:12:51 +0000</pubDate>
        <title>Алгоритм разбора BB-разметки с вложениями</title>
        <link>https://forum.sources.ru/index.php?showtopic=411567&amp;view=findpost&amp;p=3832676</link>
        <description><![CDATA[JoeUser: <strong class='tag-b'>Pavia</strong>, спасибо еще раз&#33; Как говорится ... не прошло и пол-года :lol: <br>
<br>
Сейчас соглашусь - для качественного выделения без AST не обойтись. Да возможны мелкие и частные решения, которые декларируют <strong class='tag-b'>AVA12</strong> и <strong class='tag-b'>Akina</strong>, ну и тупо чуйка (траблы типа - строк без квотирования, целых, дробных, квотирование в квотировании). Но, имхо, и они не качественные&#33; Да, можно решить 20% злободневных задач на отличненько (Паретто бы кончил) - в угоду сиюминутного профита.]]></description>
        <author>JoeUser</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411567&amp;view=findpost&amp;p=3748813</guid>
        <pubDate>Fri, 10 Nov 2017 02:35:26 +0000</pubDate>
        <title>Алгоритм разбора BB-разметки с вложениями</title>
        <link>https://forum.sources.ru/index.php?showtopic=411567&amp;view=findpost&amp;p=3748813</link>
        <description><![CDATA[JoeUser: <strong class='tag-b'>Pavia</strong>, спасибо за инфу&#33; В плане &quot;познавания&quot; хороша, но для моей задачи - неимоверно избыточна. В блоке {code} может быть представлено 135 ЯП - по заявлениям автора <a class='tag-url' href='https://github.com/scrivo/highlight.php' target='_blank'>либы для php-раскрасски</a>. Влезать в парсинг всех тех языков, да еще и формально правильно, используя описанную теорию - ни желания, ни времени.<br>
<br>
Поэтому, подход, описанный <strong class='tag-b'>Akina</strong>, а ниже и <strong class='tag-b'>AVA12</strong> - будет вполне пригоден для этой моей задачи.]]></description>
        <author>JoeUser</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411567&amp;view=findpost&amp;p=3748810</guid>
        <pubDate>Thu, 09 Nov 2017 21:39:30 +0000</pubDate>
        <title>Алгоритм разбора BB-разметки с вложениями</title>
        <link>https://forum.sources.ru/index.php?showtopic=411567&amp;view=findpost&amp;p=3748810</link>
        <description><![CDATA[AVA12: P. S. Пришел <strong class='tag-b'>Pavia</strong> и напустил туману.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Регулярные выражения находятся классом выше, но не покрывают весь второй класс поэтому для вас они непригодны.</div></div><br>
Тут, вроде бы, грамотные люди, которые понимают, что HTML регвырами не парсят. А вот для лексического анализа регвыров в два наката вполне достаточно.]]></description>
        <author>AVA12</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411567&amp;view=findpost&amp;p=3748809</guid>
        <pubDate>Thu, 09 Nov 2017 21:34:36 +0000</pubDate>
        <title>Алгоритм разбора BB-разметки с вложениями</title>
        <link>https://forum.sources.ru/index.php?showtopic=411567&amp;view=findpost&amp;p=3748809</link>
        <description><![CDATA[AVA12: В случае с pre и code можно сделать еще проще: все от открывающего тега до ближайшего подходящего закрывающего считать одним самозакрывающимся тегом, и пофиг, что у него в нутре. Если же юзер забудет закрыть специальный тег, он будет распознан, как обычный. Увидев одинокий открывающий специальный тег можно будет либо обругать юзера, либо автоматически пропустить оставшуюся часть текста и закрыть-таки тег.]]></description>
        <author>AVA12</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411567&amp;view=findpost&amp;p=3748808</guid>
        <pubDate>Thu, 09 Nov 2017 21:30:53 +0000</pubDate>
        <title>Алгоритм разбора BB-разметки с вложениями</title>
        <link>https://forum.sources.ru/index.php?showtopic=411567&amp;view=findpost&amp;p=3748808</link>
        <description><![CDATA[Pavia: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411567&view=findpost&p=3748724'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2017-11-09T11:56:15+00:00">09.11.17, 11:56</time></span><div class='quote '>Как всю эту шляпу разобрать правильно? На ум приходит - строить дерево и по нему бегать. И то, пока не понятно как  <br>
Ваши мнения?</div></div><br>
<br>
Ваша задача от носится к теории языков. Сразу скажу что теория очень сильно оторвана от практики.<br>
<br>
Вначале определим класс грамматики по Хомскому. Ваша грамматика относится к контекстно-зависимым.<br>
<br>
<table class='post_table tag-table'><tr><th>Тип</th><th>Вид правил</th><th>Названия правил</th><th>Метод распознавания</th></tr><tr><td>0</td><td>α→β</td><td>Произвольные правила,<br>
     неограниченные правила<br>
   свободные грамматики </td><td>Машины Тьюринга</td></tr><tr><td>1</td><td>γAδ→γβδ<br>
aAβ→αγβ</td><td>Контекстно-зависимые грамматика,       <br>
     КЗ-правила </td><td>Рекурсивные автоматы, рекурсивный спуск</td></tr><tr><td>2</td><td>A→γ</td><td>Контекстно-свободные грамматика,<br>
     КС-правила </td><td>Автоматы с магазинной памятью(табличные автоматы со стековой памятью)</td></tr><tr><td>3</td><td>A→aB<br>
A→a<br>
A→ε<br>
</td><td>Регулярные грамматики,<br>
     Р-правила <br>
     Автоматические грамматики<br>
     А-правила</td><td>Конечные автоматы</td></tr></table><br>
<br>
Не стоит путать регулярные выражения с регулярными грамматиками.<br>
Регулярные выражения находятся классом выше, но не покрывают весь второй класс поэтому для вас они непригодны. <br>
<br>
Рекурсивный спуск - общее название для метода разбора. Хочу обратить внимание что этот метод гораздо сложнее чем кажется. Поэтому он называется не просто рекурсия, а рекурсивный спуск.<br>
<br>
В теории вы можете найти множество различных парсеров. Каждый парсер решает свою частную задачу и эти задачи плохо ложатся на выше изложенную классификацию. SLR относится к типу 3, а LALR(N) к типу 2. Но благодаря тому что теория не стояла на месте тип 2 легко сводится к типу 3.<br>
<br>
И да если вы не дай бог решите ещё глубже копать в теорию, то обязательно прочтите<br>
<a class='tag-url' href='https://swtch.com/~rsc/regexp/regexp1.html' target='_blank'>https://swtch.com/~rsc/regexp/regexp1.html</a><br>
и изучите код детерминированного конечного автомата .<br>
<br>
Это всё, что вы должны знать из теории. А теперь забудьте всё, что вы знали и переходите к практике.<br>
За основу вашего парсера предлагаю взять шаблоны-проектирования и подходы из компилятора LCC - это обязательно к изучению.<br>
<a class='tag-url' href='https://sites.google.com/site/lccretargetablecompiler/downloads' target='_blank'>https://sites.google.com/site/lccretargetab...piler/downloads</a><br>
<br>
Второй способ и что главное гораздо продуктивный использование генератора парсеров Bison или Bison++.<br>
Для этого метода обязательно к прочтению является документ<br>
<a class='tag-url' href='https://www.opennet.ru/docs/RUS/bison_yacc/bison_toc.html' target='_blank'>https://www.opennet.ru/docs/RUS/bison_yacc/bison_toc.html</a><br>
<br>
После прочтения вы должны ответить на ряд вопросов:<br>
Конфликты свёртка/сдвиг?<br>
Конфликты свёртка/свёртка?<br>
Что такое висячий else?<br>
Левые операторы/правые операторы зачем нужны и почему недостаточно приоритетов?<br>
<br>
Вот тут можно посмотреть пример как создать парсер для языка сложнее калькулятора.<br>
<a class='tag-url' href='https://habrahabr.ru/post/99397/' target='_blank'>https://habrahabr.ru/post/99397/</a><br>
<br>
И да вы правильно заметили результатом работы парсера будет дерево. AST - абстрактное синтаксическое дерево.]]></description>
        <author>Pavia</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411567&amp;view=findpost&amp;p=3748794</guid>
        <pubDate>Thu, 09 Nov 2017 19:14:14 +0000</pubDate>
        <title>Алгоритм разбора BB-разметки с вложениями</title>
        <link>https://forum.sources.ru/index.php?showtopic=411567&amp;view=findpost&amp;p=3748794</link>
        <description><![CDATA[JoeUser: <strong class='tag-b'>Akina</strong>, согласен&#33;]]></description>
        <author>JoeUser</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411567&amp;view=findpost&amp;p=3748728</guid>
        <pubDate>Thu, 09 Nov 2017 12:09:56 +0000</pubDate>
        <title>Алгоритм разбора BB-разметки с вложениями</title>
        <link>https://forum.sources.ru/index.php?showtopic=411567&amp;view=findpost&amp;p=3748728</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411567&view=findpost&p=3748724'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2017-11-09T11:56:15+00:00">09.11.17, 11:56</time></span><div class='quote '>Ошибка разметки</div></div><br>
В корне не согласен с трактовкой. Разбор должен проходить по принципу &quot;Кто первый встал, того и тапки&quot;. Так что в первом примере у тебя валидный тег {pre}, внутри которого есть подстрока {code}, и &quot;зависший&quot; закрывающий тег {/code}, который должен интерпретироваться как обычный текст. Аналогично и во втором примере всё наоборот - валиден {code} и &quot;подвис&quot; {/pre}. А то с твоим подходом какое-нибудь<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{code} ... {pre} ... {/code} ... {code} ... {/pre} ... {/code}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
вообще нормально не разберётся. <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411567&view=findpost&p=3748724'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2017-11-09T11:56:15+00:00">09.11.17, 11:56</time></span><div class='quote '>Как всю эту шляпу разобрать правильно?</div></div><br>
Флаг текущего тега, и всё. Пока не попался закрывающий, всё есть тело тега. Если текст кончился, а тег не закрыт - закрывать автоматически.]]></description>
        <author>Akina</author>
        <category>Алгоритмы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411567&amp;view=findpost&amp;p=3748724</guid>
        <pubDate>Thu, 09 Nov 2017 11:56:15 +0000</pubDate>
        <title>Алгоритм разбора BB-разметки с вложениями</title>
        <link>https://forum.sources.ru/index.php?showtopic=411567&amp;view=findpost&amp;p=3748724</link>
        <description><![CDATA[JoeUser: Буэнос диас, амигос&#33; :) <br>
Взялся я немного усовершенствовать форумный движок FluxBB. А именно:<br>
<br>
<ol class="tag-list" type="1"><li>Вместо забитого хардкодом bb-кода &quot;code&quot; - дать возможность пользовать нечто типа &quot;code=language&quot;</li><li>Добавить тэг разметки &quot;pre&quot;</li></ol><br>
Для справки, тэг &quot;code&quot; обрамляет блок текста, который нужно выводить моноширинным шрифтом, обрамлять css-атрибутом &quot;pre&quot;, сам блок не квотить. ВВ-тег делает все тоже самое. Разница в том, что в последующем блок &quot;code&quot; будет раскрашиваться по синтаксису, а блок &quot;pre&quot; - просто выводить моноширинный текст на своем фоне.<br>
<br>
Получить позиции этих bb-тегов - первый шаг и очень простой, в PHP решается регуляркой и функцией &quot;preg_match_all&quot;, последующим сканом текста. А вот далее - самое сложное. <span class="tag-color tag-color-named" data-value="red" style="color: red"><strong class='tag-b'>Далее в примере я буду использовать фигурные скобки в тегах, дабы нынешний форум не съедал разметку.</strong></span><br>
<br>
<strong class='tag-b'>Вложенность</strong><br>
<br>
В этом варианте вложенный блок &quot;code&quot; - выделяться не должен, от часть текста из &quot;pre&quot;:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{pre}</div><div class="code_line">{code=cpp}</div><div class="code_line">if (true == false) exit();</div><div class="code_line">{/code}</div><div class="code_line">{/pre}</div></ol></div></div></div></div><br>
В этом варианте вложенный блок &quot;pre&quot; - выделяться не должен, от часть строки из кода:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{code=cpp}</div><div class="code_line">std::cout &#60;&#60; &quot;{pre} строка {/pre}&quot; &#60;&#60; std::endl;</div><div class="code_line">{/code}</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'>Ошибка разметки</strong><br>
<br>
В этом случае открывающий тег &quot;pre&quot; не закрывается, т.к. &quot;закрывалка&quot; находится в валидном блоке &quot;code&quot;. Первый открывающий тег &quot;pre&quot; должен просто квотиться:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{pre}</div><div class="code_line">{code}</div><div class="code_line">std::cout &#60;&#60; &quot;строка {/pre}&quot; &#60;&#60; std::endl;</div><div class="code_line">{/code}</div></ol></div></div></div></div><br>
<br>
В этом случае открывающий тег &quot;code&quot; не закрывается, т.к. &quot;закрывалка&quot; находится в валидном блоке &quot;pre&quot;. Первый открывающий тег &quot;code&quot; должен просто <br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{code}</div><div class="code_line">{pre}</div><div class="code_line">delimitel=&quot;{/code}&quot;</div><div class="code_line">{/pre}</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'>Собственно, вопрос:</strong><br>
<br>
Как всю эту шляпу разобрать правильно? На ум приходит - строить дерево и по нему бегать. И то, пока не понятно как :-? <br>
Ваши мнения?]]></description>
        <author>JoeUser</author>
        <category>Алгоритмы</category>
      </item>
	
      </channel>
      </rss>
	