Препроцесор
Нативна реімплементація OTP epp мовою C++ для зафіксованого вихідного коду
maint-29. Boost.Parser обробляє правила символів; спільні метадані компілятора
задають пріоритет операторів. Розгорнуті токени ніколи не перетворюються назад
на вихідний текст.
PreprocessorSession повертає розгорнуті форми (зокрема неявні атрибути
-file), структуровану діагностику та незмінні знімки можливостей для кожної
форми; features() надає парсеру остаточний стан сесії. Це внутрішній
інтерфейс, а не публічний формат етапу. DirectiveReader — старіший API лише
для синтаксису.
Підтримувана поведінка
- Об'єктні макроси та макроси, перевантажені за арністю, сира підстановка, вкладені аргументи-блоки/fun, перетворення на рядок із канонічним написанням токенів 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пробує звичайні шляхи, потім явно задані каталоги застосунків; без сервера коду і без вгадування версій. - Початки шляхів
$VARвикористовують впроваджений розв'язувач; незадані змінні лишаються буквальними. Операнди включень не розгортаються як макроси. Файли декодуються як UTF-8 або оголошений Latin-1; правила шляхів хоста застосовуються незалежно від цільового процесора. - Включення спільно використовують стан макросів/можливостей/модуля; кожен файл має власний стек умов і логічне відображення файлів.
- Умови перевіряють усі гілки до обчислення за короткою схемою. Недійсний синтаксис є помилкою; незв'язані змінні, небулеві результати та винятки під час обчислення дають false. Доступ до поля/індексу record в умовах завершується помилкою; невибраний доступ до record за короткою схемою допустимий.
- Конструювання record в умові отримує контрольовану діагностику
(
record construction requires record expansion); epp з OTP 29.1 у цьому місці аварійно завершується. - Початкові значення
-D— це буквальні терми, нормалізовані до токенів, зокрема binary і зовнішні fun, які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.
Вичерпання — це діагностика ресурсів, а не мовчазна хибна умова.
Діагностика містить стабільну категорію, рівень серйозності, фізичні діапазони, необов'язкові логічні координати та пов'язані діапазони макросів/включень. Попередження не спричиняють невдачі; помилки фіксують стан невдачі, а відновлення продовжується з межі наступної форми.
Тести
Еталонні файли токенів (semantic/*.erl.tokens) фіксують типи токенів epp,
декодовані значення (числа з рухомою комою як біти binary64) і порядок
діагностики; формулювання не мусять збігатися з OTP. Локальні фрагменти
semantic/headers/*.hrl замінюють колись скопійовані заголовки OTP.
preprocessor_workflow охоплює через CLI справжні дерева включень, порядок
параметрів, середовище, Latin-1 і випадки умов.
Clause