<?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=80084&amp;view=findpost&amp;p=563793</guid>
        <pubDate>Mon, 03 Jan 2005 11:30:02 +0000</pubDate>
        <title>Aнализ и выделение информации из текста</title>
        <link>https://forum.sources.ru/index.php?showtopic=80084&amp;view=findpost&amp;p=563793</link>
        <description><![CDATA[mikv: Наверное, многие сталкивались с задачами на анализ и выделение информации из текста. У многих начинающих программистов это вызывает серьезные проблемы. Однако существуют методы, которые позволяют решать задачи<br>
такого рода легко и быстро. Это автоматное программирование(или switch-технология).<br>
<br>
Сама теория автоматов, лежащая в основе этой технологии зародилась задолго до первых компьютеров. Еще в далекие 30-ые Алан Тьюринг исследовал абстрактную машину, которая являлась автоматом. Рассмотрим самый простой вариант - детерминированный конечный автомат(ДКА).<br>
<br>
Строгое определение(которое дается в умных книжках) выглядит примерно так:<br>
Конечным автоматом называется реализация алгебраической структуры (S, A, m, s0, F), где<br>
<strong class='tag-b'>S</strong> - непустое множество состояний;<br>
<strong class='tag-b'>A</strong> - конечное множество входных символов (алфавит);<br>
<strong class='tag-b'>m</strong> - отображение S*A--&#62;S, или функция переходов, которая каждой паре (символ, состояние) ставит в соответствие состояние из множества S;<br>
<strong class='tag-b'>s0</strong> - состояние из S, известное как начальное (стартовое);<br>
<strong class='tag-b'>F</strong> - множество заключительных (допускающих) состояний, F S или просто соответствует окончанию просмотра текста.<br>
<br>
Если сказать тоже самое попроще:<br>
КА представляет собой набор состояний и переходов между ними, зависящих от входных данных.<br>
<br>
Часто автомат представляют в виде графа. Прямоугольники - состояния. Стрелки - переходы между состояниями, а над стрелками обычно указывают условия перехода. <br>
<br>
Рассмотрим решение задачи с применением автоматов. Самый простой вариант:<br>
<em class='tag-i'>&quot;Дан текст программы на Pascal в файле input.txt. Следует удалить из него все комментарии и поместить преобразованный код в файл output.txt. Размер текста может превышать 1000 килобайт.&quot;</em><br>
<br>
Прежде всего, вспомним, что комментариями в языке Паскаль являются символы, заключенные между &#39;{&#39; и &#39;}&#39;.<br>
Построим автомат для решения задачи. У него будет 3 состояния: &#39;код&#39; и &#39;комментарий&#39;. Запишем все состояния и переходы между ними в табличку:<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">Состояние &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Символ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Новое состояние</div><div class="code_line">код &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; комментарий</div><div class="code_line">комментарий &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; код</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
<br>
Начальное состояние: code.<br>
<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">type</div><div class="code_line">&nbsp;&nbsp; automat = (code,comment); </div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; x &nbsp; &nbsp; &nbsp; &nbsp;: automat;</div><div class="code_line">&nbsp;&nbsp; ch &nbsp; &nbsp; &nbsp; : Char;</div><div class="code_line">&nbsp;&nbsp; inp,outp : File Of Char;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; x := code; </div><div class="code_line">&nbsp;&nbsp; Assign(inp,&#39;input.txt&#39;);</div><div class="code_line">&nbsp;&nbsp; Reset(inp);</div><div class="code_line">&nbsp;&nbsp; Assign(outp,&#39;output.txt&#39;);</div><div class="code_line">&nbsp;&nbsp; Rewrite(outp);</div><div class="code_line">&nbsp;&nbsp; while not(eof(inp)) do</div><div class="code_line">&nbsp;&nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;read(inp,ch);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;case ch of</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;{&#39;:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if x = code then x := comment;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;}&#39;:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if x = comment then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;x := code;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Continue; {Здесь мы делаем переход на заголовок цикла}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{иначе символ &#39;{&#39; будет выведен в выходной файл - ведь }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{автомат уже сменил состояние}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if x=code then write(outp,ch);</div><div class="code_line">&nbsp;&nbsp; end;</div><div class="code_line">&nbsp;&nbsp; Close(outp);</div><div class="code_line">&nbsp;&nbsp; Close(inp);</div><div class="code_line">end.</div></ol></div></div></div></div><br>
<br>
Теперь усложним задачу. Ведь у нас есть директивы компилятору. <br>
Наша первоначальная версия программы их также считает комментариями и удаляет. Модифицируем автомат, чтобы<br>
он оставлял в тексте программы директивы компилятора.<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">Состояние &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Символ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Новое состояние</div><div class="code_line">код &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; промежуточное</div><div class="code_line">комментарий &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; код</div><div class="code_line">промежуточное &nbsp; &nbsp; &nbsp; &nbsp;$ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; код </div><div class="code_line">промежуточное &nbsp; &nbsp; &nbsp; &nbsp;прочие симв. &nbsp; &nbsp;комментарий</div></ol></div></div></div></div><br>
<br>
Состояние &#39;промежуточное&#39; вводятся специально, чтобы обслуживать директивы компилятору. Обратите внимание,<br>
что на этот раз в программы мы явно не вводим состояние &#39;промежуточное&#39;. Но тем не менее, оно там присутствует.<br>
Код программы меняется совсем не сильно:<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">type</div><div class="code_line">&nbsp;&nbsp; automat = (code,comment); </div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; x &nbsp; &nbsp; &nbsp; &nbsp;: automat;</div><div class="code_line">&nbsp;&nbsp; ch, Tmp &nbsp;: Char;</div><div class="code_line">&nbsp;&nbsp; inp,outp : File Of Char;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; x := code; </div><div class="code_line">&nbsp;&nbsp; Assign(inp,&#39;input.txt&#39;);</div><div class="code_line">&nbsp;&nbsp; Reset(inp);</div><div class="code_line">&nbsp;&nbsp; Assign(outp,&#39;output.txt&#39;);</div><div class="code_line">&nbsp;&nbsp; Rewrite(outp);</div><div class="code_line">&nbsp;&nbsp; while not(eof(inp)) do</div><div class="code_line">&nbsp;&nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;read(inp,ch);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;case ch of</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;{&#39;:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if x = code then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;read(inp,Tmp);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if Tmp = &#39;$&#39; then </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; write(outp,ch);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; write(outp,Tmp);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Continue;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end else x := comment;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&#39;}&#39;:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if x = comment then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;x := code;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Continue; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if x=code then write(outp,ch);</div><div class="code_line">&nbsp;&nbsp; end;</div><div class="code_line">&nbsp;&nbsp; Close(outp);</div><div class="code_line">&nbsp;&nbsp; Close(inp);</div><div class="code_line">end.</div></ol></div></div></div></div><br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Эта тема была разделена из темы &quot;<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=51046' target='_blank'>Неотёсанные топики</a>&quot;</span></span><br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Сообщения были разделены в тему &quot;<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=93750' target='_blank'>Русские буквы в тексте</a>&quot;</span></span>]]></description>
        <author>mikv</author>
        <category>Все языки: Статьи, заготовки в FAQ</category>
      </item>
	
      </channel>
      </rss>
	