Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > enum+флаги+двоичные логические операции.


Автор: boostcoder 4.10.2011, 08:54
всем привет.

задача: разработать набор перечислений и функций для операций над ними, позволяющие описать декларации со всевозможными спецификаторами, к примеру:
1. переменные/переменные_члены.
2. функции/указатели_на_функции/ссылки_на_функции.
3. методы/указатели_на_методы/ссылки_на_методы.
4. конструкторы/деструкторы.
со всевозможными спецификаторами.

пока что накатал такое:
Код

#include <iostream>

// тут вообще перечисление всех сушествующих встроенных типов
// для структур/классов отдельный член - class_
// для перечислений - enum_
enum class type_ {
   void_, // переменная типа void не может быть объявлена, но может быть указатель на void/может быть возвращаемым типом/аргументом в старом стиле.
   char_,
   int_,
   double_,
   enum_,
   class_
};

enum class spec_type_ {
   normal_, // без каких-либо спецификаторов
   virtual_, // метод/деструктор
   static_, // переменная/переменная-член/функция/метод
   const_, // переменная/метод/(конструктор/дектруктор?)
   volatile_, // переменная/переменная-член/функция/метод/(конструктор/дектруктор?)
   ref_, // переменная/переменная-член/функция/метод/(конструктор/дектруктор?)
   cref_, // переменная/переменная-член/функция/метод/(конструктор/дектруктор?)
   ptr_, // переменная/переменная-член/функция/метод/(конструктор/дектруктор?)
   cptr_ // переменная/переменная-член/функция/метод/(конструктор/дектруктор?)
};

enum class decl_type_ {
   var_,
   member_var_,
   function_,
   member_function_,
   ctor_,
   dtor_
};

int main() {
}


http://liveworkspace.org/code/d8c1203b76eb97f49e5514b5d4206323

вопросы:
1. что я упустил?
2. возможно ли для описания декларации использовать 32ух битное значение? т.е. хватит ли его диапазона?
3. каким образом(исходя из чего) перечислениям присваивать начальные значения?
4. т.к. не секрет, что у меня проблемы с двоичной логикой, наверное нужно для начала поупражняться в этом?

спасибо.

Автор: mes 4.10.2011, 09:15
Цитата(boostcoder @  4.10.2011,  07:54 Найти цитируемый пост)
возможно ли для описания декларации использовать 32ух битное значение? т.е. хватит ли его диапазона?

32 бита хватит ровно на 32 флага вариаций smile 


Цитата(boostcoder @  4.10.2011,  07:54 Найти цитируемый пост)
 каким образом(исходя из чего) перечислениям присваивать начальные значения?

если перечеслиния нужны как флаги, то каждое следующее значение должно быть сдвинуто влево(<<)
Код

flag_1  = 1 << 0,
flag_2  = 1 << 1,
flag_3  = 1 << 2,
flag_4  = 1 << 3,
...


Цитата(boostcoder @  4.10.2011,  07:54 Найти цитируемый пост)
наверное нужно для начала поупражняться в этом?

а иначе  как будете код писать то ?


Автор: newbee 4.10.2011, 09:20
Цитата(boostcoder @  4.10.2011,  09:54 Найти цитируемый пост)
1. что я упустил?
short, inline. Ссылку на указатель на указатель на инт как описывать будешь?

Цитата(boostcoder @  4.10.2011,  09:54 Найти цитируемый пост)
2. возможно ли для описания декларации использовать 32ух битное значение? т.е. хватит ли его диапазона?
Судя по всему сложные комбинированные типы (вроде того, что я описала выше) нужно описывать какой-то цепочкой, значит в общем случае 32бит не хватит. Для описания всех возможных состояний сущности должно хватить с запасом.

Цитата(boostcoder @  4.10.2011,  09:54 Найти цитируемый пост)
3. каким образом(исходя из чего) перечислениям присваивать начальные значения?
Если несколько состояний могут быть применены к одной сущности (например static и inline), их значениями должны быть разные степени двойки: 1, 2, 4,..1<<31. Ты можешь комбинировать: например первые N бит - описатель сущности (переменная, функция, что там еще), остальное - битовое поле возможных состояний конкретно этой сущности.

Цитата(boostcoder @  4.10.2011,  09:54 Найти цитируемый пост)
4. т.к. не секрет, что у меня проблемы с двоичной логикой, наверное нужно для начала поупражняться в этом?
Наверное да. Если проблемы в элементарной (двоичной) логике, как можно быть уверенным в здравости всей остальной логики? smile

