| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > enum+флаги+двоичные логические операции. |
| Автор: boostcoder 4.10.2011, 08:54 | ||
| всем привет. задача: разработать набор перечислений и функций для операций над ними, позволяющие описать декларации со всевозможными спецификаторами, к примеру: 1. переменные/переменные_члены. 2. функции/указатели_на_функции/ссылки_на_функции. 3. методы/указатели_на_методы/ссылки_на_методы. 4. конструкторы/деструкторы. со всевозможными спецификаторами. пока что накатал такое:
http://liveworkspace.org/code/d8c1203b76eb97f49e5514b5d4206323 вопросы: 1. что я упустил? 2. возможно ли для описания декларации использовать 32ух битное значение? т.е. хватит ли его диапазона? 3. каким образом(исходя из чего) перечислениям присваивать начальные значения? 4. т.к. не секрет, что у меня проблемы с двоичной логикой, наверное нужно для начала поупражняться в этом? спасибо. |
| Автор: newbee 4.10.2011, 09:20 | ||||||
short, inline. Ссылку на указатель на указатель на инт как описывать будешь?
|
| Автор: boostcoder 4.10.2011, 09:22 | ||||||||
| далее, все перечисления нужно свести в структуру. для функций, правило такое:
т.е. по идее, нужно описывать еще и возвращаемый тип. или просто добавить в decl_type_ член типа ret_type? что скажите? что-то мне подсказывает, что для этой задачи подходит AST итак - что, и в каком виде должен описывать узел AST? нужно подумать... Добавлено @ 09:26 логично.
понял. угу. нужно подумать. ладно. есть int64 и double. не проблема.
вроде понял.
не утрируй ;) Up. |
| Автор: mes 4.10.2011, 09:55 |
есть еще char [N], куда можно сложить еще больше.. только вот подойдет ли плоский набор флагов, или все ж нужно дерево.. |
| Автор: boostcoder 4.10.2011, 10:02 |
у меня недостаточно понимания чтоб решить это... вот, думаю. |
| Автор: newbee 4.10.2011, 10:26 |
| Если ты собираешься хранить структуру программы, естественно нужен AST. Если только описать все имеющиеся сущности... Зависит от того, насколько подробно ты собираешься это описывать. Например потроха класса: вложенный класс должен знать, что он вложенный? И даже в этом случае явное дерево не обязательно, тебе достаточно у каждой сущности сохранять идентификатор ее родителя: неймспейс, класс, функция. |
| Автор: boostcoder 4.10.2011, 11:18 |
нет. так же как и не нужно знать предков/наследников. |
| Автор: mes 4.10.2011, 11:57 | ||
ну так вначале напишите несколько правил для каждого из вариантов разбора, а после будет видно структуру какого типа это лучше всего помещать.. Добавлено через 2 минуты и 27 секунд имелось ввиду не классическое древо-список, а иерархический набор значений.. |
| Автор: boostcoder 4.10.2011, 12:03 | ||
этим и занимаюсь. Добавлено через 2 минуты и 40 секунд а кто-то может ответить на вопросы типа "(конструктор/дектруктор?)" в коде топика? чтоб не пришлось правила потом еще раз переписывать |
| Автор: xvr 4.10.2011, 12:49 |
| Возьмите описание AST из g++ и посмотрите во что он ляжет в вашем описании. Сразу станет видно, чего не хватает. |
| Автор: boostcoder 4.10.2011, 13:03 | ||
ведь просил же -
на практике это выполнить не реально. по крайней мере моему моцгу |
| Автор: xvr 4.10.2011, 13:17 |
А я не предлагаю 'выдрать кусок'. Я предлагаю использовать g++ AST в качестве источника информации о том, что именно должно содержаться в С++ AST. Вам в любом случае придется все, что там есть, реализовывать (пусть и по своему) Найдите там просто описание самого AST (структуры + enum'ы). Этого должно хватить |
| Автор: math64 4.10.2011, 18:00 |
| Модификаторы к основаному типу: не хватает ещё signed/unsigned. short упомянули, но есть ещё long и int64(long long); нет float нет bool кроме ссылок и указателей есть ещё массивы кроме class есть struct; есть typedef виртуальные методы могут быть абстрактными (=0) нет private/protected/public Ну и ещё есть #define Про реализацию: можно посмотреть как реализовано отражение в java или c# и добавить то, что есть в c++ и нет в этих языках. Добавлено через 4 минуты и 21 секунду и ещё extern/static - нужно отличать static метод и static переменную вне класса локальные переменные внутри функции namespace Добавлено через 9 минут для параметра: имеет значение по умолчанию временный флаг: предватрительное объявление operator template и соответственно параметр шаблона |
| Автор: mes 4.10.2011, 18:12 |
ее как раз нет |
| Автор: math64 4.10.2011, 18:30 |
ну это зависит от того что анализируется - если исхоник, то там #define ещё есть, если объекты в откомпилированной программе - то там уже нет. Добавлено через 9 минут и 28 секунд Кстати, я встречал отладчик который знал #define - для урезанного c без плюсов для не-помню-какого микропроцессора (не было указателей на функцию и запрещена рекурсия, const указатели указывают на ПЗУ, обычные на ОЗУ) Добавлено через 14 минут и 14 секунд Еще пропущено: битовые поля. В C++ они используются редко, в отличие от C, но в языке присутствуют |
| Автор: xvr 4.10.2011, 19:37 |
gdb умеет. В версии 7 точно (может и раньше) |
| Автор: boostcoder 4.10.2011, 20:09 | ||
это я намерено не вписывал все типы. там-то все понятно. точно. в с++ это одно и то же. а вот с ним я как раз и не могу понять куда его соотнести... и нужно ли оно на сомом деле. можно просто при обращении к узлу описывающему typedef, ссылаться на узел описывающий этот тип. да. упустил. единица трансляции обрабатывается после препроцессора. там уже нет #define`ов. это реализуется путем комбинации decl_type_::var_ & spec_type_::static_ кстати да. нужно посмотреть какую информацию о них я могу получить из AST. что-то раньше не задумывался... |