компиляторы — выбор инструкций для объявлений типов в AST

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

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

Однако с этим новым языком я иногда получаю поддерево для объявления типа, например:

(IS TYPE (x) (INT))

который говорит, что x имеет тип INT.

Должен ли быть случай в моем генераторе кода, который имеет дело с этими объявлениями типов? Или это просто для проверки типов семантическим анализатором, поэтому я должен просто предположить, что типы были проверены, и проигнорировать эту часть дерева и просто присвоить значение для x?


person ddriver1    schedule 18.11.2011    source источник
comment
Это зависит. Изменяют ли поведение какие-либо выражения, включающие x, в зависимости от типа x? Можете ли вы сгенерировать лучший код, зная тип? и т. д.   -  person    schedule 18.11.2011


Ответы (2)


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

Являетесь ли вы «генератором кода» - программой, которая получает в качестве входного кода код на языке программирования (возможно, маленьком) и выводит код на другом языке программирования (возможно, маленьком)?

Этот инструмент обычно называют «переводчик».

Являетесь ли вы «генератором кода» - программой, которая получает в качестве входных данных язык программирования и выводит ассемблер/байт-код, как язык программирования?

Этот инструмент обычно называют «компилятором».

Примечание: «стопка» является синонимом «стопки».

Обычно A.S.T. хранит тип операции или вызова функции. Пример в с:

...
int a = 3;
int b = 5;
float c = (float)(a * b);
...

Последняя строка генерирует A.S.T. аналогично этому (пропустите A.S.T. для других строк):

..................................................................
..................................................................
......................+--------------+............................
......................|    [root]    |............................
......................| (no type) =  |............................
......................+------+-------+............................
.............................|....................................
.................+-----------+------------+.......................
.................|........................|.......................
...........+-----+-----+....+-------------+-------------+.........
...........| (int) c   |....| (float) (cast operation)  |.........
...........+-----------+....+-------------+-------------+.........
..........................................|.......................
....................................+-----+-----+.................
....................................| (int) ()  |.................
....................................+-----+-----+.................  
..........................................|.......................
....................................+-----+-----+.................
....................................| (int) *   |.................
....................................+-----+-----+.................
..........................................|.......................
..............................+-----------+-----------+...........
..............................|.......................|...........
........................+-----+-----+...........+-----+-----+.....
........................| (int)  a  |...........| (float) b |.....
........................+-----------+...........+-----------+.....
..................................................................
..................................................................

Обратите внимание, что "(float)" выглядит как оператор или функция, как и в вашем вопросе.

Удачи.

person umlcat    schedule 18.11.2011

Если это заявление

(IS TYPE (x) (INT))

то х надо разложить в памяти. В случае C и автоматических переменных локальные автоматические переменные размещаются в стеке. Чтобы выделить необходимый размер стека, вы должны знать размеры всех локальных переменных и размеры из типов.

Если эта переменная хранится в регистре, вы должны выбрать регистр нужного размера (вспомните x86 с: AL, AX, EAX, RAX - один и тот же регистр с разными размерами), если он есть у вашей цели.

Кроме того, тип необходим, когда в AST есть неоднозначная операция, которая может работать с данными разных размеров (например, char, short, int- или 8-бит, 16-бит, 32-бит и т. д.). А для некоторых ассемблеров размер данных закодирован в самой инструкции; поэтому codegen должен помнить размеры переменных.

Или, если тип операции не был записан в АСТ, ДОБАВИТЬ:

(ADD (x) (y))

может означать добавление как float, так и int (инструкции ADD или FADD), поэтому в codegen необходимы типы x и y для выбора правильного варианта.

person osgx    schedule 18.11.2011