![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
||||
|
||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
может к черту бизон?
регулярные выражения, парсер, шаблонизатор, пара шаблонов.. -------------------- undefined |
|||
|
||||
Elfenlide |
|
||||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 8.9.2012 Где: Беларусь Репутация: нет Всего: нет |
нужно реализовать возможность: ◦ указывать ссылки на другие страницы; ◦ вставлять изображения в текст; ◦ устанавливать выравнивание текста и его стиль (аналоги тегов <b><i><u><font>). Я придумал так: $ это будет главное отличие, тоесть если не знак доллара, то свободно читаем как обычный символ и выводим как читаем. вместо тегов b, i, u, font, ,будут: $Bold() , $Kursiv(), $UnderLine(), $Font() - для простоты я решил изменить его, html эквивалентный имеет 3 параметра: высота символа, тип шрифта, цвет. Следовательно будут отдельные теги: $Color(), $Size(), $TypeText(). Ну и в таком стиле остальные: ссылки, загрузка картики. Просто если я буду считывать каждый символ, то это ифы итд...я уже накидал код такой, который по сиволам разбирает, но исключительно из-за того что скоро здавать нужно будет, и не хочу двойку. А вот что-то толковое изучить, какой-то метод которым можно парсер хороший написать я не знаю, поэтому и хотел взять бизон и флекс... Мой код на данный момент\ я думаю это не очень красивый вариант решения данной задачи. Я пишу на Qt, но тут от Qt только QString, остальное как в стандартном с++.
Добавлено через 9 минут и 5 секунд Да, забыл дописать, то что будет в скобках тега, то и будет обрабатываться им. $Bold(Hello) $UnderLine(World). Обрабатываются Hello и World соответственно. |
||||
|
|||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
У тебя не $Bold() , а $B() и т. д.
Не обрабатывается вложенность типа $B($I(Hello) $U(World)) т.е нужно искать не первую ), а парную и внутренность рекурсивно обрабатывать. Поиск $:
Генерировать html проще так:
|
||||
|
|||||
Elfenlide |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 8.9.2012 Где: Беларусь Репутация: нет Всего: нет |
Да, у меня $B() а не $Bold(), но это временно, для того чтобы быстрее писать программу, когда будет готова, чутка буду поправлять. Но честно говоря заканчивать её с кучей инструкций а не толковым парсером, желания нет.
baldina с мапом предлагает как-то замутить, вот мне это интересно. Может что-то классное выйдет. Я её думал сделать вызвав проверку на вложенность внутри методов путём просмотра строки между "()", но чуть позже. Я считаю что это вообщей самый ущербный метод, которые для "лишь бы сделать и забыть"...ну...я про это выше писал. Я знаю ещё есть метод конечного автомата со стеком состояний, как-то мне нужно было вводить строку типа {a,b,c,d,g,{u,j,k}} и создавать объекты собственного класса "множества" с элементами, ну и при этом должна быть фишка что множество может быть элементом другого множества. Но там только {} из символов,а тут нужно кучу разных тегов замутить... Вот как-то так:
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
QMap можно использовать так:
Ключи - теги между $ и ( Значения - код html с %1 на месте вставки аргумента. Добавлено через 13 минут и 7 секунд А вместо автомата с состояниями - используй рекурсию, при этом код будет более понятным. В этом случае текущее состояние определяется вызовами на стеке. |
|||
|
||||
Elfenlide |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 8.9.2012 Где: Беларусь Репутация: нет Всего: нет |
QMap<QString,QString> map;
map["Bold"]="<b>%1</b>"; Ключи - теги между $ и ( Значения - код html с %1 на месте вставки аргумента.[/quote] не совсем понял как работает, если я создам map["Bold"] то когда считывание строки будет происходить, он сам определит последовательность символов map? Если можно с каким-то простеньким примером поясните пожалуйста. |
|||
|
||||
math64 |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Ищешь $ или ) - что первое встретится.
Если найден ) - преобразуешь то, что до ) и выходишь из рекурсивной функции разбора Если найден $ - выбираешь имя тега
далее делаешь рекурсивный вызов parse() - на выходе индекс должен стоять на ')'
и повторяшь поиск. Это сообщение отредактировал(а) math64 - 28.3.2013, 07:34 |
||||||
|
|||||||
Elfenlide |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 8.9.2012 Где: Беларусь Репутация: нет Всего: нет |
эта строка отвечает за то что следующие 2 символа будут считаны из потока я так понял?которые идут после знака $ |
|||
|
||||
math64 |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
cap(0) - вся найденная строка $Bold(
cap(1) - первый фрагмент - $Bold( - выделен аргумент | - (\\$([A-Za-z]+)\\() cap(2) - второй фрагмент - Bold - специально выделено скобочками - ([A-Za-z]+) На всякий случай проверь:
Добавлено через 11 минут и 12 секунд
Аргумент | можно специально не выыделять - скобки нужны когда выриантная не вся строка, пример из документации:
|
||||||
|
|||||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
А я бы все же посмотрел в сторону bison'а. Ваша грамматика вся умещается в пару строк -
Где vCTRL - все слова, начинающиеся с $, а vSTR - все остальные символы (кроме скобок) Если делать это на flex'е, то это будет так
![]() Базовый класс ProgItem представляет кусок текста или фидективу форматирования. Он умеет вязаться в списки (функция ProgItem* join(ProgItem*,ProgItem*) ) Классы PIString и PICtrl - его наследники для чистых строк текста и директив форматирования соотвественно. Функция set_output передает наружу результат парсинга - дерево, соотвествующее вашему тексту. bison можно взять обычный С'ный - результат соберется в режиме С++ |
||||
|
|||||
Elfenlide |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 8.9.2012 Где: Беларусь Репутация: нет Всего: нет |
Я чутка не понял, так можно либо на флексе, либо на бизоне делать? я просто из всего что читал, понял что нужно их вместе использовать, лексер задаёт правила, парсер по ним работает. И я попробовал написать ваш код флекса, и получил в консоли кучу ошибок, насколько я понял синтаксис, правила должны быть заключены в %% %%, я добавил, вроде нормально сгенерировалось, осталось теперь только понять одно\ как этим делом пользоваться. Радость что теперь понимаю как генерировать это всё дело)Спасибо за это огромное). math64 и вас спасибо большое за помощь, попробую двумя способами сделать, лишним не будет. |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
бизон работает в паре в флексом.
Если планируестя усложнение грамматики, можно воспользоваться бизоном+флексом, а на теперешнем уровне для разбора достаточно одной рекурсивоной функции - так проще. В том числе и для отладки - отдаживаться в коде, сгенерированном бизоном неудобно. |
|||
|
||||
lexxmark |
|
||||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 8.4.2013 Репутация: нет Всего: нет |
Привет, попробую помоч с flex/bison для Qt.
Прежде всего добавь в начало своего *.pro файла вот этот кусок кода. Тут настраивается qmake, что бы обрабатывать flex/bison файлы.
Далее ниже в этом же *.pro файле прописываешь свои flex и bison файлы, например так:
После этого перестраиваешь проект и у тебя должны генерироваться MyFile.lexer.cpp и MyFile.parser.cpp файлы. Сами команды генерации (flex.commands/bison.commands) можешь адаптировать под свои нужды - менять параметры запуска. Как видишь для windows версии используется win_flex/win_bison. Их можешь взять отсюда: http://sourceforge.net/projects/winflexbison/ Это более компактные версии flex/bisоn. Как работать с flex/bison - можешь почитать pdf-ки с того же источника. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |