Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Qt и flex/bison или antlr + Visual Studio, работа с Qt и flex/bison or antlr 
:(
    Опции темы
Elfenlide
Дата 24.3.2013, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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-е из гугла
PM MAIL Skype   Вверх
kosmonaFFFt
Дата 25.3.2013, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



flex и bison это не библиотеки, а генераторы кода - они принимают на вход файл с описанием грамматики (bison), или с описанием лексем (flex), и по ним генерируют C код, который потом можно включить в проект...
Я бы рекомендовал использовать flexc++ и bisonc++ (http://flexcpp.sourceforge.net/), они генерируют c++ код (flex и bison вроде тоже умеют C++, но код там получается довольно корявый)...


--------------------
user posted image
PM MAIL ICQ   Вверх
math64
Дата 25.3.2013, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Если твой язык разметки основан на xml - никакие бизоны не нужны.
В Qt есть классы для работы с xml, можно непосрадственно отображать xml (примеры этого есть в Qt), можно преобразовать xml в html и отображать полученный html (в самом Qt таких примеров нет, но думаю найти в инете можно).
PM   Вверх
Elfenlide
Дата 26.3.2013, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 8.9.2012
Где: Беларусь

Репутация: нет
Всего: нет



Цитата(math64 @  25.3.2013,  07:21 Найти цитируемый пост)
Если твой язык разметки основан на xml - никакие бизоны не нужны.
В Qt есть классы для работы с xml, можно непосрадственно отображать xml (примеры этого есть в Qt), можно преобразовать xml в html и отображать полученный html (в самом Qt таких примеров нет, но думаю найти в инете можно). 

Нет, мне надо что-то своё придумать аля "BigWrods(hello world)" и чтобы парсер обработав это дело вывел мне "HELLO WORLD" что бы было проще сказали можно преобразовывать в html и выводить на компоненту QWebView.

Добавлено через 7 минут и 4 секунды
Цитата(kosmonaFFFt @  25.3.2013,  07:21 Найти цитируемый пост)
flex и bison это не библиотеки, а генераторы кода - они принимают на вход файл с описанием грамматики (bison), или с описанием лексем (flex), и по ним генерируют C код, который потом можно включить в проект...
Я бы рекомендовал использовать flexc++ и bisonc++ (http://flexcpp.sourceforge.net/), они генерируют c++ код (flex и bison вроде тоже умеют C++, но код там получается довольно корявый)... 

Теперь понял, но я уже неделю интернет мучаю, и не могу понять как это дело работает...готовые примеры видел, какие-то даже запустились...но как и почему, я так и не понял.
Если вам не трудно, могли бы вы написать самый простой пример(Hello world) чтоли... и при этом как-то показать что к чему и как делается? я так понял что нужно будет написать с++ код, потом создать какой-то Makefile, затем запустить генератор какой-то и он всё это обработает как надо, после чего я получу программу которую хочу. Но эта моя теория мне не помогла\

Форумы и сайты которые я находил с данной тематикой иллюстрируют примеры и что-то говорят о работе flex/bison, как они работают и что делают я вроде как понял, но я нигде не нашёл описания того, как пользоваться этими генераторами...препод сказал что можно использовать CMake для генерации проекта с включенным бизоном и флексом, но как это делать.."я давно это делал и уже не помню"...

PM MAIL Skype   Вверх
baldina
Дата 26.3.2013, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Elfenlide @  24.3.2013,  20:01 Найти цитируемый пост)
flex/bison или antlr

попробуй antlr, можно использовать довольно дружественный antlrworks, это визуальная среда.

как вариант библиотеки безо всяких внешних генераторов и заморочек с make - boost::spirit

Добавлено через 1 минуту и 7 секунд
Цитата(Elfenlide @  26.3.2013,  11:49 Найти цитируемый пост)
самый простой пример(Hello world) чтоли

описание boost::spirit почти с этого и начинается))
PM MAIL   Вверх
kosmonaFFFt
Дата 26.3.2013, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



Цитата(baldina @  26.3.2013,  16:08 Найти цитируемый пост)
попробуй antlr, можно использовать довольно дружественный antlrworks, это визуальная среда.

А с другой стороны придется избавляться от левой рекурсии, что многим очень трудно дается, аналогично и с boost::spirit, но там еще и огромные нечитаемые портянки сообщений об ошибках компилятора, если что-то не так сделаешь...

Цитата(Elfenlide @  26.3.2013,  15:49 Найти цитируемый пост)
Форумы и сайты которые я находил с данной тематикой иллюстрируют примеры и что-то говорят о работе flex/bison, как они работают и что делают я вроде как понял, но я нигде не нашёл описания того, как пользоваться этими генераторами...препод сказал что можно использовать CMake для генерации проекта с включенным бизоном и флексом, но как это делать.."я давно это делал и уже не помню"...

