![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| 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. |