Здравствуйте, <Аноним>, Вы писали:
А>Наверно есть какой-то алгоритм? Как такие вещи обычно делаются?
Можно использовать LEX. Например, так:
uses LexLib;
%%
"\"a {Обработка тега \a} ;
"\"b {Обработка тега \b} ;
"\"c {Обработка тега \c} ;
. echo;
%%
begin
if yylex=0 then ;
end.
... << RSDN@Home 1.1.3 stable >>
Здравствуйте, Аноним, Вы писали:
А>А регулярные выражения не катят? Или язык не позволяет?
Это можно сделать с помощью регулярных выражений?
У меня не получилось.
Здравствуйте, korzhik, Вы писали:
K>http://www.rsdn.ru/Forum/Message.aspx?mid=1200621&only=1Автор: Кодт
Дата: 01.06.05
Спасибо за ссылку
Очень похожая задача.
В дополнение к этому решению можно использовать шаблон Visitor.
Здравствуйте, Mystic, Вы писали:
M>Можно использовать LEX.
Да, генерация парсера, самое лучшее решение! Именно это наверно я и сделаю.
Спасиб!
Здравствуйте, Аноним, Вы писали:
А>дана последовательность
А>текст /a текст /b текст /c текст /b текст
А>надо создать такое
А>текст
А><a>
А> текст
А> <b>
А> текст
А> <c>
А> текст
А> </c>
А> </b>
А> <c>
А> текст
А> </c>
А></a>
А>Наверно есть какой-то алгоритм? Как такие вещи обычно делаются?
Транслятор состоит из 2 частей
— лексического анализатора, нарезающего входную последоватльность на текст и тэги
— и синтаксического, который интерпретирует эти лексемы.
Лексический анализатор:
Вообще говоря, конечный автомат, но из-за своей простоты его можно "хардкодить" — поиск подстрок.
Синтаксический анализатор:
Конечный автомат, который удобнее реализовывать как стековый.
Состоянием является стек из не более чем 3 разных тэгов (всего, очевидно, 16 состояний)
Если на входе автомата текст, то на выходе этот же текст, и состояние не меняется.
Если на входе тэг, которого нет на стеке, то на выходе соответствующий открывающий тэг, и тэг добавляется в стек.
Если на входе тэг, который уже есть на стеке, то стек отматывается, и на выход подаются соответствующие закрывающие тэги.