![]() |
Модераторы: 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 уже готовую страничку просто, идея сразу не очень понравилась, а когда решил попробоввать убедился в том что тупня это.... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |