Многоходовой анализ Flex / Bison - PullRequest
0 голосов
/ 14 апреля 2011

Я пишу компилятор для игрушечного ОО языка.Я пишу это на C, используя Flex и Bison.

Рассмотрим следующий синтаксис:

class MyClass {
    int m_n;

    void MyFunc(int b) {
        m_n = 5;
        m_p = b;
    }   

    int m_p;
}

Мой текущий код будет жаловаться, что в MyFunc m_p еще не объявленпричина).Итак, я пришел к выводу, что мне нужен метод многоходового анализа - что-то вроде:

1-й проход - объявления переменных процесса

2-й проход - определения функций процесса

Первый - это лучший способ решить проблему?Есть ли другие методы, которые я должен изучить?Во-вторых, если это выгодное решение, буду ли я реализовывать его с помощью входящего лексера / парсера?

Спасибо

1 Ответ

2 голосов
/ 14 апреля 2011

Я недавно написал компилятор для языка ОО, у нас было несколько проходов (в зависимости от сложности языка, конечно):

  1. Собрать все классы
  2. Создать суперклассИерархия
  3. Сбор всех методов и полей
  4. Сбор переменных внутри методов и т. д.

Есть причины, по которым нам пришлось разделить весь процесс на 4 этапа:

  1. Невозможно построить иерархию суперкласса, когда еще не все классы обработаны (привело к 2. pass)
  2. Невозможно проверить унаследованные методы (возвращаемое значение, параметрыи т. д.), когда суперкласс неизвестен (привело к 2. pass)
  3. Вы не можете обрабатывать переменные, когда еще не все поля были собраны (привело к 4. pass)

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

Когда я смотрю на него сейчас, должна была быть возможность объединить проходы 2 и 3, так как все данные должны быть доступны для прохода 3.

Способ, которым мы реализовали это, был просто ходитьчерез AST и аннотируя его необходимыми таблицами символов.

...