EBNF de AXON — 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á enparser.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,corpusydataspace. - 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_dualityy 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.