Skip to content

CRV Core Grammar (EBNF)

(* ======================================================================= *)
(* CRV Core Grammar — ISO/IEC 14977 compliant                              *)
(* ======================================================================= *)

(* ---------- Action selector ---------- *)

action_request =
    "acquire_token"
  | "relinquish_token"
  | "relate_agent"
  | "relate_other_agents"
  | "endorse_token"
  | "coendorse_token_with_agents"
  | "expose_signal_about_token"
  | "declare_cooccurrence_between_tokens"
  | "propose_peer_exchange"
  | "accept_peer_exchange"
  | "reject_peer_exchange"
  | "settle_peer_exchange"
  | "post_order_to_venue"
  | "cancel_order_at_venue"
  | "settle_trade_from_venue"
  | "swap_at_venue"
  | "cast_vote_at_venue"
  | "publish_vote_outcome_from_venue"
  | "gift_token"
  | "send_chat_message"
  | "publish_announcement" ;

(* ---------- Action invocations ---------- *)

acquire_token =
    "acquire_token"
  , "("
  , agent_id
  , ","
  , token_id
  , [ "," , quantity ]
  , [ "," , mode ]
  , ")" ;

relinquish_token =
    "relinquish_token"
  , "("
  , agent_id
  , ","
  , token_id
  , [ "," , quantity ]
  , ")" ;

relate_agent =
    "relate_agent"
  , "("
  , source_agent_id
  , ","
  , target_agent_id
  , ","
  , relation_polarity
  , ")" ;

relate_other_agents =
    "relate_other_agents"
  , "("
  , speaker_agent_id
  , ","
  , subject_agent_id
  , ","
  , object_agent_id
  , ","
  , relation_polarity
  , ")" ;

endorse_token =
    "endorse_token"
  , "("
  , speaker_agent_id
  , ","
  , audience
  , ","
  , token_id
  , ","
  , endorsement_polarity
  , ")" ;

coendorse_token_with_agents =
    "coendorse_token_with_agents"
  , "("
  , speaker_agent_id
  , ","
  , audience
  , ","
  , agent_a_id
  , ","
  , agent_b_id
  , ","
  , token_id
  , ","
  , endorsement_polarity
  , ")" ;

expose_signal_about_token =
    "expose_signal_about_token"
  , "("
  , speaker_agent_id
  , ","
  , audience
  , ","
  , token_id
  , ","
  , signal_polarity
  , ")" ;

declare_cooccurrence_between_tokens =
    "declare_cooccurrence_between_tokens"
  , "("
  , token_a_id
  , ","
  , token_b_id
  , ")" ;

propose_peer_exchange =
    "propose_peer_exchange"
  , "("
  , proposer_agent_id
  , ","
  , counterparty_agent_id
  , ","
  , give_map
  , ","
  , want_map
  , [ "," , price ]
  , [ "," , ttl ]
  , ")" ;

accept_peer_exchange =
    "accept_peer_exchange"
  , "("
  , counterparty_agent_id
  , ","
  , proposal_id
  , ")" ;

reject_peer_exchange =
    "reject_peer_exchange"
  , "("
  , counterparty_agent_id
  , ","
  , proposal_id
  , ")" ;

settle_peer_exchange =
    "settle_peer_exchange"
  , "("
  , proposal_id
  , ","
  , legs
  , ")" ;

post_order_to_venue =
    "post_order_to_venue"
  , "("
  , agent_id
  , ","
  , venue_id
  , ","
  , token_id
  , ","
  , side
  , ","
  , quantity
  , ","
  , limit_price
  , ","
  , ttl
  , ")" ;

cancel_order_at_venue =
    "cancel_order_at_venue"
  , "("
  , agent_id
  , ","
  , venue_id
  , ","
  , order_id
  , ")" ;

settle_trade_from_venue =
    "settle_trade_from_venue"
  , "("
  , venue_id
  , ","
  , token_id
  , ","
  , price
  , ","
  , quantity
  , ","
  , taker_agent_id
  , ","
  , maker_agent_id
  , ","
  , side
  , ")" ;

swap_at_venue =
    "swap_at_venue"
  , "("
  , agent_id
  , ","
  , venue_id
  , ","
  , input_token_id
  , ","
  , input_quantity
  , ","
  , output_token_id
  , ","
  , minimum_output_quantity
  , ")" ;

