2016-12-06 1 views
1

Я пишу компилятор для простого c-подобного языка. Я пытаюсь сделать анализ на следующий пример:Это случай, который я бы обработал в «разрешении типа»?

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

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

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

  • Am Я получаю это право, что разрешение типа пропуск будет проверять, если структура «Foo» существует?

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

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

  • Должен ли я выполнять разрешение типа до или после разрешения имени?

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

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

ответ

1

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

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

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

Смежные вопросы