Extending CrossGL Translator

CrossGL Translator extension points are registry based. New backends should be registered through small specs rather than by branching the public translate entry point.

Add a target backend

Target generators implement a class with a generate(ast) method, then register a BackendSpec.

from crosstl.translator.codegen import BackendSpec, register_backend

class MyBackendCodeGen:
    def generate(self, ast):
        return "..."

register_backend(
    BackendSpec(
        name="my-backend",
        codegen_class=MyBackendCodeGen,
        aliases=("myb",),
        file_extensions=(".myb",),
        format_backend="my-backend",
    )
)

Add a source backend

Source backends register a lexer/parser loader and, when supported, a reverse code generator that emits CrossGL.

from crosstl.translator.source_registry import SourceSpec, SOURCE_REGISTRY

def load_lexer_parser():
    return MyLexer, MyParser

SOURCE_REGISTRY.register(
    SourceSpec(
        name="my-source",
        extensions=(".mysrc",),
        load_lexer_parser=load_lexer_parser,
        reverse_codegen_factory=MyToCrossGL,
        aliases=("mysrc",),
    )
)

Plugin discovery

discover_backend_plugins() looks for backend_spec and source_spec modules inside backend packages under crosstl.backend. A package can expose BACKEND_SPEC, BACKEND_SPECS, SOURCE_SPEC, SOURCE_SPECS, or a register function.

This keeps new source and target integrations isolated from the core translator package.