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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> чем парсить С/С++ код? 
V
    Опции темы
boostcoder
Дата 22.11.2010, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



всем привет.
в общем пишу метагенератор для своего проекта.
вопрос в том, каким образом обычно пишут парсеры? интересует парсинг С++ подобного синтаксиса.
может есть какие-то либы?

спасибо.

PM WWW   Вверх
azesmcar
Дата 22.11.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



их не пишут, их генерируют.
http://en.wikipedia.org/wiki/Comparison_of_parser_generators
PM   Вверх
A5uKa
  Дата 22.11.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

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



PM   Вверх
boostcoder
Дата 22.11.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(azesmcar @  22.11.2010,  12:55 Найти цитируемый пост)
их не пишут, их генерируют.

что-то там много всего) не понял что из этого выбрать?
вот мой синтаксис:
Код


class client_impl: client_side { // client_side - ключевое слово
   void set_int(int);
   void set_string(const std::string&);
   int get_int();
   int get_int(int);
};

class server_impl: server_side { // server_side - ключевое слово
   void set_int(int);
   void set_string(const std::string&);
   int get_int();
   int get_int(int);
};

class test_service: service("statistic service") { // service - ключевое слово
   test_service( // конструктор
      std::pair<int, int>& _pair,
      int _class_id,
      int _method_id
   );
   void any_method(int); // обычный метод
   void for_inkom_method() // метод, подключаемый к роутеру входящих команд. вызывается при вызове удаленной стороной методов перечисленных в []
      :incoming[
         client_impl::set_string,
         client_impl::get_int
      ];
   void for_outgo_method(): outgoing; // вызывается при любой исходящей команде
};

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

A5uKa, не очень понял, чем мне может помочь ваша ссылка...

Добавлено через 4 минуты и 18 секунд
up.

Это сообщение отредактировал(а) boostcoder - 22.11.2010, 13:12
PM WWW   Вверх
azesmcar
Дата 22.11.2010, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(boostcoder @  22.11.2010,  13:08 Найти цитируемый пост)
что-то там много всего) не понял что из этого выбрать?

например antlr

PM   Вверх
boostcoder
Дата 22.11.2010, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(azesmcar @  22.11.2010,  13:13 Найти цитируемый пост)
например antlr

посмотрел и понял, сходу не напишешь smile 
прям целая наука..

Добавлено через 36 секунд
напишу ка я по старинке smile 
PM WWW   Вверх
azesmcar
Дата 22.11.2010, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(boostcoder @  22.11.2010,  13:26 Найти цитируемый пост)
посмотрел и понял, сходу не напишешь  
прям целая наука..

Добавлено через 36 секунд
напишу ка я по старинке   

то, что имеет смысл писать на генераторах парсеров "по старинке" не напишешь smile 
PM   Вверх
MAKCim
Дата 22.11.2010, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



для начала нужна грамматика
потом любой генератор взять и реализовать грамматику на нем

самое сложное как раз грамматика


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
boostcoder
Дата 22.11.2010, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(azesmcar @  22.11.2010,  13:49 Найти цитируемый пост)
то, что имеет смысл писать на генераторах парсеров "по старинке" не напишешь

ну да smile 
но у меня задача простая.

всем спасибо. вопрос закрыт.

Добавлено через 1 минуту и 22 секунды
Цитата(MAKCim @  22.11.2010,  13:52 Найти цитируемый пост)
для начала нужна грамматика
потом любой генератор взять и реализовать грамматику на нем

самое сложное как раз грамматика 

а что в моем случае является грамматикой? smile 
PM WWW   Вверх
MAKCim
Дата 22.11.2010, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(boostcoder @  22.11.2010,  13:52 Найти цитируемый пост)
а что в моем случае является грамматикой?

это я должен знать?  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Эксперт
****


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

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



boostcoder, тебе ведь не парсер, а шаблонизатор нужен. потому и уверенность, что "по старинке" будет проще.
а не проще ли будет стандартными средствами языка воспользоваться: контейнерами, шаблонами?
а если эти "метаструктуры" - результат нечеловеческого труда (т.е. генерируются программно), почему бы сразу не генерить С++.
PM MAIL   Вверх
boostcoder
Дата 22.11.2010, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(baldina @  22.11.2010,  15:39 Найти цитируемый пост)
а не проще ли будет стандартными средствами языка воспользоваться: контейнерами, шаблонами?

контейнерами и шаблонами из с++ ?

Цитата(baldina @  22.11.2010,  15:39 Найти цитируемый пост)
а если эти "метаструктуры" - результат нечеловеческого труда (т.е. генерируются программно), почему бы сразу не генерить С++

сразу с++ и генерится. но из некоторого метасинтасиса. с++ подобного. с моими наваротами smile 
PM WWW   Вверх
baldina
Дата 22.11.2010, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



да. контейнеры, шаблоны, перегрузка операций - все это в с++ позволяет расширить синтаксис. в известных пределах, конечно, но для многих задач хватает.
неплохие примеры - boost::spirit, boost::signal. интересно сравнить последнюю с сигналами в qt


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


pattern`щик
****


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

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



Цитата(baldina @  22.11.2010,  17:01 Найти цитируемый пост)
да. контейнеры, шаблоны, перегрузка операций - все это в с++ позволяет расширить синтаксис. в известных пределах, конечно, но для многих задач хватает.

гм... вы наверное меня не правильно поняли...прочтите тему сначала.

Цитата(baldina @  22.11.2010,  17:01 Найти цитируемый пост)
boost::signal. интересно сравнить последнюю с сигналами в qt

а чего там сравнивать? boost::signals сделаны для людей smile 
PM WWW   Вверх
baldina
Дата 22.11.2010, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



типа
Код

class test_service: service("statistic service") { // service - ключевое слово
   test_service( // конструктор
      std::pair<int, int>& _pair,
      int _class_id,
      int _method_id
   );
   void any_method(int); // обычный метод
   void for_inkom_method() // метод, подключаемый к роутеру входящих команд. вызывается при вызове удаленной стороной методов перечисленных в []
      :incoming[
         client_impl::set_string,
         client_impl::get_int
      ];
   void for_outgo_method(): outgoing; // вызывается при любой исходящей команде
};

vs
Код

struct outgoing_base {
  virtual void operator()()=0;
};

template<...>
struct incoming {
  virtual void operator()()=0;
};

class test_service: service<statistic_service_tag> { // service - шаблонный класс
   test_service( // конструктор
      std::pair<int, int>& _pair,
      int _class_id,
      int _method_id
   );

   struct outgoing : public outgoing_base {
       void operator()() { ... }
   };

   template<>
   struct incoming : public incoming_base <clir_ouent_impl::set_string, client_impl::get_int> {
       void operator()() { ... }
   };

   void any_method(int); // обычный метод
   incoming for_inkom_method;
   outgoing fotgo_method; // outgoing::operator()() вызывается при любой исходящей команде
};

только пример, писал не раздумывая smile
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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