Я работаю над хобби-перенацеливаемым компилятором C в OCaml, и я создаю его снизу вверх. Пока у меня есть сокращенный аннотированный тип AST:
type 'e expr =
| Int of 'e * int
| Var of 'e * var
| Neg of 'e * 'e expr
| Add of 'e * 'e expr * 'e expr
| Sub of 'e * 'e expr * 'e expr
и тип трехадресного кода (снова сокращенный):
type node = Copy of location * location
| Unary of location * unary_op * location
| Binary of location * location * binary_op * location
and location = Temp of int | Int of int | Var of string
and unary_op = Neg
and binary_op = Add | Sub
У меня есть написанные функции, которые преобразуют AST в список узлов TAC, игнорируя аннотации. В связи с этим у меня два вопроса:
Что мне делать по-другому при преобразовании AST с аннотациями типа в список узлов TAC? Должен ли я также добавлять аннотации к узлам TAC? Это позволило бы мне позже преобразовать типы
int
/char
высокого уровня в типы более низкого уровня, такие какI16
/I8
.Как мне справиться с областью видимости? Что делать, если у меня есть два
Var
с одинаковым именем в разных областях?