LINUX.ORG.RU

Как компиляторы Си хранят информацию о типах?

 ,


0

4

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

char *(*(**foo[][8])())[]; 
Не представляю как это реализовать. Пробовал смотреть исходники TCC, но понял, что это займет черезчур много времени, надеюсь здесь помогут быстрее.

Deleted

Я так и не понял, ты не можешь это распарсить? Тогда так и спаршивай - нужна инфа по парсерам. А хранить ты можешь как хочешь - базовых типов всего ничего

anonymous
()

Ну у тебя раньше был дескриптором типа int type=T_CHAR из enum { T_INT, T_CHAR, T_INTP, ... } наверное, а теперь будет полноценная структура, например struct PtrType, в которой член itemType указывает на struct IntType с subtype=T_CHAR, или что там еще, что дальше по дереференсу должно бы быть. Также сделаешь для массивов, функций.

Парсер все должен сложить в естественном порядке рулесов, на выходе сразу такая лапша будет.

arturpub ★★
()

Offtop:
Ты вообще чем-то полезным занимаешься или ты только мечешься из области в область, охреневаешь от проблем и бегаешь на ЛОР?
Слишком уж у тебя разнородные вопросы...

Stahl ★★☆
()

Задавай конкретные вопросы, подкрепленные фрагментами кода tcc.

tailgunner ★★★★★
()
Ответ на: комментарий от Stahl

Ты упорот что ли? Мне обидно вообще то. Я с 16 лет увлекаюсь компиляторами (писал компилятор подмножества си, несколько ассемблеров, ВМ, эмулятор CHIP-8 (глюкавый)), вот этим (собрать железку пока не смог, в logisime простенький проц делал). Короче, лоу-левел, самодельные компьютеры, ретро-компьютеры.

Ты вообще чем-то полезным занимаешься или ты только мечешься из области в область, охреневаешь от проблем и бегаешь на ЛОР?

Ну и где я мечусь из области в область?

Deleted
()
Ответ на: комментарий от Deleted

Я с 16 лет увлекаюсь компиляторами

И до сих пор не прочитал ни одного приличного учебника? Ты реально безнадежен.

Я сюда, бл@ть, пришел, чтобы не копаться в tcc.

Ступай себе мимо.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от Deleted

Малолетнему дурачку АБИДНА! Ещё и материться пытается, но СТРАШНА, бггг.

anonymous
()

Прописываю пациенту книгу дракона.

Есть подозрение, что ты не знаком с понятиями лексер, парсер, abstract syntax tree. Советую хотя бы почитать на вики: Lexical analysis, Parsing, Abstract syntax tree. Есть целая категория: Compiler construction. Всяко полезней чем на ЛОРе тему за темой создавать.

mtk
()
Ответ на: комментарий от Deleted

Ок, задам вопрос по другому:
Хоть один полученный тут ответ принёс тебе пользу?
То ты запросы экьюэличаешь, то питон пинаешь, то компиляторы ... пишешь.

Я с 16 лет

Да, конечно. И даже не важно что тебе сейчас 19.

Ладно, забей. Не хотел обидеть. Мне пофиг на самом деле.

Stahl ★★☆
()

Еще есть замечательный проект: lcc, A Retargetable Compiler for ANSI C. Авторы с нуля создали рабочий компилятор и описали процесс создания в книге. Книга, кстати, раритетная, нашел pdf на китайских варезо-обменниках.

mtk
()
Ответ на: комментарий от Stahl

Хоть один полученный тут ответ принёс тебе пользу?

Нет. Пока нет.

То ты запросы экьюэличаешь, то питон пинаешь, то компиляторы ... пишешь.

Питоны писать и запросы эскьюэлить надо. Остальное - для души, так сказать.

Да, конечно. И даже не важно что тебе сейчас 19

И? Что это значит? То, что я три года прусь по одной и той же вещи?

Deleted
()
Ответ на: комментарий от mtk

Прописываю пациенту книгу дракона.

Ты ее прочел? Компилятор написал?

Есть подозрение, что ты не знаком с понятиями лексер, парсер, abstract syntax tree
писал компилятор подмножества си

Как я его писал, по твоему?

Всяко полезней чем на ЛОРе тему за темой создавать.

Ну здесь ты прав.

Deleted
()
Ответ на: комментарий от Deleted

Книгу дракона прочитал, lcc не осилил.

Как я его писал, по твоему?

Судя по этому:

Не представляю как это реализовать

ты свой компилятор делал через не сильно умный парсер, разпознающий все нетривиальные конструкции через костыли и подпорки. В реальных компиляторах всегда строится abstract syntax tree.

mtk
()
Ответ на: комментарий от mtk