Автор: boostcoder 4.10.2011, 09:22
далее, все перечисления нужно свести в структуру.
для функций, правило такое:
Код

// void       function_name (args_types);
// ^          ^             ^
// ret_type   spec_type     array of decl_type+spec_type+type

т.е. по идее, нужно описывать еще и возвращаемый тип. или просто добавить в decl_type_ член типа ret_type? что скажите?
что-то мне подсказывает, что для этой задачи подходит AST smile вот только не нужно предлагать выдрать нужный кусок кода из GCC, например smile 
итак - что, и в каком виде должен описывать узел AST? нужно подумать...

Добавлено @ 09:26
Цитата(mes @  4.10.2011,  09:15 Найти цитируемый пост)
32 бита хватит ровно на 32 флага вариаций

логично.

Цитата(mes @  4.10.2011,  09:15 Найти цитируемый пост)
если перечеслиния нужны как флаги, то каждое следующее значение должно быть сдвинуто влево(<<)

понял.

Цитата(newbee @  4.10.2011,  09:20 Найти цитируемый пост)
short, inline.

угу.

Цитата(newbee @  4.10.2011,  09:20 Найти цитируемый пост)
Ссылку на указатель на указатель на инт как описывать будешь?

нужно подумать.

Цитата(newbee @  4.10.2011,  09:20 Найти цитируемый пост)
общем случае 32бит не хватит

ладно. есть int64 и double. не проблема.

Цитата(newbee @  4.10.2011,  09:20 Найти цитируемый пост)
Если несколько состояний могут быть применены к одной сущности (например static и inline), их значениями должны быть разные степени двойки: 1, 2, 4,..1<<31. Ты можешь комбинировать: например первые N бит - описатель сущности (переменная, функция, что там еще), остальное - битовое поле возможных состояний конкретно этой сущности.

вроде понял.

Цитата(newbee @  4.10.2011,  09:20 Найти цитируемый пост)
Если проблемы в элементарной (двоичной) логике, как можно быть уверенным в здравости всей остальной логики?

не утрируй ;)

Up.

Автор: mes 4.10.2011, 09:55
Цитата(boostcoder @  4.10.2011,  08:22 Найти цитируемый пост)
ладно. есть int64 и double. не проблема.

есть еще char [N], куда можно сложить еще больше.. только вот подойдет ли плоский набор флагов, или все ж нужно дерево.. 

Автор: boostcoder 4.10.2011, 10:02
Цитата(mes @  4.10.2011,  09:55 Найти цитируемый пост)
вот подойдет ли плоский набор флагов, или все ж нужно дерево..

у меня недостаточно понимания чтоб решить это... вот, думаю.

Автор: newbee 4.10.2011, 10:26
Цитата(boostcoder @  4.10.2011,  11:02 Найти цитируемый пост)
у меня недостаточно понимания чтоб решить это... вот, думаю. 
Если ты собираешься хранить структуру программы, естественно нужен AST. Если только описать все имеющиеся сущности... Зависит от того, насколько подробно ты собираешься это описывать. Например потроха класса: вложенный класс должен знать, что он вложенный? И даже в этом случае явное дерево не обязательно, тебе достаточно у каждой сущности сохранять идентификатор ее родителя: неймспейс, класс, функция.

Автор: boostcoder 4.10.2011, 11:18
Цитата(newbee @  4.10.2011,  10:26 Найти цитируемый пост)
вложенный класс должен знать, что он вложенный?

нет. так же как и не нужно знать предков/наследников.

Автор: mes 4.10.2011, 11:57
Цитата(boostcoder @  4.10.2011,  09:02 Найти цитируемый пост)
у меня недостаточно понимания чтоб решить это... вот, думаю. 


Цитата(boostcoder @  4.10.2011,  08:22 Найти цитируемый пост)
далее, все перечисления нужно свести в структуру.
для функций, правило такое:

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

Добавлено через 2 минуты и 27 секунд
Цитата(newbee @  4.10.2011,  09:26 Найти цитируемый пост)
? И даже в этом случае явное дерево не обязательно,

имелось ввиду не классическое древо-список, а иерархический набор значений.. 

