OSDev
http://osdev.su/

Как компиляторы Си хранят информацию о типах?
http://osdev.su/viewtopic.php?f=5&t=996
Страница 1 из 1

Автор:  Bizun [ 22 авг 2014, 16:59 ]
Заголовок сообщения:  Как компиляторы Си хранят информацию о типах?

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

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

Автор:  SII [ 22 авг 2014, 17:04 ]
Заголовок сообщения:  Re: Как компиляторы Си хранят информацию о типах?

Всё так или иначе сведётся к спискам -- иначе это просто невозможно сделать.

Автор:  Bizun [ 22 авг 2014, 17:17 ]
Заголовок сообщения:  Re: Как компиляторы Си хранят информацию о типах?

SII писал(а):
Всё так или иначе сведётся к спискам -- иначе это просто невозможно сделать.

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

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

Автор:  pavia [ 22 авг 2014, 18:40 ]
Заголовок сообщения:  Re: Как компиляторы Си хранят информацию о типах?

Списком не хранят так как вложенность не отработать. Хранят деревом.

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

Автор:  SII [ 22 авг 2014, 18:59 ]
Заголовок сообщения:  Re: Как компиляторы Си хранят информацию о типах?

Именно что списком. Дерево абсолютно не требуется, поскольку последовательность типов линейная, а не "ветвистая".

Автор:  Lincor [ 24 авг 2014, 13:58 ]
Заголовок сообщения:  Re: Как компиляторы Си хранят информацию о типах?

SII писал(а):
Именно что списком. Дерево абсолютно не требуется, поскольку последовательность типов линейная, а не "ветвистая".

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

Автор:  Himik [ 24 авг 2014, 19:13 ]
Заголовок сообщения:  Re: Как компиляторы Си хранят информацию о типах?

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

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

Автор:  rst256 [ 19 фев 2015, 03:19 ]
Заголовок сообщения:  Re: Как компиляторы Си хранят информацию о типах?

Bizun писал(а):
SII писал(а):
Всё так или иначе сведётся к спискам -- иначе это просто невозможно сделать.

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

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


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

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

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

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/