Препроцесор
Нативна реімплементація на C++ модуля OTP epp для зафіксованих джерел
maint-29. Boost.Parser обробляє правила символів; спільні метадані компілятора
надають пріоритети операторів. Розгорнуті токени ніколи не перетворюються назад
на текст вихідного коду.
PreprocessorSession повертає розгорнуті форми (включно з неявними атрибутами
-file), структуровану діагностику та незмінні знімки можливостей для кожної
форми; features() надає парсеру кінцевий стан сесії. Це внутрішній
інтерфейс, а не публічний формат етапу. DirectiveReader — старіший API, що
працює лише із синтаксисом.
Підтримувана поведінка
- Об'єктні макроси й макроси, перевантажені за арністю, сира підстановка, вкладені аргументи-блоки/funs, перетворення на рядок із канонічним написанням токенів OTP, повторне визначення, скасування визначення та діагностика циклів залежностей.
- Вкладені умови з пропущеними ефектами й помилками, діагностика кінця файлу (EOF).
-include/-include_lib, початки шляхів зі змінних середовища, захищена рекурсія.?MODULE,?BASE_MODULE(і форми_STRING),?FILE,?LINE,?FUNCTION_NAME/?FUNCTION_ARITY,?FEATURE_AVAILABLE/?FEATURE_ENABLED,?OTP_RELEASE(29) і?MACHINE('BEAM', лише для сумісності вихідного коду).- Обчислення guard у
-if/-elifз довільними цілими числами та каталогом guard BIF з OTP; довільні виклики не виконуються. - Можливості OTP 29.1:
maybe_expr(увімкнено за замовчуванням, керуєmaybe/else) іcompr_assign(експериментальна, вимкнена). Початковеallвибирає обидві;-feature(all, ...)у вихідному коді некоректне, як в epp. Інші назви є помилками.
Політики сумісності
- Пошук включень: каталог поточного файлу, робочий каталог, потім шляхи
включень у порядку API. CLI обертає порядок повторюваних
-I, щоб відповідатиerlc. Абсолютні шляхи обходять пошук.include_libпробує звичайні шляхи, потім явно задані каталоги застосунків, потім каталоги релізів<app>-<version>під кожним каталогом пошуку (версії — це цифри, розділені крапками, як їх читає сервер коду OTP; перемагає найвища). Кілька версій одного застосунку дають попередження один раз за запуск із зазначенням використаного каталогу; сервера коду немає. - Початки шляхів
$VARвикористовують впроваджений резолвер; невстановлені змінні залишаються буквальними. Операнди включень не розгортаються макросами. Файли декодуються як UTF-8 або оголошений Latin-1; правила шляхів хоста застосовуються незалежно від цільового процесора. - Включення мають спільний стан макросів/можливостей/модуля; кожен файл має власний стек умов і логічне відображення файлів.
- Умови перевіряють усі гілки перед скороченим обчисленням. Некоректний синтаксис є помилкою; незв'язані змінні, небулеві результати та винятки під час обчислення вибирають false. Доступ до поля/індексу record в умовах не вдається; невибраний за скороченим обчисленням доступ до record є коректним.
- Створення record в умові отримує контрольовану діагностику
(
record construction requires record expansion); epp з OTP 29.1 у цьому місці аварійно завершується. - Початкові значення
-D— це літеральні терми, нормалізовані до токенів, включно з binaries і зовнішніми funs, якіerl_parse:tokens/1не може представити. self()— стабільний синтетичний pid, аnode()дорівнюєnonode@nohost.- LF безпосередньо після завершальної крапки включення збільшує рядок
повернутого
-file; пробіл, коментар і CRLF слідують односимвольномуscan_dotз OTP.
Ліміти та діагностика
Значення за замовчуванням (налаштовуються через PreprocessorLimits): 256 рівнів
розгортання та 1 000 000 створених токенів на форму, глибина включень 64,
вкладеність виразів 256, а також фіксовані межі 4 194 240 бітів для цілих чисел
(ліміт OTP на 64-бітних хостах) і 1 000 000 бітів для значень bitstring.
Вичерпання є діагностикою ресурсів, а не мовчазною хибною умовою.
Діагностика містить стабільну категорію, рівень серйозності, фізичні діапазони, необов'язкові логічні координати та пов'язані діапазони макросів/включень. Попередження не спричиняють збою; помилки фіксують збій, а відновлення триває з межі наступної форми.
Тести
Еталони токенів (tests/fixtures/preprocessor/semantic/*.erl.tokens) записують
види токенів epp, декодовані значення (числа з плаваючою комою як біти binary64)
і порядок діагностики; формулювання не мусять збігатися з OTP. Включені
заголовки (semantic/headers/*.hrl) написано локально, а не скопійовано з OTP.
preprocessor_workflow покриває справжні дерева включень, порядок параметрів,
середовище, Latin-1 і випадки умов через CLI.
Clause