cast_vote_at_venue =
    "cast_vote_at_venue"
  , "("
  , agent_id
  , ","
  , venue_id
  , ","
  , token_id
  , ","
  , stance_label
  , ","
  , stance_value
  , ")" ;

publish_vote_outcome_from_venue =
    "publish_vote_outcome_from_venue"
  , "("
  , venue_id
  , ","
  , token_id
  , ","
  , baseline_value
  , ")" ;

gift_token =
    "gift_token"
  , "("
  , from_agent_id
  , ","
  , to_agent_id
  , ","
  , token_id
  , ","
  , quantity
  , ")" ;

send_chat_message =
    "send_chat_message"
  , "("
  , sender_agent_id
  , ","
  , channel
  , ","
  , visibility
  , ","
  , utterance
  , ")" ;

publish_announcement =
    "publish_announcement"
  , "("
  , sender_agent_id
  , ","
  , channel
  , ","
  , payload
  , ")" ;

observation_envelope =
    "observation_envelope"
  , "("
  , actor_agent_id
  , ","
  , observer_agent_id
  , ","
  , channel
  , ","
  , visibility
  , ","
  , payload
  , ","
  , delivery_delay
  , ")" ;

representation_patch =
    "representation_patch"
  , "["
  , [ patch_edit , { "," , patch_edit } ]
  , "]" ;

patch_edit =
    "set_identity_edge_weight"
  , "("
  , edge_kind
  , ","
  , subject_id
  , [ "," , object_id ]
  , ","
  , new_weight
  , ")"
  | "adjust_identity_edge_weight"
  , "("
  , edge_kind
  , ","
  , subject_id
  , [ "," , object_id ]
  , ","
  , delta_weight
  , ")"
  | "decay_identity_edges"
  , "("
  , edge_kind
  , ","
  , scope_selector
  , ","
  , decay_lambda
  , ")"
  | "remove_identity_edge"
  , "("
  , edge_kind
  , ","
  , subject_id
  , [ "," , object_id ]
  , ")" ;

(* ---------- Parameter nonterminals ---------- *)

agent_id = Ident ;
from_agent_id = Ident ;
to_agent_id = Ident ;
source_agent_id = Ident ;
target_agent_id = Ident ;
speaker_agent_id = Ident ;
sender_agent_id = Ident ;
subject_agent_id = Ident ;
object_agent_id = Ident ;
agent_a_id = Ident ;
agent_b_id = Ident ;
counterparty_agent_id = Ident ;
proposer_agent_id = Ident ;
taker_agent_id = Ident ;
maker_agent_id = Ident ;
actor_agent_id = Ident ;
observer_agent_id = Ident ;

proposal_id = Ident ;
order_id = Ident ;
venue_id = Ident ;
channel = Ident ;
visibility = Ident ;
audience = Ident ;

token_id = Ident ;
token_a_id = Ident ;
token_b_id = Ident ;
input_token_id = Ident ;
output_token_id = Ident ;

relation_polarity = Ident ;
endorsement_polarity = Ident ;
signal_polarity = Ident ;
stance_label = Ident ;

mode = Ident ;
side = Ident ;
scope_selector = Ident ;
legs = Ident ;
give_map = Ident ;
want_map = Ident ;
payload = String | Ident ;
utterance = String ;

quantity = Number ;
input_quantity = Number ;
minimum_output_quantity = Number ;
price = Number ;
limit_price = Number ;
baseline_value = Number ;
stance_value = Number ;
new_weight = Number ;
delta_weight = Number ;
decay_lambda = Number ;
delivery_delay = Number ;
ttl = Number ;

edge_kind = Ident ;
subject_id = Ident ;
object_id = Ident ;

(* ---------- Lexical ---------- *)

Ident =
    letter
  , { letter | digit | "_" } ;

Number =
    [ "-" ]
  , digit
  , { digit }
  , [ "." , digit , { digit } ] ;

String =
    '"'
  , { string_character }
  , '"' ;

string_character =
      string_unescaped
    | escape_sequence ;

string_unescaped = ? any character except double-quote and backslash ? ;

escape_sequence =
    '\\'
  , ( '"'
    | '\\'
    | 'n'
    | 't'
    ) ;

character = ? any Unicode scalar value ? ;

letter =
    "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T"
  | "U" | "V" | "W" | "X" | "Y" | "Z"
  | "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t"
  | "u" | "v" | "w" | "x" | "y" | "z" | "_" ;

digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;