Это случай, который я бы обработал в проходе "разрешение типа"?
Я пишу компилятор для простого 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
как поле).