Clause
← Toute la documentation

Traduit de l'original anglais · 06042fa · 2026-10-09 · Lire en anglais

Analyseur syntaxique

Analyse la grammaire complète d'OTP 29 à partir des jetons prétraités vers un AST possédé.

CLI

clau --parse-check -I include -DDEBUG module.erl prétraite et analyse, en écrivant les diagnostics sur stderr et rien sur stdout en cas de succès. Toutes les options de prétraitement s'appliquent. --print-pp et --print-ast affichent le source développé ou l'arbre issus de la même passe. Les options de chemin de sortie sont des erreurs d'utilisation dans les modes de vérification/affichage. Les entrées sont isolées ; tout échec conserve un code de sortie d'échec. -- permet les chemins commençant par -. Codes de sortie : 0 succès (avertissements permis), 1 échec de source/système de fichiers, 2 erreur d'utilisation.

Le texte de l'AST utilise des objets entre parenthèses, une indentation de deux espaces et des champs name=value :

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

L'afficheur est itératif ; au-delà de 64 niveaux, il plafonne l'indentation et ajoute des étiquettes [depth=N]. Le texte de l'AST sert uniquement à l'inspection ; il n'existe pas de lecteur.

API

En-tête clause/compiler/parser.hpp, cible 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);
}

Couverture de la grammaire : attributs et termes littéraux, records tuples/natifs, déclarations type/opaque/nominal, specs/callbacks, toutes les expressions, motifs, gardes, clauses, binaries, fun/try/maybe/receive, et comprehensions de liste/map/binary avec les générateurs stricts et les groupes zip d'OTP 29. Les annotations de test SSA sont exclues. Le succès syntaxique n'implique rien quant au lint, aux liaisons ou à la génération de code.

Récupération et limites

Les formes en échec annulent les arènes et les origines ; les formes suivantes restent disponibles mais l'échec est persistant. Les diagnostics portent une catégorie, des coordonnées logiques, une trace de macros/inclusions, l'ouvrant non apparié le plus proche et les terminaux Diagnostic::expected.

Valeurs par défaut : 1 000 000 jetons/forme, 4 000 000 jetons/module, 1 000 000 nœuds, 1 000 diagnostics (+1 message d'épuisement), imbrication 256 (plafond strict de l'API 512), 16 000 000 unités de travail. L'afficheur d'arbre est limité par défaut à 4 000 000 objets visités et lève std::length_error à l'épuisement. Ce sont des limites de comptabilité, pas des garanties de temps réel. L'épuisement des ressources arrête la session.

Preuves de compatibilité