![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 3 Всего: 43 |
Нужно C++(без шаблонов) разобрать.
Не хочется писать анализатор. Очень не хочется. Что будем советовать? Есть пара потенциальных вариантов типа сырцов gcc, сырцов doxygen, boost::sprtit, flex/bison, но еще не смотрел ничего Что советуем? |
|||
|
||||
| apook |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 794 Регистрация: 12.7.2006 Репутация: 9 Всего: 23 |
А что еще можно сделать? Там я встречал в НЭТе где-то готовую библиотеку что то вроде abc как-то называется в Linux используется, но я сам написал "некрутой" анализатор мне хватило. -------------------- Мои руки из дуба, голова из свинца ну и пусть ... |
|||
|
||||
| Goganchic |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 678 Регистрация: 18.6.2004 Репутация: нет Всего: 5 |
Есть такое специальное средство, называется ANTLR. Оно позволяет создавать любые компиляторы / парсеры / лексеры. Советую его. Принцип работы такой: ты создаешь грамматику, а потом ANTLR генерирует по ней код на Си++ или Java.
Хотя в принципе тебе потребуется составить анализатор.... |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
я использую styxlib 1.7
позволяет получать по грамматике синтаксический и семантический анализатор на С |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 3 Всего: 43 |
|
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 3 Всего: 43 |
MAKCim, а к примеру gcc под винду легко скомпилить?
|
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Что душе ближе Я из всего сего лично со спиритом в своё время лишь работал (gcc, doxygen, конечно юзаю, но не сорсы |
|||
|
||||
| Goganchic |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 678 Регистрация: 18.6.2004 Репутация: нет Всего: 5 |
а зачем? |
||||
|
|||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 3 Всего: 43 |
походу начну со спирита ) |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
nerezus, доложи о результатах непременно
К парсерам и трансляции у меня не праздный интерес. Спирит у меня оставил впечатление инструмента не на своём месте. Связываться с ним для разбора сложного языка я бы не стал. Может, просто не умею готовить И взгляни ещё на Stratego вместе с Transformers. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
А почему так? :( Потихоньку-потихоньку - и ничего ведь сложного... |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Любитель, на мой взгляд, спирит неплох для небольших парсеров, встречающихся в качестве побочной задачи. Полноценные ЯП на нём реализовывать не хочется.
Семантические действия задавать неудобно, деревья создавать неудобно. Компилируется очень долго, сообщения об ошибках чудовищны, отладка никакая. В конечном счёте, при определённом размере грамматики, это перекрывает преимущества лёгкой интеграции с C++. В общем, C++ не слишком подходящий язык для inline-парсеров. Тут рулят Haskell с Parsec или OCaml с CamlP4. Для C++ есть ANTLR (пока, увы, только 2.x; 3.0 — сказка, но генерация недоделана) или Elkhound (не такой стабильный и популярный, зато GLR). -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 3 Всего: 43 |
Хм... итак юзать придется ANTLR походу?
Но он как бы... на джаве? Я прав? А как взаимодействовать с моим С++-кодом? Хотел бы именно иметь дерево как результат работы парсеров. P.S. наверное писать буду на куте4. |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Он написан на Java, но может генерировать с равным успехом Java, C++, C# и др. На сайте ANTLR есть пример грамматики C++ с семантическими действиями на C++. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Ulysses4j |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 6.6.2007 Где: Ростов-на-Дону Репутация: 4 Всего: 10 |
Один из последних вопросов такого толка на clcm вызвал реакцию в духе: еще один, пытающийся найти holy grail. Регулярно появляются люди с желанием написать парсер С++. Для такой задачи, конечно, надо брать генератор парсеров типа Antlr, но вся ж сложность не в этом выборе. Грамматику нужно описать. С++ - язык с очень сложной грамматикой - это авторы признают, полного описания не смог придумать даже Комитет.
Короче говоря, это то же, что спросить: "как мне написать свою ОС". Это сообщение отредактировал(а) Ulysses4j - 1.7.2007, 16:24 -------------------- Communication is critical to the job of a programmer. C. Jazdzewski. Fatherly Advice To New Programmers |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 3 Всего: 43 |
мм, замечательно, типа оказывается задача не имеет решения?..
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Задача решаема, компиляторы C++ же существуют.
Просто грамматика C++ имеет массу неоднозначностей. Условие «без шаблонов» снимает значительную их часть. Возможно, не все из оставшихся потребуют обязательного разрешения для данной задачи. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Thunderbolt |
|
|||
![]() DevRel ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 7.11.2007 Где: Тула Репутация: 10 Всего: 16 |
Я понимаю, что опоздал с ответом. Но вдруг еще кому-то пригодится: OpenC++ library. http://opencxx.sourceforge.net VivaCore library. http://www.viva64.com/articles/VivaCore_Li..._%28rus%29.html (А еще можно написать мне и я с интересом обсужу подобные вопросы. [email protected]) --------------------
Карпов Андрей, DevRel в PVS-Studio. |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
В сторону: мне тут SLK советовали в частности для прототипов грамматик. Строит табличный LL(k) парсер. В нём не надо описывать всякие "%token"'ы и даже вместо "|" правила ветвлят переводом строки. Правда он вроде платный.
По топику: nerezus, распарсил с++ или не стал заморачиваться? -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| vadiml |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 2 Всего: 7 |
nerezus,
Я парсер C++ кода на перле писал, правда там задача посложнее была -- я отлавливал все функции классов и на основе их прописывал вызов. Шаблонные классы я пропустил, хотя сейчас уже придумал как и их задействовать. |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 3 Всего: 43 |
Вобщем для готового парсера написали набор правил, взяв за основу правила C.
Распарсить надо было не все, поэтому справились. И модифицировали код через перегрузку. И собственно все работало )) Теперь для себя решил написать компилер джавы. Именно компилер =) |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Во что? -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Посмотри на размер исходников jikes'а Добавлено через 1 минуту и 1 секунду (jikes - это старый компилятор явы в байткод, кажеццо ещё без поддержки генериков) Это сообщение отредактировал(а) Mayk - 28.2.2008, 07:02 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 3 Всего: 43 |
Void, в байткод. И написать под него VM. Только вот несовместимую с оригиналом.
Сейчас придумываю формат комманд и формат байткода. И наконец-то первый раз, думаю, напишу сабж не на питоне ) А то получалось, что всегда подобное у меня само собой на питоне пишется ) |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |