Clause
← Toda la documentación

Traducido del original en inglés · 06042fa · 2026-10-09 · Leer en inglés

Analizador sintáctico

Analiza la gramática completa de OTP 29 a partir de tokens preprocesados y produce un AST propietario de sus datos.

CLI

clau --parse-check -I include -DDEBUG module.erl preprocesa y analiza, escribe los diagnósticos en stderr y nada en stdout en caso de éxito. Se aplican todas las opciones de preprocesado. --print-pp y --print-ast imprimen el código fuente expandido o el árbol de la misma pasada. Las opciones de ruta de salida son errores de uso en los modos de comprobación/impresión. Las entradas están aisladas; cualquier fallo mantiene un código de salida de fallo. -- permite rutas que empiezan por -. Códigos de salida: 0 éxito (se permiten advertencias), 1 fallo de código fuente/sistema de archivos, 2 error de uso.

El texto del AST usa objetos entre paréntesis, sangría de dos espacios y campos name=value:

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

El impresor es iterativo; a partir de 64 niveles limita la sangría y añade etiquetas [depth=N]. El texto del AST es solo para inspección; no hay lector.

API

Cabecera clause/compiler/parser.hpp, objetivo de 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);
}

Cobertura de la gramática: atributos y términos literales, records de tupla/nativos, declaraciones type/opaque/nominal, specs/callbacks, todas las expresiones, patrones, guards, cláusulas, binaries, fun/try/maybe/receive, y comprehensions de listas/maps/binaries con los generadores estrictos y los grupos zip de OTP 29. Se excluyen las anotaciones de prueba SSA. El éxito sintáctico no implica nada sobre lint, vínculos ni generación de código.

Recuperación y límites

Las formas fallidas revierten las arenas y los orígenes; las formas posteriores siguen disponibles, pero el fallo es persistente. Los diagnósticos incluyen la categoría, las coordenadas lógicas, la traza de macros/includes, el delimitador de apertura sin cerrar más cercano y los terminales de Diagnostic::expected.

Valores por defecto: 1.000.000 de tokens/forma, 4.000.000 de tokens/módulo, 1.000.000 de nodos, 1.000 diagnósticos (+1 mensaje de agotamiento), anidamiento 256 (techo absoluto de la API 512), 16.000.000 de unidades de trabajo. El impresor del árbol tiene por defecto 4.000.000 de objetos visitados y lanza std::length_error al agotarse. Son límites contables, no garantías de tiempo real. El agotamiento de recursos detiene la sesión.

Pruebas de compatibilidad