Как поддержать операторы импорта? - PullRequest
0 голосов
/ 03 марта 2012

Я разрабатываю компилятор вручную (не спрашивайте).

Исходный файл для этого нового языка может импортировать класс T в пакете P, который он хочет использовать с

import P.T;

, или он может использовать доступ по запросу ко всем классам впакет P с использованием оператора

import P.*;

Идентификатор, появляющийся в объявлении ClassType (т.е. идентификатор MyClass в объявлении MyClass x = ...), разрешается по следующим правилам:

  1. это может быть класс, объявленный в текущем пакете
  2. это может быть явно импортированный класс
  3. это может быть неявно импортированный класс (импорт по требованию)

Я не знаю, как настоящие компиляторы справляются с этой ситуацией.Я ищу способ реализовать идентификацию для ClassTypes в программах miniJava с помощью операторов импорта.

1 Ответ

1 голос
/ 03 марта 2012

Отслеживание всех трех типов (локальный, явный импорт, * импорт) в отдельных структурах данных (добавление записей при появлении объявлений и импортов в программе), а также при необходимости поиска идентификатора типа проверьте каждая из этих структур данных.

Если у вас есть порядок приоритетов (например, локальные объявления shadow (hide) импортированных классов), тогда просто отметьте три в этом порядке и остановитесь, как только вы найдете что-то (скорее как цепочка лексических областей видимости). Если иметь неоднозначные имена - ошибка, проверьте все три и сохраните список всего, что вы нашли; если после этого в списке содержится не один, а другой элемент, сообщите об ошибке (и перечислите найденные элементы в сообщении об ошибке).

В случае импорта * неясно, предоставляет ли какой-либо данный import ....* заданное имя класса. Для этого просто попробуйте каждый из них по очереди как подслучае (учитывая import P.* поиск MyClass, форма P.MyClass и проверка, существует ли он). В этом случае особенно важно проверить все операции импорта *, чтобы не выбирать один вариант с неоднозначным именем.

...