Это зависит от инструментов разработки... Если хочется интегрировать генерацию кода в процесс сборки, то можно Makefile или CMake использовать... А можно просто на эту тему не заморачиваться (это же не реальный проект, а учебный, если я правильно понимаю) и генерировать исходники лексера и парсера вручную после каждого изменения входных файлов для генератора...

Хеллоуворлд уже давно написан, нужно только поискать: http://flexcpp.sourceforge.net/flexc++man.html

З.Ы. В VisualStudio можно настроить pre build step, чтобы на нем генерировались файлы кода из спецификаций (предварительно сгенерив файлы руками и включив их в проект)...

Это сообщение отредактировал(а) kosmonaFFFt - 26.3.2013, 13:20


--------------------
user posted image
PM MAIL ICQ   Вверх
baldina
Дата 26.3.2013, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



идеала нет.
все средства требуют определенной подготовки пользователя
PM MAIL   Вверх
Elfenlide
Дата 26.3.2013, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 8.9.2012
Где: Беларусь

Репутация: нет
Всего: нет



Цитата(kosmonaFFFt @  26.3.2013,  13:18 Найти цитируемый пост)
Хеллоуворлд уже давно написан, нужно только поискать: http://flexcpp.sourceforge.net/flexc++man.html

Дело в том что примеров кучу я уже находил, а вот где написано будет куда нажимать итд, такого не видел. Тоесть, вот есть у меня например исходники простого примера, как мне заставить их работать? Я конкретно не знаю и не понимаю того, что нужно сделать для того чтобы запустить написанную программулину. 
Вот я выложил файлик, там калькулятор с граматикой итд..что делать дальше если я написал грамматику...логично сгенерировать парсер работающий на её основе, но как это сделать я не знаю так как у меня flex и bison это просто две папки с множеством файлов.

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  parser.tar.gz 1,43 Kb
PM MAIL Skype   Вверх
Elfenlide
Дата 26.3.2013, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 8.9.2012
Где: Беларусь

Репутация: нет
Всего: нет



Я сижу под Windows, а везде где я читал про генерирование, там какие-то g++ . Я так понял это Unix системы

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  parser.tar.gz 1,43 Kb
PM MAIL Skype   Вверх
bsa
Дата 26.3.2013, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Elfenlide, g++ входит в состав mingw, работающего под windows.
PM   Вверх
Elfenlide
Дата 26.3.2013, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 8.9.2012
Где: Беларусь

Репутация: нет
Всего: нет



Цитата(bsa @  26.3.2013,  13:47 Найти цитируемый пост)
g++ входит в состав mingw, работающего под windows. 

Понятно, спасибо, почитаю. 
Но всё же, что делать с архивами? для меня сейчас bison и flex это просто две папки с файлами\
Если не трудно, объясните на примере исходников которые нуждаються в генерации.
PM MAIL Skype   Вверх
baldina
Дата 26.3.2013, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Elfenlide @  26.3.2013,  13:37 Найти цитируемый пост)
 а вот где написано будет куда нажимать

этого, батенька, вам никто не скажет. тут все умели когда-то нажимать, но давно забыли. спросите преподавателя: много проще и короче показать пальцем, сидя рядом.

Добавлено через 11 минут и 15 секунд
Цитата(Elfenlide @  26.3.2013,  14:05 Найти цитируемый пост)
Если не трудно, объясните на примере исходников которые нуждаються в генерации. 

составляете файл с грамматикой, допустим calculator.y (пример из документации)
Код

/* Reverse polish notation calculator. */

%{
#define YYSTYPE double
#include <math.h>
%}

%token NUM

%% 

input:    /* empty */
        | input line
;

line:     '\n'
        | exp '\n'  { printf ("\t%.10g\n", $1); }
;

exp:      NUM             { $$ = $1;         }
        | exp exp '+'     { $$ = $1 + $2;    }
        | exp exp '-'     { $$ = $1 - $2;    }
        | exp exp '*'     { $$ = $1 * $2;    }
        | exp exp '/'     { $$ = $1 / $2;    }
      /* Exponentiation */
        | exp exp '^'     { $$ = pow ($1, $2); }
      /* Unary minus    */
        | exp 'n'         { $$ = -$1;        }
;
%%

дальше напускаете на него bison:
Код

>bison calculator.y

получаете в результате calculator.tab.с
дальше составляете файл с лексическим анализатором (через flex или руками) calc_lex.c:

Код

#include <stdio.h>
#include <ctype.h>

int yylex ()
{
  int c;

  /* skip white space  */
  while ((c = getchar ()) == ' ' || c == '\t')  
    ;
  /* process numbers   */
  if (c == '.' || isdigit (c))                
    {
      ungetc (c, stdin);
      scanf ("%lf", &yylval);
      return NUM;
    }
  /* return end-of-file  */
  if (c == EOF)                            
    return 0;
  /* return single chars */
  return c;                                
}

void yyerror (s)  /* Called by yyparse on error */
     char *s;
{
  printf ("%s\n", s);
}

int main ()
{
  yyparse ();
  return 0;
}


