Простой вопрос о таблице символов компилятора - PullRequest
4 голосов
/ 02 мая 2011

Я занимаюсь разработкой небольшого объектно-ориентированного языка программирования.

Я немного растерялся из-за простой вещи. Я реализовал пару посетителей, которые собирают имена, типы и параметры классов, заголовки методов и поля вне AST.

Моя проблема в том, что теперь делать с телом моих методов. Должен ли я добавить локальные переменные в таблицу символов?

Сначала это может показаться хорошей идеей, пока не придет в голову случай, такой как:

void myMethod() {
    int i;

    while (something) {
        int y;
    }

    while (something) {
        int y;
    }   
}

Если бы я просто добавил i и y переменные в таблицу символов, и я бы понял, что y является дублированной переменной.

Имейте в виду, я знаю о возможностях таблицы символов. Что я не могу понять, так это то, нужно ли добавлять и удалять информацию на лету в Таблице символов, когда он находится внутри метода, или мне нужно постоянно добавлять данные в Таблицу символов при посещении метода (как я делал с классом + fields + methodsheader).

Повторяю вопрос: при посещении тела метода я должен оставить Таблицу символов в конце посещения, так же, как это было до посещения?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

У вас есть AST, представляющий структуру программы.Некоторые узлы в AST представляют новые области (запись метода, тела блоков, ...).

Вы можете создать таблицу символов, которая будет иметь ту же форму, что и ваш AST: где бы вы ни находились, узел AST представляетвведение в область видимости, создайте связанную карту из символов в их объявления.

Вам придется искать области в порядке, определяемом вашей языковой семантикой, но, по крайней мере, вы будете знать, где искать каждую область.

1 голос
/ 03 мая 2011

Почему бы вам не смоделировать блоки программы, чтобы вы могли позволить блоку иметь таблицу символов. В этом сценарии y может существовать в двух разных блоках, так как два экземпляра будут помещены в две разные таблицы символов.

...