Мы создали систему типов - теперь необходимо организовать механизм вызовов функций.
Продумайте механизм Frame-а для функций:
- Набор переменных на стеке - могут лежать либо примитивные типы, либо указатели на экземпляры классов.
- Набор параметров
- Возвращаемое значение (завести указатель на ячейку)
- Указатель на участок памяти, где нужно будет вызвать ret инструкцию
Напомню, что методы являются публичными, а поля приватными.
Для вызова кода необходимо найти функцию main
и вызвать ее.
В итоге, мы получим работающий интерпретатор (если в нем нет ошибок компиляции)
Продумайте логику Frame-а:
- реализуйте класс InterpreterFrame, который хранит физически значения переменных
- реализуйте класс TranslatorFrame, который позволит хранить сдвиги относительно frame pointer
Примеры этих классов можно найти здесь: https://github.com/akhtyamovpavel/CompilersCourse/tree/master/07-irtree-build/function-mechanisms
Мы создали интепретатор! Теперь надо указывать участок в коде, где находятся ошибки компиляции + находить более одной ошибки компиляции.
Необходимо из каждого из построенных visitor-ов выделить как можно больше ошибок компиляции.
Для этого используйте ссылку на yy::location
, который хранится у нас в AST еще с первого чекпоинта.