Лексер & препроцессор
 

lex*.bas: Файловый ввод, разбиение на лексемы, макрорасширение буфера, маркер очереди, #include (включение содержимого).
pp*.bas: Парсинг директив препроцессора, текстовые конструкции макросов.

Лексер читает исходный код из .Bas файлов и переводит его в серию лексем, так FB парсер видит это.:

dim as integer i = 5
print i

как:

(Top-level parser retrieves the first token:)
DIM     keyword         (Go to variable declaration parser)
AS      keyword         (Go to datatype parser)
INTEGER keyword         (Data type)
"i"     symbol          (Back to variable declaration, variable identifier)
"="     operator        (Go to initializer parser)
"5"     number literal  (Expression)
EOL     statement end   (Variable declaration parser is done, 
	                         the variable is added to the AST, 
	                         back to toplevel parser)
(Next line, next statement)
PRINT   keyword         (Go to QB print quirk function call parser)
"i"     symbol          (Expression, lookup "i" symbol, it's an integer variable,
	                      create a CALL to fb_PrintInt(), the expression is the argument)
EOL                     (Print parser is done, back to toplevel)
EOF                     (Top-level parser is done)

Лексер - абстракция, скрывающая уродливые детали ввода данных пользователем (отступы, комментарии, написание прописными буквами ключевых слов, включения (#includes)) от парсера. Дополнительно делается предварительная обработка директив препроцессора и макросов. Парсер никогда не вызывает функции препроцессора, функции лексера делают это.

Маркеры (Tokens)
Макро-хранение и расширение
Парсинг директив препроцессора
Контексты файлов
Быстрый обзор вызовов графов