arity-parser 0.7.0

Lossless CST parser, typed AST wrappers, and incremental reparser for the R language
Documentation

arity-parser

The lossless CST parser, typed AST wrappers, and incremental reparser for the R language, extracted from arity.

This crate is the parsing engine behind the arity CLI and language server. It is published so that other tools can build on it, but its API surface is still early and may change between releases; it is versioned independently of the arity CLI.

use arity_parser::parser::{parse, reconstruct};

let text = "f <- function(x) x + 1\n";
let output = parse(text);
assert!(output.diagnostics.is_empty());
assert_eq!(reconstruct(text), text);

The parser preserves all source text (whitespace, comments, roxygen structure), so reconstructing any parse tree yields the input byte-for-byte.

Package NAMESPACE files use the same lossless CST through a typed surface that finds directives only where R permits them and never evaluates conditional expressions:

use arity_parser::namespace::{self, DirectiveKind};

let text = "export(foo)\nimportFrom(stats, predict)\n";
let output = namespace::parse(text);
assert!(output.diagnostics.is_empty());
assert_eq!(
    output
        .document()
        .directives()
        .map(|directive| directive.kind())
        .collect::<Vec<_>>(),
    [DirectiveKind::Export, DirectiveKind::ImportFrom]
);
assert_eq!(namespace::reconstruct(text), text);

Rd help files have an independent lossless grammar:

use arity_parser::rd;

let text = "\\title{An example}\n\\description{Use \\code{foo()}.}\n";
let output = rd::parse(text);
assert!(output.diagnostics.is_empty());
assert_eq!(output.document().macros().next().unwrap().name(), "title");
assert_eq!(rd::reconstruct(text), text);

The Rd parser models standard sections, nested markup, links, lists, tables, conditionals, and prose, R-like, and verbatim arguments. It preserves macro definitions and calls without expansion or evaluation. Unrecognized macro names remain in the tree without a diagnostic. Malformed syntax produces byte-ranged diagnostics and a recovered, lossless CST. Input is UTF-8; the initial API parses complete documents and does not provide incremental Rd reparsing.