Skip to content

AI Assistant Quickstart

Use this page as a compact orientation. For full details, follow the linked documentation pages.

  • CCL = Categorical Configuration Language
  • Not YAML or JSON: CCL uses recursive fixed-point parsing
  • All identifiers use snake_case (never hyphens)
  • Core requirement: parse + build_hierarchy functions only
  • Everything else is optional library convenience

Use these exact terms when discussing CCL:

CategoryTerms
Core Functionsparse, build_hierarchy
Typed Accessget_string, get_int, get_bool, get_float, get_list
Processingfilter, compose
Formattingprint, canonical_format
Featurescomments, empty_keys, multiline, unicode, whitespace
Experimentalexperimental_dotted_keys (not standard)

Behaviors are not inherently mutually exclusive. Tests use a conflicts field to specify incompatible combinations.

Behavior GroupOptionsDescription
Continuation Baselinetoplevel_indent_strip vs toplevel_indent_preserveTop-level N=0 (reference) vs N=first key’s indent (simpler)
Line Endingscrlf_preserve_literal vs crlf_normalize_to_lfCRLF handling: preserve \r chars vs normalize to LF
Boolean Parsingboolean_lenient vs boolean_strictAccept “yes”/“no” vs only “true”/“false”
Tab Handlingcontinuation_tab_to_space vs continuation_tab_preserveLeading tabs on continuation lines: normalize 1:1 to space (OCaml reference) vs preserve verbatim
Delimiterdelimiter_first_equals vs delimiter_prefer_spacedSplit on the first = vs prefer spaced = when present
Indentationindent_spaces vs indent_tabsOutput formatting style
List Accesslist_coercion_enabled vs list_coercion_disabledList access coercion behavior
Array Orderingarray_order_insertion vs array_order_lexicographicPreserve insertion order vs sort lexicographically
  • reference_compliant - OCaml reference implementation behavior

Key Concept: Recursive Fixed-Point Parsing

Section titled “Key Concept: Recursive Fixed-Point Parsing”

CCL is fundamentally different from YAML/JSON. Understanding this is critical:

database =
host = localhost
port = 5432
  1. Parse → Entry("database", "\n host = localhost\n port = 5432")
  2. Value contains = → parse recursively
  3. Result → {database: {host: "localhost", port: "5432"}}
  4. Fixed point → “localhost” and “5432” have no = → done

Full details: Parsing Algorithm

PageUse When
Implementing CCLStarting a new implementation, choosing data structures
Parsing AlgorithmUnderstanding the core recursive algorithm
Syntax ReferenceLooking up syntax rules and edge cases
PageUse When
Library FeaturesAdding typed access, entry processing, or formatting
Library Features: FormattingUnderstanding print vs canonical_format
PageUse When
Test Suite GuideSetting up test filtering, understanding test format

Test Suite Repository: https://github.com/CatConfLang/ccl-test-data

  • Wrong: build-hierarchy, get-string, dotted-keys
  • Right: build_hierarchy, get_string, experimental_dotted_keys
  • source_tests/ → For test suite maintainers
  • generated_tests/For implementers (use this one)

Keep dotted keys out of the standard progression

Section titled “Keep dotted keys out of the standard progression”
  • Dotted keys are experimental
  • Not part of standard CCL implementation path
  • print → Structure-preserving: print(parse(x)) == x
  • canonical_format → Semantic-preserving: transforms to model representation
  • See Library Features: Formatting
TERMINOLOGY: Use snake_case everywhere
CORE: parse, build_hierarchy (required)
OPTIONAL: get_*, filter, compose, print, canonical_format
FEATURES: comments, empty_keys, multiline, unicode, whitespace
EXPERIMENTAL: experimental_dotted_keys (NOT standard)
TEST FORMAT: Use generated_tests/ directory (flat format)
ALGORITHM: Recursive fixed-point parsing (NOT like YAML/JSON)