Автор: boostcoder 4.10.2011, 12:03
Цитата(mes @  4.10.2011,  11:57 Найти цитируемый пост)
ну так вначале напишите несколько правил для каждого из вариантов разбора, а после будет видно  структуру какого типа это лучше всего  помещать.

этим и занимаюсь.

Добавлено через 2 минуты и 40 секунд
а кто-то может ответить на вопросы типа "(конструктор/дектруктор?)" в коде топика? чтоб не пришлось правила потом еще раз переписывать smile

Автор: xvr 4.10.2011, 12:49
Возьмите описание AST из g++ и посмотрите во что он ляжет в вашем описании. Сразу станет видно, чего не хватает.

Автор: boostcoder 4.10.2011, 13:03
Цитата(xvr @  4.10.2011,  12:49 Найти цитируемый пост)
Возьмите описание AST из g++

ведь просил же -
Цитата(boostcoder @  4.10.2011,  09:22 Найти цитируемый пост)
вот только не нужно предлагать выдрать нужный кусок кода из GCC, например

на практике это выполнить не реально. по крайней мере моему моцгу smile 

Автор: xvr 4.10.2011, 13:17
Цитата(boostcoder @  4.10.2011,  13:03 Найти цитируемый пост)
ведь просил же -

А я не предлагаю 'выдрать кусок'. Я предлагаю использовать g++ AST в качестве источника информации о том, что именно должно содержаться в С++ AST. Вам в любом случае придется все, что там есть, реализовывать (пусть и по своему)

Цитата(boostcoder @  4.10.2011,  13:03 Найти цитируемый пост)
на практике это выполнить не реально.

Найдите там просто описание самого 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,  17:00 Найти цитируемый пост)
Ну и ещё есть #define

ее как раз нет smile 

Автор: math64 4.10.2011, 18:30
Цитата(mes @ 4.10.2011,  18:12)
Цитата(math64 @  4.10.2011,  17:00 Найти цитируемый пост)
Ну и ещё есть #define

ее как раз нет smile

ну это зависит от того что анализируется - если исхоник, то там #define ещё есть, если объекты в откомпилированной программе - то там уже нет.

Добавлено через 9 минут и 28 секунд
Кстати, я встречал отладчик который знал #define - для урезанного c без плюсов для не-помню-какого микропроцессора (не было указателей на функцию и запрещена рекурсия, const указатели указывают на ПЗУ, обычные на ОЗУ)

Добавлено через 14 минут и 14 секунд
Еще пропущено: битовые поля. В C++ они используются редко, в отличие от C, но в языке присутствуют

Автор: xvr 4.10.2011, 19:37
Цитата(math64 @  4.10.2011,  18:30 Найти цитируемый пост)
Кстати, я встречал отладчик который знал #define

gdb умеет. В версии 7 точно (может и раньше)

Автор: boostcoder 4.10.2011, 20:09
Цитата(math64 @  4.10.2011,  18:00 Найти цитируемый пост)
не хватает ещё signed/unsigned. short упомянули, но есть ещё long и int64(long long); нет float
нет bool

это я намерено не вписывал все типы. там-то все понятно.

Цитата(math64 @  4.10.2011,  18:00 Найти цитируемый пост)
кроме ссылок и указателей есть ещё массивы

точно.

Цитата(math64 @  4.10.2011,  18:00 Найти цитируемый пост)
кроме class есть struct;

в с++ это одно и то же.

Цитата(math64 @  4.10.2011,  18:00 Найти цитируемый пост)
есть typedef

а вот с  ним я как раз и не могу понять куда его соотнести... и нужно ли оно на сомом деле. можно просто при обращении к узлу описывающему typedef, ссылаться на узел описывающий этот тип.

Цитата(math64 @  4.10.2011,  18:00 Найти цитируемый пост)
виртуальные методы могут быть абстрактными (=0)

да. упустил.

Цитата(math64 @  4.10.2011,  18:00 Найти цитируемый пост)
Ну и ещё есть #define

единица трансляции обрабатывается после препроцессора. там уже нет #define`ов.

Цитата(math64 @  4.10.2011,  18:00 Найти цитируемый пост)
нужно отличать static метод и static переменную вне класса

это реализуется путем комбинации decl_type_::var_ & spec_type_::static_

Цитата(math64 @  4.10.2011,  18:30 Найти цитируемый пост)
битовые поля

кстати да. нужно посмотреть какую информацию о них я могу получить из AST. что-то раньше не задумывался...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)