Saltar al contenido principal

EBNF de axon-lang — referencia abreviada de la gramática

Esta página reproduce las reglas de producción que un agente necesita más a menudo: estructura del programa, declaraciones, cuerpo de un flow, expresiones de tipo y el fragmento de tipos de sesión.

El EBNF canónico completo vive en el paper del lenguaje papers/paper_axon_language.md; la implementación del parser vive en axon-frontend/src/parser.rs. Esta versión abreviada está curada para que la consuma un agente: los tokens que importan, las producciones que compilan y las omisiones marcadas con claridad.

Superficie léxica​

identifier = letter , { letter | digit | "_" } ;
integer = digit , { digit } ;
number = integer , [ "." , digit , { digit } ] ;
duration = integer , ( "ms" | "s" | "m" | "h" ) ;
string_literal = '"' , { utf8_char } , '"' ;
bcp47 = '"' , language_subtag , { "-" , subtag } , '"' ;

Los comentarios son de línea, con //. El espacio en blanco no es significativo salvo donde la gramática de slugs con puntos (legal:HIPAA.164_502) exige adyacencia entre tokens.

Programa​

program = { declaration | import | run } ;
import = "import" , identifier , "{" , identifier_list , "}" ;
declaration = persona_def
| context_def
| flow_def
| anchor_def
| tool_def
| type_def
| session_def
| socket_def
| axonendpoint_def
| axonstore_def
| shield_def
| mandate_def
| compute_def
| lambda_def
| daemon_def
| (* …65+ total — see axon://grammar/top_level *) ;
run = "run" , identifier , "(" , arg_list? , ")"
, [ "as" , identifier ]
, [ "within" , identifier ]
, [ "constrained_by" , "[" , identifier_list , "]" ]
, [ "on_failure" , ":" , failure_policy ]
, [ "output_to" , ":" , string_literal ]
, [ "effort" , ":" , effort_level ] ;

Persona​

persona_def = "persona" , identifier , "{" , persona_field+ , "}" ;
persona_field = "domain" , ":" , string_list
| "tone" , ":" , tone_ident
| "confidence_threshold" , ":" , number
| "cite_sources" , ":" , bool
| "refuse_if" , ":" , bracketed_identifiers
| "language" , ":" , bcp47
| "description" , ":" , string_literal ;

tone_ident = "analytical" | "assertive" | "casual" | "diplomatic"
| "empathetic" | "formal" | "friendly" | "precise" ;

Flow + step​

flow_def = "flow" , identifier , "(" , param_list? , ")"
, [ "->" , type_expr ]
, "{" , { flow_step } , "}" ;
param_list = parameter , { "," , parameter } ;
parameter = identifier , ":" , type_expr ;

flow_step = step_node
| if_stmt | for_stmt | let_stmt | return_stmt
| break_stmt | continue_stmt
| reason_step | probe_step | validate_step | refine_step
| weave_step | use_step | par_block | hibernate_step
| listen_step | retrieve_step | persist_step | mutate_step
| deliberate_step | navigate_step | drill_step | trail_step
| (* …complete list in parser.rs::parse_flow_step *) ;

deliberate_step = "deliberate" , "{" , { flow_step } , "}" ;
(* v2.12.0/63 — cognitive retrieval over a `pix` tree OR a `corpus`
graph (a corpus WITH `relations:` is an MDN graph). Dispatch is by
the referenced declaration, not by keyword. *)
navigate_step = "navigate" , identifier
, "{" , { navigate_field } , "}" ;
navigate_field = "query" , ":" , expression
| "from" , ":" , identifier (* seed document *)
| "budget" , ":" , number (* max documents *)
| "trail" , ":" , boolean
| "output" , ":" , identifier ;
drill_step = "drill" , identifier , "{" , { navigate_field } , "}" ;
trail_step = "trail" , identifier , "{" , { navigate_field } , "}" ;

step_node = "step" , identifier , [ "use" , identifier ]
, "{" , step_field+ , "}" ;
step_field = "given" , ":" , expression
| "ask" , ":" , string_literal
| "output" , ":" , type_expr
| "confidence_floor" , ":" , number
| "navigate" , ":" , dotted_identifier
| "apply" , ":" , identifier
| sub_construct ;
sub_construct = ( "use" | "probe" | "reason" | "weave" | "stream" ) , … ;

reason_step = "reason" , [ identifier ] , [ "{" , (* skipped *) , "}" ] ;

Expresiones de tipo​

type_expr = identifier , [ "<" , type_expr , ">" ] , [ "?" ] ;
type_def = "type" , identifier
, [ "(" , number , ".." , number , ")" ]
, [ "where" , expression ]
, [ "compliance" , bracketed_identifiers ]
, [ "{" , type_field_list , "}" ] ;
type_field_list = type_field , { "," , type_field } ;
type_field = identifier , ":" , type_expr ;

Los genéricos recursivos como FlowEnvelope<List<TenantRecord>> se aceptan desde la v2.0.0.

Anchor​

anchor_def = "anchor" , identifier , "{" , anchor_field+ , "}" ;
anchor_field = "require" , ":" , identifier
| "reject" , ":" , bracketed_identifiers
| "enforce" , ":" , identifier
| "description" , ":" , string_literal
| "confidence_floor" , ":" , number
| "unknown_response" , ":" , string_literal
| "on_violation" , ":" , violation_policy ;
violation_policy = ( "raise" | "fallback" ) , identifier
| identifier ;

Tool​

tool_def = "tool" , identifier , "{" , tool_field+ , "}" ;
tool_field = "provider" , ":" , identifier
| "max_results" , ":" , integer
| "filter" , ":" , filter_expr
| "timeout" , ":" , duration
| "runtime" , ":" , identifier
| "sandbox" , ":" , bool
| "effects" , ":" , effect_row ;
effect_row = "<" , effect_term , { "," , effect_term } , ">" ;
effect_term = effect_name , [ ":" , qualifier_value ] ;
effect_name = "io" | "network" | "pure" | "random" | "storage"
| "stream" | "trust" | "sensitive" | "legal" | "ots" ;
qualifier_value = dotted_slug ;

Tipos de sesión (v2.3.0)​

session_def = "session" , identifier , "{"
, "client" , ":" , session_type
, "server" , ":" , session_type
, "}" ;
session_type = "[" , session_action , { "," , session_action } , "]" ;
session_action = "send" , type_expr
| "receive" , type_expr
| "select" , "{" , session_branch , { "," , session_branch } , "}"
| "branch" , "{" , session_branch , { "," , session_branch } , "}"
| "loop"
| "end" ;
session_branch = identifier , ":" , session_type ;

socket_def = "socket" , identifier , "{" , socket_field+ , "}" ;
socket_field = "protocol" , ":" , identifier
| "backpressure" , ":" , "credit" , "(" , integer , ")"
| "reconnect" , ":" , "cognitive_state"
| "legal_basis" , ":" , identifier ;

Las restricciones de dualidad y de contrapresión refinada por créditos (peer ≡ self⊥, descarga de Presburger) viven en el verificador de tipos, no en la gramática — son reglas de tipado, que se aplican después de que el parser haya producido el AST.

Qué NO incluye esta página​

Esta es la referencia abreviada de la gramática. Producciones omitidas a propósito (cubiertas en recursos dedicados o en el paper):

  • La enumeración completa de flow_step (~30 tipos o más — la lista canónica está en parser.rs::parse_flow_step).
  • Las declaraciones completas de axonendpoint, axonstore, daemon, shield, psyche, ots, agent, lambda, compute, resource, fabric, manifest, observe, reconcile, lease, ensemble, pix, mandate, mcp, taint, logic, corpus y dataspace.
  • La gramática de slugs con puntos para anotaciones de cumplimiento (cubierta bajo cada recurso axon://compliance/<framework>).
  • Las reglas de proyección multiparte de Honda-Yoshida-Carbone (cubiertas bajo axon://logic/session_duality y el paper de la v2.3.0).

Para esas producciones, consulta las fuentes enlazadas o los recursos por primitiva vía axon.primitives + axon.primitive_doc.