Clause
← Уся документація

Перекладено з англійського оригіналу · 06042fa · 2026-10-09 · Читати англійською

Парсер

Розбирає повну граматику OTP 29 з препроцесованих токенів у власне AST.

CLI

clau --parse-check -I include -DDEBUG module.erl виконує препроцесування і розбір, записуючи діагностику в stderr і нічого не виводячи в stdout у разі успіху. Застосовуються всі параметри препроцесування. --print-pp і --print-ast друкують розгорнутий вихідний код або дерево з того самого проходу. Параметри шляху виводу в режимах перевірки/друку є помилками використання. Вхідні файли ізольовані; будь-яка невдача зберігає ненульовий код виходу. -- дозволяє шляхи, що починаються з -. Коди виходу: 0 — успіх (попередження дозволені), 1 — помилка вихідного коду/файлової системи, 2 — помилка використання.

Текст AST використовує об'єкти в дужках, відступ у два пробіли і поля name=value:

(Function name=i arity=0 clauses=1
  clause[0]=(FunctionClause arguments=0 guard=none body=1
    body[0]=(IntegerLiteral value=42)
  )
)

Принтер ітеративний; після 64 рівнів він обмежує відступ і додає мітки [depth=N]. Текст AST призначений лише для перегляду; зчитувача для нього немає.

API

Заголовок clause/compiler/parser.hpp, ціль CMake clause_frontend:

clause::ParseResult load(const std::filesystem::path &path) {
    clause::SourceManager sources;
    clause::PreprocessorSession pp(sources.read(path));
    return clause::parse_module(pp);
}
auto result = load("module.erl"); // Sources and session are gone; AST owns its data.
for (const auto &id : result.module.forms()) {
    const auto &origin = result.module.anchor(result.module.form(id).source);
}

Покриття граматики: атрибути й буквальні терми, кортежні/native records, оголошення type/opaque/nominal, specs/callbacks, усі вирази, зразки, guard, клаузи, binary, fun/try/maybe/receive, а також comprehension для списків/map/ binary зі строгими генераторами OTP 29 і zip-групами. Анотації тестів SSA виключено. Синтаксичний успіх нічого не означає щодо lint, зв'язування чи генерації коду.

Відновлення та обмеження

Невдалі форми відкочують арени та джерела походження; пізніші форми лишаються доступними, але стан невдачі зберігається. Діагностика містить категорію, логічні координати, трасу макросів/включень, найближчу незакриту відкривну дужку і термінали Diagnostic::expected.

Значення за замовчуванням: 1 000 000 токенів на форму, 4 000 000 токенів на модуль, 1 000 000 вузлів, 1 000 діагностик (+1 повідомлення про вичерпання), вкладеність 256 (жорстка межа API — 512), 16 000 000 одиниць роботи. Принтер дерева за замовчуванням обмежений 4 000 000 відвіданих об'єктів і кидає std::length_error у разі вичерпання. Це межі обліку, а не гарантії за реальним часом. Вичерпання ресурсів зупиняє сесію.

Свідчення сумісності