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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> enum+флаги+двоичные логические операции. 
:(
    Опции темы
boostcoder
Дата 4.10.2011, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



всем привет.

задача: разработать набор перечислений и функций для операций над ними, позволяющие описать декларации со всевозможными спецификаторами, к примеру:
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/d8c1203b76eb...e5514b5d4206323

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

спасибо.

PM WWW   Вверх
mes
Дата 4.10.2011, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(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 Найти цитируемый пост)
наверное нужно для начала поупражняться в этом?

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




--------------------
PM MAIL WWW   Вверх
newbee
Дата 4.10.2011, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(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


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 4.10.2011, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



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

// 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.

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


любитель
****


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

Репутация: 144
Всего: 250



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

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


Это сообщение отредактировал(а) mes - 4.10.2011, 09:56


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


pattern`щик
****


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

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



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

у меня недостаточно понимания чтоб решить это... вот, думаю.
PM WWW   Вверх
newbee
Дата 4.10.2011, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



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

Это сообщение отредактировал(а) newbee - 4.10.2011, 10:35


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 4.10.2011, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



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

нет. так же как и не нужно знать предков/наследников.
PM WWW   Вверх
mes
Дата 4.10.2011, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



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


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

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

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

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


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


pattern`щик
****


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

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



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

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

Добавлено через 2 минуты и 40 секунд
а кто-то может ответить на вопросы типа "(конструктор/дектруктор?)" в коде топика? чтоб не пришлось правила потом еще раз переписывать smile
PM WWW   Вверх
xvr
Дата 4.10.2011, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

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


pattern`щик
****


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

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



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

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

на практике это выполнить не реально. по крайней мере моему моцгу smile 
PM WWW   Вверх
xvr
Дата 4.10.2011, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

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

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

Найдите там просто описание самого AST (структуры + enum'ы). Этого должно хватить

PM MAIL   Вверх
math64
Дата 4.10.2011, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 8
Всего: 72



Модификаторы к основаному типу:
не хватает ещё 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 и соответственно параметр шаблона

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


любитель
****


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

Репутация: 144
Всего: 250



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

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


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1619 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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