fb.bas: Основной модуль для компилятора является
родительским модулем для parser/lexer/AST/IR/emitters, обработка файла
верхнего уровня или включаемого файла
parser*.bas: Функции Парсинга/компиляции: lexer tokens ->
AST узлы
symb*.bas: Таблицы символов и поиск, обработка
пространств имен / областей видимости.
rtl*.bas: Помощники при создании AST вызовов rtlib/gfxlib
функций.
Структура парсера имеет очень близкое отношение к
FreeBASIC
грамматике. Существует функция разбора для каждого элемента грамматики.
Парсер получает маркеры от лексера и проверяет входной исходный код.
Большинство сообщений об ошибках (помимо командной строки и ошибок доступа к
файлу) прибывает отсюда. Дополнительные функции парсера создают
соответствующий AST. Это - основа процесса компиляции.
Многие функции парсера (или скорее компилятора) (снабженные префиксом 'c')
анализируют и пропускают элемент грамматики, который они представляют или
показывают ошибку, если они не находят его. Парсер рекурсивный, главным
образом из-за выражений парсера и парсинга #include.
От парсинга до выпуска
При парсинге кода соответствующий AST создается, чтобы
представлять программу. AST используется, чтобы представлять исполняемый
код, но также и для того, чтобы содержать временные выражения, например
значения констант или инициализаторов описаний типа или описаний процедуры ,
найденных при парсинге . AST не содержит узлы для конструкций потока кода
как, IF, DO/LOOP, GOTO, RETURN, EXIT DO, и т.д., но содержит метки и
ответвления. Аналогично, несколько операций (как IIF (), ANDALSO, ORELSE,
разыменовывание полей, задействованный доступ) заменены соответствующим
набором операций низшего уровня в AST.
После парсинга, функции AST для этой функции оптимизированы, и затем
выпущены рекурсивно через запросы astLoad*() к каждому узлу от вершины вниз.
Обратите внимание на то, что у каждого узла AST есть своя собственная
реализация astLoad ().