ты свой компилятор делал через не сильно умный парсер, разпознающий все нетривиальные конструкции через костыли и подпорки. В реальных компиляторах всегда строится abstract syntax tree.

Я собираюсь его запускать на 64кб памяти. Ты уместишь туда AST? Нет.

Deleted
()
Ответ на: комментарий от true_admin

Ух ты, годно, спасибо. Но тред таки не об этом. Правила парсинга тут не причем, я их могу представить. Мне просто было интересно, как хранится распарсенная инфа.

Deleted
()
Ответ на: комментарий от Deleted

Тогда пиши Форт и не выеживайся.

anonymous
()
Ответ на: комментарий от Deleted

Чем AST типа отличается от любого другого AST?

anonymous
()
Ответ на: комментарий от Deleted

Я собираюсь его запускать на 64кб памяти

ЗАЧЕМ ограничивать компилятор в памяти? Ты определенно не в ту сторону смотришь. В учебных целях намного полезней взять какой-нибудь bison и самому написать грамматику для C (подмножества, определенного стандартом MISRA, всю задолбаешся писать). ПОСЛЕ этого писать свой собственный парсер и т.д. Ограничения и оптимизации - последнее дело.

mtk
()

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

Молодец! Делай так всегда и по любым вопросам!

anonymous
()
Ответ на: комментарий от Deleted

Очевидно, что Си-подобный тип — это древовидная иерархия. «Массив (указателей на функцию, возвращающую (указатель на (char) и принимающую (что-то там)))».

(Вероятно, я распарсил твой пример неправильно.)

Соответственно, и хранить её надо как дерево — узлы как структурки, а в них указатели на структурки дочерних узлов.

intelfx ★★★★★
()
Ответ на: комментарий от mtk

В учебных целях намного полезней взять какой-нибудь bison и самому написать грамматику

В учебных целях лучше врукопашную написать рекурсивный спуск, например. Генераторы парсеров - для случаев, когда нет времени или смысла заморачиваться на ручной парсер.

tailgunner ★★★★★
()
Ответ на: комментарий от Deleted

Зачем тебе тогда си-подобный язык? Пиши Форт.

anonymous
()
Ответ на: комментарий от Deleted

Ну можнл и так назвать. В случае функций и структур-унионов скорее дерево, там результат и аргументы как субитемы будут. Не знаю что у тебя за парсер, в як/бизоне ты бы просто в рулесах создавал эти куски из уже собранных подвыражений и так получилась бы топ-структура. А для семантики ходил бы по ней параллельно с дереференсами и прочим. Если хочешь компактности, то можно побитоепствовать на предмет свертки дерева в один чанк, но что-то мне вообще слабо верится в возможность compiler.com. В досе даже tasm/masm были exe, iykwim, а на 64к я видел только трансляторы, да и то которым с кассеты надо было подгружать нужные куски на разных этапах.

arturpub ★★
()
Ответ на: комментарий от arturpub

Какой в говно бизон? Какие сраные драконы? При таком ограничении на память табличные парсеры идут лесом. Только рекурсивный спуск (включая того же Пратта).

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

anonymous
()
Ответ на: комментарий от anonymous

Я специально для таких как ты втыкаю «бы» через каждые три слова и все равно бестолку. Всем ясно, что итт парсер хандкрафтед.

arturpub ★★
()
Ответ на: комментарий от Deleted

и тебе не кажется, что это стоило бы упомянуть в исходном посте?

jtootf ★★★★★
()
Ответ на: комментарий от Deleted

помогите разбить строку по точкам и запятым! примечание:с детства увлекаюсь конпеляторами. смотрел код полноценного - не осилил. буду писать свой.

если ты не понял, это краткая сводка твоих тредов.

anonymous
()
Ответ на: комментарий от Deleted

как хранится распарсенная инфа.

У каждого элемента (объекта) AST есть поле type. В нём и хранится.

Например:

class Type:
 ...
class Int(Type):
 ...

class Var:
  name = "blah"
  type = Int

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

true_admin ★★★★★
()
Ответ на: комментарий от mkam

Выложи на файлообменник пожалуйста.

Вот найденная мною когда-то pdf:

A Retargetable C Compiler - Design and Implementation - David R. Hanson & Christopher W. Fraser.pdf, 18M.

Вот ссылка на amazon. Еще, кажется, можно отсюда скачать.

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

mtk
()
Ответ на: комментарий от menangen

Тебе нужно взять llvm

Как я понял, ТС'у нужно для саморазвития. llvm научит только умодробительному C++. Хотя в качестве основы взять можно (выдернуть с llvm/clang препроцессор, лексер, парсер, ассемблер и самому все свести вместе - «кококо я написал компилятор»).

mtk
()
Последнее исправление: mtk (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.