![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Elfenlide |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 8.9.2012 Где: Беларусь Репутация: нет Всего: нет |
Доброго всем времени суток, передомной такая задача: разработать собственный язык разметки на замену Html, разработать браузер который будет поддерживать этот язык и отображать странички. Так как использовать нужно Qt, есть там замечательная штука как компенент QWebView, можно свой язык переводить в html а затем выводить через компоненту.
Для того чтобы описать свой язык нужно использовать какой-то парсер, преподавательпредложил использовать flex/bison или antlr, но сам по этим библиотекам ничего не сказал."разбирайтесь сами." Я решил использовать Qt 5 подключив его к Visual Studio 2010. Вот моя идея: Открыть текстовый файл с моим текстом в обработке собственными тегами, парсить строку а затем сохранять результат в новый файл формата html, после чего выводить его на экран как html файл через QWebView. Проблема:Облазил всё что мог, гуглил как умею и как не умею, но так и не нашёл как можно подключить flex/bison или antlr для работы с С++. Прошу объяснить значиющих как это делается. P.S: У меня походу совсем кривые руки, тут в поиске ввожу слово "flex" в ответ вижу фигу в виде строки "по вашему запросу ничего не найдено", хотя на форум забёрл по одной из сылок о flex-е из гугла |
|||
|
||||
kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
flex и bison это не библиотеки, а генераторы кода - они принимают на вход файл с описанием грамматики (bison), или с описанием лексем (flex), и по ним генерируют C код, который потом можно включить в проект...
Я бы рекомендовал использовать flexc++ и bisonc++ (http://flexcpp.sourceforge.net/), они генерируют c++ код (flex и bison вроде тоже умеют C++, но код там получается довольно корявый)... -------------------- ![]() |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Если твой язык разметки основан на xml - никакие бизоны не нужны.
В Qt есть классы для работы с xml, можно непосрадственно отображать xml (примеры этого есть в Qt), можно преобразовать xml в html и отображать полученный html (в самом Qt таких примеров нет, но думаю найти в инете можно). |
|||
|
||||
Elfenlide |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 8.9.2012 Где: Беларусь Репутация: нет Всего: нет |
Нет, мне надо что-то своё придумать аля "BigWrods(hello world)" и чтобы парсер обработав это дело вывел мне "HELLO WORLD" что бы было проще сказали можно преобразовывать в html и выводить на компоненту QWebView. Добавлено через 7 минут и 4 секунды Теперь понял, но я уже неделю интернет мучаю, и не могу понять как это дело работает...готовые примеры видел, какие-то даже запустились...но как и почему, я так и не понял. Если вам не трудно, могли бы вы написать самый простой пример(Hello world) чтоли... и при этом как-то показать что к чему и как делается? я так понял что нужно будет написать с++ код, потом создать какой-то Makefile, затем запустить генератор какой-то и он всё это обработает как надо, после чего я получу программу которую хочу. Но эта моя теория мне не помогла\ Форумы и сайты которые я находил с данной тематикой иллюстрируют примеры и что-то говорят о работе flex/bison, как они работают и что делают я вроде как понял, но я нигде не нашёл описания того, как пользоваться этими генераторами...препод сказал что можно использовать CMake для генерации проекта с включенным бизоном и флексом, но как это делать.."я давно это делал и уже не помню"... |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
попробуй antlr, можно использовать довольно дружественный antlrworks, это визуальная среда. как вариант библиотеки безо всяких внешних генераторов и заморочек с make - boost::spirit Добавлено через 1 минуту и 7 секунд описание boost::spirit почти с этого и начинается)) |
|||
|
||||
kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
А с другой стороны придется избавляться от левой рекурсии, что многим очень трудно дается, аналогично и с boost::spirit, но там еще и огромные нечитаемые портянки сообщений об ошибках компилятора, если что-то не так сделаешь... Это зависит от инструментов разработки... Если хочется интегрировать генерацию кода в процесс сборки, то можно Makefile или CMake использовать... А можно просто на эту тему не заморачиваться (это же не реальный проект, а учебный, если я правильно понимаю) и генерировать исходники лексера и парсера вручную после каждого изменения входных файлов для генератора... Хеллоуворлд уже давно написан, нужно только поискать: http://flexcpp.sourceforge.net/flexc++man.html З.Ы. В VisualStudio можно настроить pre build step, чтобы на нем генерировались файлы кода из спецификаций (предварительно сгенерив файлы руками и включив их в проект)... Это сообщение отредактировал(а) kosmonaFFFt - 26.3.2013, 13:20 -------------------- ![]() |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
идеала нет.
все средства требуют определенной подготовки пользователя |
|||
|
||||
Elfenlide |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 8.9.2012 Где: Беларусь Репутация: нет Всего: нет |
Дело в том что примеров кучу я уже находил, а вот где написано будет куда нажимать итд, такого не видел. Тоесть, вот есть у меня например исходники простого примера, как мне заставить их работать? Я конкретно не знаю и не понимаю того, что нужно сделать для того чтобы запустить написанную программулину. Вот я выложил файлик, там калькулятор с граматикой итд..что делать дальше если я написал грамматику...логично сгенерировать парсер работающий на её основе, но как это сделать я не знаю так как у меня flex и bison это просто две папки с множеством файлов. Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() |
|||
|
||||
Elfenlide |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 8.9.2012 Где: Беларусь Репутация: нет Всего: нет |
Я сижу под Windows, а везде где я читал про генерирование, там какие-то g++ . Я так понял это Unix системы
Присоединённый файл ( Кол-во скачиваний: 1 ) ![]() |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Elfenlide, g++ входит в состав mingw, работающего под windows.
|
|||
|
||||
Elfenlide |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 8.9.2012 Где: Беларусь Репутация: нет Всего: нет |
||||
|
||||
baldina |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
этого, батенька, вам никто не скажет. тут все умели когда-то нажимать, но давно забыли. спросите преподавателя: много проще и короче показать пальцем, сидя рядом. Добавлено через 11 минут и 15 секунд
составляете файл с грамматикой, допустим calculator.y (пример из документации)
дальше напускаете на него bison:
получаете в результате calculator.tab.с дальше составляете файл с лексическим анализатором (через flex или руками) calc_lex.c:
вот эти два файла составляют исходный код приложения. их нужно включить в ваш проект VS2010 |
||||||||
|
|||||||||
Elfenlide |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 8.9.2012 Где: Беларусь Репутация: нет Всего: нет |
Вот и препод мне тоже самое сказал.... Вот, вы сказали то что я знаю, файлы составлять итд....но вот каким образом . У меня flex и bison это две папки с кучей файлов. Видимо с ними(папками) что-то нужно сделать, чтобы потом иметь возможность bison-ом творить чудеса, вот что именно, мне и интересно\ |
|||
|
||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
в текстовом редакторе ![]() серьезно, надо а) изучать синтаксис б) для начала составить БНФ своего языка, она уже преобразуется в синтаксис bison
ваша куча файлов - http://downloads.sourceforge.net/gnuwin32/...n-2.4.1-bin.zip разворачиваете архив в папку (видимо это уже сделано) в папке bin видим bison.exe - вот его и надо запускать, передавая в качестве параметра ваш .y файл автоматизировать это дело можно, настроив в VS pre-build шаг, прописав туда вызов bison Добавлено через 14 секунд с flex аналогично Добавлено через 6 минут и 41 секунду начните с этого. как будет готово, с инструментом будет легче определиться: может оказаться, что ваш язык укладывается в регулярные выражения. если нет, он может оказаться прост настолько, что проще будет свой парсер написать. создание языка и (в случае инструментов типа bison) формирование БНФ мне кажется наиболее важным и сложным (остальное дело техники) Добавлено через 9 минут и 57 секунд
можно и не сохранять, а сразу передавать в QWebView::setHtml() |
||||
|
|||||
Elfenlide |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 8.9.2012 Где: Беларусь Репутация: нет Всего: нет |
Вот, у меня левые какие-то архивы были, скачал bison, flex с екзешкой не нашёл, но примеры не работают...я беру отсюда http://flexcpp.sourceforge.net/flexc++man.html и делаю как написано. bison ругается. Поискал flex, нашёл архив где под винду flex/bison сразу, вроде работают, но ошибки всё-равно есть, пробовал пример выше сделать бизоном calc.tab.c, а флексом лексический анализатор сделать не вышло. Брал такой исходник:
получил: C:\Flex & Bison\win_flex_bison-latest>win_flex lexer.l lexer.l:5: EOF encountered inside an action Когда попробовал ваш готовый анализатор взять и просто сделать преокт в Visual Studio, как я понял всё что нужно было сделать, это добавить туда эти два файла, получил в студии ошибки: Ошибка 1 error C2065: yylval: необъявленный идентификатор c:\flex & bison\win_flex_bison-latest\lexerp.c 13 Ошибка 2 error C2065: NUM: необъявленный идентификатор c:\flex & bison\win_flex_bison-latest\lexerp.c 14 7 IntelliSense: идентификатор "yylval" не определен c:\flex & bison\win_flex_bison-latest\lexerp.c 13 8 IntelliSense: идентификатор "NUM" не определен c:\flex & bison\win_flex_bison-latest\lexerp.c 14 9 IntelliSense: недопустимый неполный тип c:\flex & bison\win_flex_bison-latest\lexerp.c 22 10 IntelliSense: требуется объявление c:\flex & bison\win_flex_bison-latest\lexerp.c 24 11 IntelliSense: идентификатор "yyparse" не определен c:\flex & bison\win_flex_bison-latest\lexerp.c 29 Я уже подумываю, но парсеры нормальные писать не умею, миллион ифов писать не хочеться потому что это не правильно, а вот разобраться в такой штуке как генератор парсера вроде как очень полезно. тут разрабатывать то нечего, я буду просто писать в файле текст типа: Hello Kursive(World) newLine, и он мне должен вызвать функцию Kursive для букв в скобках, преобразовать в строку <i>World</i> и вывести уже в html тегах обработанную как курсив, ну итд...а вместо <br> нужно писать что-то типа newLine для перевода на новую строку... Вообще я взялся за флекс и бизон потому что не знаю как по другому сделать, ну, не включая парсера из пары сотен ифов..это даже не парсер а ересь какая-то...а препод только о бизоне, флексе и antlr заикнулся, antlr пробовал разобрать, но на с++ как с ним работать не особо въехал, везде про Java почти написано и интеграцию с Eclipse, думал сделать на Java парсер чтобы вызывался от с++ готовый джавовский екзешник и превращал мой язык в html, после чего выводил бы на QWebView уже готовую страничку просто, идея сразу не очень понравилась, а когда решил попробоввать убедился в том что тупня это.... |
|||
|
||||
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. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |