converter
От: Аноним  
Дата: 16.06.05 13:15
Оценка:
Привет всем!
Есть такая задача:

дана последовательность
текст /a текст /b текст /c текст /b текст

текст это любые символы кроме /a, /b и /c

/a, /b и /c могут встречаться в любой последовательности

надо создать такое

текст
<a>
текст
<b>
текст
<c>
текст
</c>
</b>
<c>
текст
</c>
</a>

Наверно есть какой-то алгоритм? Как такие вещи обычно делаются?
Re: converter
От: Аноним  
Дата: 16.06.05 13:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет всем!

А>Есть такая задача:

А>дана последовательность

А>текст /a текст /b текст /c текст /b текст

А>текст это любые символы кроме /a, /b и /c


А>/a, /b и /c могут встречаться в любой последовательности


А>надо создать такое


А>текст

А><a>
А> текст
А> <b>
А> текст
А> <c>
А> текст
А> </c>
А> </b>
А> <c>
А> текст
А> </c>
А></a>

А>Наверно есть какой-то алгоритм? Как такие вещи обычно делаются?


А регулярные выражения не катят? Или язык не позволяет?
Re: converter
От: korzhik Россия  
Дата: 16.06.05 13:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет всем!

А>Есть такая задача:

http://www.rsdn.ru/Forum/Message.aspx?mid=1200621&amp;only=1
Автор: Кодт
Дата: 01.06.05
Re: converter
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 16.06.05 13:47
Оценка: 3 (1)
Здравствуйте, <Аноним>, Вы писали:

А>Наверно есть какой-то алгоритм? Как такие вещи обычно делаются?


Можно использовать LEX. Например, так:

uses LexLib;

%%

"\"a      {Обработка тега \a} ;
"\"b      {Обработка тега \b} ;
"\"c      {Обработка тега \c} ;
 
.           echo;

%%

begin
  if yylex=0 then ;
end.
... << RSDN@Home 1.1.3 stable >>
Re[2]: converter
От: Аноним  
Дата: 16.06.05 14:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А регулярные выражения не катят? Или язык не позволяет?


Это можно сделать с помощью регулярных выражений?
У меня не получилось.
Re[2]: converter
От: Аноним  
Дата: 16.06.05 14:28
Оценка:
Здравствуйте, korzhik, Вы писали:

K>http://www.rsdn.ru/Forum/Message.aspx?mid=1200621&amp;only=1
Автор: Кодт
Дата: 01.06.05


Спасибо за ссылку Очень похожая задача.
В дополнение к этому решению можно использовать шаблон Visitor.
Re[2]: converter
От: Аноним  
Дата: 16.06.05 14:31
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Можно использовать LEX.


Да, генерация парсера, самое лучшее решение! Именно это наверно я и сделаю.
Спасиб!
Re: converter
От: Кодт Россия  
Дата: 16.06.05 15:29
Оценка:
Здравствуйте, Аноним, Вы писали:


А>дана последовательность

А>текст /a текст /b текст /c текст /b текст

А>надо создать такое

А>текст
А><a>
А>  текст
А>  <b>
А>    текст
А>    <c>
А>       текст
А>    </c>
А>  </b>
А>  <c>
А>    текст
А>  </c>
А></a>

А>Наверно есть какой-то алгоритм? Как такие вещи обычно делаются?

Транслятор состоит из 2 частей
— лексического анализатора, нарезающего входную последоватльность на текст и тэги
— и синтаксического, который интерпретирует эти лексемы.

Лексический анализатор:
Вообще говоря, конечный автомат, но из-за своей простоты его можно "хардкодить" — поиск подстрок.

Синтаксический анализатор:
Конечный автомат, который удобнее реализовывать как стековый.
Состоянием является стек из не более чем 3 разных тэгов (всего, очевидно, 16 состояний)
Если на входе автомата текст, то на выходе этот же текст, и состояние не меняется.
Если на входе тэг, которого нет на стеке, то на выходе соответствующий открывающий тэг, и тэг добавляется в стек.
Если на входе тэг, который уже есть на стеке, то стек отматывается, и на выход подаются соответствующие закрывающие тэги.
Перекуём баги на фичи!
Re[2]: converter
От: Кодт Россия  
Дата: 16.06.05 15:32
Оценка:
К>Если на входе тэг, который уже есть на стеке, то стек отматывается, и на выход подаются соответствующие закрывающие тэги.
... а потом стек наматывается обратно, чтобы восстановить тэги, которые не были закрыты.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.