Многопроходный анализ классов Flex/Bison

Пишу компилятор для игрушечного ОО-языка. Я пишу это на 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-й проход - определение функции обработки

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

Спасибо


person Jason    schedule 13.04.2011    source источник


Ответы (1)


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

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

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

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

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

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

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

person halfdan    schedule 13.04.2011
comment
Вы можете ознакомиться с проектом: svn. c0demonkey.com/ (переходы выполняются в semant.c - хотя довольно сложный код :) - person halfdan; 14.04.2011