вот эти два файла составляют исходный код приложения. их нужно включить в ваш проект VS2010
PM MAIL   Вверх
Elfenlide
Дата 26.3.2013, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 8.9.2012
Где: Беларусь

Репутация: нет
Всего: нет



Цитата(baldina @  26.3.2013,  14:10 Найти цитируемый пост)
 тут все умели когда-то нажимать, но давно забыли.

Вот и препод мне тоже самое сказал....
Вот, вы сказали то что я знаю, файлы составлять итд....но вот каким образом 
Цитата(baldina @  26.3.2013,  14:10 Найти цитируемый пост)
дальше напускаете на него bison:
. У меня flex и bison это две папки с кучей файлов. Видимо с ними(папками) что-то нужно сделать, чтобы потом иметь возможность bison-ом творить чудеса, вот что именно, мне и интересно\

PM MAIL Skype   Вверх
baldina
Дата 26.3.2013, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Elfenlide @  26.3.2013,  15:55 Найти цитируемый пост)
каким образом

в текстовом редакторе  smile 
серьезно, надо а) изучать синтаксис б) для начала составить БНФ своего языка, она уже преобразуется в синтаксис bison
Цитата(Elfenlide @  26.3.2013,  15:55 Найти цитируемый пост)
flex и bison это две папки с кучей файлов. Видимо с ними(папками) что-то нужно сделать

ваша куча файлов - http://downloads.sourceforge.net/gnuwin32/...n-2.4.1-bin.zip
разворачиваете архив в папку (видимо это уже сделано)
в папке bin видим bison.exe - вот его и надо запускать, передавая в качестве параметра ваш .y файл
автоматизировать это дело можно, настроив в VS pre-build шаг, прописав туда вызов bison

Добавлено через 14 секунд
с flex аналогично

Добавлено через 6 минут и 41 секунду
Цитата(Elfenlide @  24.3.2013,  20:01 Найти цитируемый пост)
 задача: разработать собственный язык разметки 

начните с этого. как будет готово, с инструментом будет легче определиться:
может оказаться, что ваш язык укладывается в регулярные выражения. если нет, он может оказаться прост настолько, что проще будет свой парсер написать.
создание языка и (в случае инструментов типа bison) формирование БНФ мне кажется наиболее важным и сложным (остальное дело техники)

Добавлено через 9 минут и 57 секунд
Цитата(Elfenlide @  24.3.2013,  20:01 Найти цитируемый пост)
парсить строку а затем сохранять результат в новый файл формата html, 

можно и не сохранять, а сразу передавать в QWebView::setHtml()
PM MAIL   Вверх
Elfenlide
Дата 26.3.2013, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 8.9.2012
Где: Беларусь

Репутация: нет
Всего: нет



Цитата(baldina @  26.3.2013,  16:25 Найти цитируемый пост)
в папке bin видим bison.exe

Вот, у меня левые какие-то архивы были, скачал bison, flex с екзешкой не нашёл, но примеры не работают...я беру отсюда http://flexcpp.sourceforge.net/flexc++man.html и делаю как написано. bison ругается. Поискал flex, нашёл архив где под винду flex/bison сразу, вроде работают, но ошибки всё-равно есть, пробовал пример выше сделать бизоном calc.tab.c, а флексом лексический анализатор сделать не вышло. Брал такой исходник:
Код


%%
[ \t\n]+                            // skip white space chars.
[0-9]+                              return NUMBER;
[[:alpha:]_][[:alpha:][:digit:]_]*  return IDENTIFIER;


получил: 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

Цитата(baldina @  26.3.2013,  16:25 Найти цитируемый пост)
проще будет свой парсер написать
 Я уже подумываю, но парсеры нормальные писать не умею, миллион ифов писать не хочеться потому что это не правильно, а вот разобраться в такой штуке как генератор парсера вроде как очень полезно.

Цитата(baldina @  26.3.2013,  16:25 Найти цитируемый пост)
разработать собственный язык разметки 
 тут разрабатывать то нечего,  я буду просто писать в файле текст типа: Hello Kursive(World) newLine, и он мне должен вызвать функцию Kursive для букв в скобках, преобразовать в строку <i>World</i> и вывести уже в html тегах обработанную как курсив, ну итд...а вместо <br> нужно писать что-то типа newLine для перевода на новую строку...
Вообще я взялся за флекс и бизон потому что не знаю как по другому сделать, ну, не включая парсера из пары сотен ифов..это даже не парсер а ересь какая-то...а препод только о бизоне, флексе и antlr заикнулся, antlr  пробовал разобрать, но на с++ как с ним работать не особо въехал, везде про Java почти написано и интеграцию с Eclipse, думал сделать на Java парсер чтобы вызывался от с++ готовый джавовский екзешник и превращал мой язык в html, после чего выводил бы на QWebView уже готовую страничку просто, идея сразу не очень понравилась, а когда решил попробоввать убедился в том что тупня это....

PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1004 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.