OSDev

для всех
Текущее время: 14 авг 2018, 18:53

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: 22 авг 2014, 16:59 

Зарегистрирован: 04 июл 2014, 11:32
Сообщения: 6
Я когда то писал простенький компилятор подмножества Си, очень близкий к SmallC. В нем у меня было все просто - тип мог быть либо char, либо int, либо указателем на эти типы/массиввом. Теперь же, мне нужно реализовать все так, как это реализовано в C89. Т.е. должны парсится такие выражения:
Код:
char *(*(**foo[][8])())[];

Не представляю как это реализовать. Пробовал смотреть исходники TCC, но понял, что это займет черезчур много времение, надеюсь здесь помогут быстрее.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 22 авг 2014, 17:04 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1346
Откуда: Зеленоград
Всё так или иначе сведётся к спискам -- иначе это просто невозможно сделать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 22 авг 2014, 17:17 

Зарегистрирован: 04 июл 2014, 11:32
Сообщения: 6
SII писал(а):
Всё так или иначе сведётся к спискам -- иначе это просто невозможно сделать.

Кажется, в TCC так и делали. Но ок, пусть список. Тогда как это будет выглядеть в списке:
Код:
char *(*(**foo[][8])())[];

Не представляю :(


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 22 авг 2014, 18:40 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1089
Списком не хранят так как вложенность не отработать. Хранят деревом.

TCC не знаю что такое. Лучше изучите http://llvm.org/releases/3.4.2/cfe-3.4.2.src.tar.gz
Достаточно простой код.
или gcc порт apple
http://www.opensource.apple.com/source/ ... gcc/expr.c


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 22 авг 2014, 18:59 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1346
Откуда: Зеленоград
Именно что списком. Дерево абсолютно не требуется, поскольку последовательность типов линейная, а не "ветвистая".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 авг 2014, 13:58 

Зарегистрирован: 24 ноя 2013, 15:59
Сообщения: 40
SII писал(а):
Именно что списком. Дерево абсолютно не требуется, поскольку последовательность типов линейная, а не "ветвистая".

для указателей на функции требуется. аргументы в одной ветке, тип возвращаемого значения - в другой.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 авг 2014, 19:13 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1065
Откуда: Балаково
Lincor писал(а):
для указателей на функции требуется. аргументы в одной ветке, тип возвращаемого значения - в другой.

Насколько я понимаю, у него и до этого были функции, принимающие и возвращающие разные типы. Тут проблема в усложнении самих типов, работа с которыми состоит из длинной цепочки действий, и её (цепочку действий) наверно можно представить списком.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 фев 2015, 03:19 

Зарегистрирован: 18 фев 2015, 12:59
Сообщения: 8
Bizun писал(а):
SII писал(а):
Всё так или иначе сведётся к спискам -- иначе это просто невозможно сделать.

Кажется, в TCC так и делали. Но ок, пусть список. Тогда как это будет выглядеть в списке:
Код:
char *(*(**foo[][8])())[];

Не представляю :(


Тсс так и делает, почему делал?
он же никуда не делся! Тсс и сейчас живее всех живых!

файл исходников tccgen.c - начни с функции parse_expr_type (строка ~ 3400 и ниже)
файл исходников tcc.h - декларации структур тут.

Исходники качать отсюда http://bellard.org/tcc/

Т.к. парсер тсс писался в ручную, его код зачастую проще для понимания чем творения того же antlr'a, рекомендую.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB