Это случай, который я бы обработал в проходе "разрешение типа"?

Я пишу компилятор для простого c-like языка. Я пытаюсь сделать анализ для следующего примера:

struct Foo {
    char* name;
};
struct Foo foo;
char* blah = foo.name;

В частности, этот анализ будет обрабатывать, если foo не решена, или если name не решен и т. д. Я подхожу к этому с помощью разрешения имен, т.е. foo существует, и name существует в foo, Тогда есть "разрешение типа", где я удостоверяюсь, что Foo структура существует.

Первый вопрос:

  • Правильно ли я понимаю, что проход разрешения типа будет проверять, существует ли структура "Foo"?

Я спрашиваю об этом, потому что у меня есть небольшая проблема с этим подходом. Поскольку разрешение имен выполняется до разрешения типов, мы не можем проверить foo.name потому что структура Foo еще не решен, поэтому мы ничего не знаем о типе, его полях, их типах и т. д.

Если это случай, который обрабатывается в разрешении типа:

  • Я делаю разрешение типов до или после разрешения имен?

Если я делаю разрешение имен до разрешения типов:

  • Как мне подойти к моей проблеме, где мне нужно знать о типе в разрешении имен?

1 ответ

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

Вам нужно будет создать две среды / таблицы (одну с типами и одну с именами).

так в char* blah = foo.nameвы бы foo в вашей таблице имен с типом Fooв вашей таблице типов, вы бы Foo как структура с полем name, Затем вы можете проверить, что ваш доступ к полю foo.name является действительным (что означает, что оба foo объявлен и foo имеет тип с .name как поле).

Другие вопросы по тегам