UNPKG

@helios-lang/compiler

Version:

Helios is a Domain Specific Language that compiles to Plutus-Core (i.e. Cardano on-chain validator scripts). Helios is a non-Haskell alternative to Plutus. With this library you can compile Helios scripts and build Cardano transactions, all you need to bu

665 lines (537 loc) 17.7 kB
# Overview Topics covered in this document: * Grammer of the Helios syntax * Token types generated during first stage of parsing * Operator precedence and associativity * Optimization steps when generating optimized IR * Complete list of builtin types and functions # Grammar ``` Program ::= ScriptPurpose Statement (Statement)* ScriptPurpose ::= ('testing' | 'minting' | 'spending' | 'staking' | 'module') Word Statement ::= ImportStatement | ConstStatement | StructStatement | FuncStatement | EnumStatement Comment ::= 'regexp://.*\n' | 'regexp:/\*(.*|\n)\*/' ImportStatement ::= 'import' '{' ImportField (',' ImportField)* '}' 'from' ModuleName ModuleName ::= Word ImportField ::= Word ['as' Word] TypeClassExpr ::= Identifier TypeParameters ::= '[' TypeParameter (',' TypeParameter )* ']' TypeParameter ::= Identifier [ ':' TypeClassExpr ] StructStatement ::= 'struct' Word [ TypeParameters ] '{' DataDefinition [ImplDefinition] '}' DataDefinition ::= DataField (DataField)* DataField ::= Word ':' TypeExpr DestructExpr ::= '_' | (Identifier [':' TypeExpr ['{' DestructExpr (',' DestructExpr)* '}']]) | (TypeExpr ['{' DestructExpr (',' DestructExpr)* '}']) EnumStatement ::= 'enum' Identifier [ TypeParameters ] '{' EnumMember (EnumMember)* [ImplDefinition] '}' EnumMember ::= Identifier ['{' DataDefinition '}'] ImplDefinition ::= ImplMember (ImplMember)* ImplMember ::= ConstStatement | FuncStatement ConstStatement ::= 'const' Identifier [':' TypeExpr] '=' ValueExpr FuncStatement ::= 'func' Identifier [ TypeParameters ] '(' [('self' | FuncArg) (',' FuncArg)*] ')' '->' RetTypeExpr '{' ValueExpr '}' FuncArg ::= '_' | ( Identifier ':' TypeExpr ) TypeExpr ::= NonFuncTypeExpr | FuncTypeExpr RetTypeExpr ::= '(' ')' | TypeExpr | ( '(' TypeExpr ',' TypeExpr (',' TypeExpr)* ')' ) NonFuncTypeExpr ::= TypeRefExpr | TypePathExpr | ListTypeExpr | MapTypeExpr | OptionTypeExpr | ParametricTypeExpr FuncTypeExpr ::= [ TypeParameters ] '(' [FuncArgTypeExpr (',' FuncArgTypeExpr)*] ')' '->' RetTypeExpr FuncArgTypeExpr ::= [Identifier ':'] ['?'] TypeExpr TypeRefExpr ::= Identifier TypePathExpr ::= NonFuncTypeExpr '::' Word ParametricTypeExpr ::= TypeExpr '[' TypeExpr (',' TypeExpr)* ']' ListTypeExpr ::= '[' ']' NonFuncTypeExpr MapTypeExpr ::= 'Map' '[' NonFuncTypeExpr ']' NonFuncTypeExpr OptionTypeExpr ::= 'Option' '[' NonFuncTypeExpr ']' ValueExpr ::= AssignExpr | MultiAssignExpr | PrintExpr | LiteralExpr | ValueRefExpr | ValuePathExpr | UnaryExpr | BinaryExpr | ParensExpr | CallExpr | MemberExpr | IfElseExpr | SwitchExpr | ParametricValueExpr LiteralExpr ::= PrimitiveLiteralExpr | StructLiteralExpr | ListLiteralExpr | MapLiteralExpr | FuncLiteralExpr PrimitiveLiteralExpr ::= PrimitiveLiteral PrimitiveLiteral ::= IntLiteral | BoolLiteral | StringLiteral | ByteArrayLiteral StructLiteralExpr ::= (TypePathExpr | TypeRefExpr) ['{' StructLiteralField (',' StructLiteralField)* '}'] StructLiteralField ::= [Word ':'] ValueExpr ListLiteralExpr ::= '[]' TypeExpr '{' [ValueExpr] (',' ValueExpr)* '}' MapLiteralExpr ::= 'Map' '[' TypeExpr ']' TypeExpr '{' [ValueExpr ':' ValueExpr] (',' ValueExpr ':' ValueExpr)* '}' FuncLiteralExpr ::= [TypeParameters] '(' [FuncArg (',' FuncArc)*] ')' '->' TypeExpr '{' ValueExpr '}' IntLiteral ::= 'regexp:[0-9]+' | 'regexp:0b[0-1]+' | 'regexp:0o[0-7]+' | 'regexp:0x[0-9a-f]+' BoolLiteral ::= 'true' | 'false' StringLiteral ::= '"' StringLiteralChar* '"'; StringLiteralChar ::= '\\' | '\n' | '\t' | '\"' | 'regexp:[^\]' ByteArrayLiteral ::= '#' 'regexp:[0-9a-f]*' BinaryExpr ::= ValueExpr BinaryOp ValueExpr BinaryOp ::= '+' | '-' | '*' | '/' | '%' | '==' | '!=' | '<' | '>' | '<=' | '>=' | '||' | '&&' UnaryExpr ::= UnaryOp ValueExpr UnaryOp ::= '-' | '+' | '!' AssignExpr ::= DestructExpr '=' ValueExpr ';' ValueExpr MultiAssignExpr ::= '(' DestructExpr ',' DestructExpr (',' DestructExpr)* ')' '=' ValueExpr ';' ValueExpr PrintExpr ::= 'print' '(' ValueExpr ')' ErrorExpr ::= [ValueExpr ';'] 'error' '(' ValueExpr ')' BranchExpr ::= ValueExpr | ErrorExpr IfElseExpr ::= 'if' '(' ValueExpr ')' '{' BranchExpr '}' ('else' 'if' '(' ValueExpr ')' '{' BranchExpr '}')* 'else' '{' BranchExpr '}' SwitchExpr ::= ValueExpr '.' 'switch' '{' SwitchCase (',' SwitchCase)* [SwitchDefault] '}' SwitchCase ::= DestructExpr '=>' (BranchExpr | ('{' BranchExpr '}')) SwitchDefault ::= 'else' '=>' (BranchExpr | ('{' BranchExpr '}')) CallExpr ::= ValueExpr '(' [ValueExpr (',' ValueExpr)*] ')'; MemberExpr ::= ValueExpr '.' Word ParensExpr ::= '(' [ValueExpr (',' ValueExpr)*] ')' ValuePathExpr ::= NonFuncTypeExpr '::' Word ValueRefExpr ::= Identifier ParametricValueExpr ::= ValueExpr '[' TypeExpr (',' TypeExpr)* ']' Identifier ::= Word Word ::= 'regexp:[a-zA-Z_][0-9a-zA-Z_]*' ``` # Tokenization The tokenizer generates a list of the following terms: * Word * Symbol * Group `(...)` `{...}` `[...]` with fields separated by commas * IntLiteral * BoolLiteral * StringLiteral * ByteArrayLiteral Comments are removed immediately. # Operator precedence and associativity 0. `... = ... ; ...` and `print(...); ...`, right-to-left 1. `||`, left-to-right 2. `&&`, left-to-right 3. `==` and `!=`, left-to-right 4. `<`, `>`, `<=` and `>=`, left-to-right 5. binary `+` and `-`, left-to-right 6. `*`, `/` and `%`, left-to-right 7. unary `+`, `-`, `!`, right-to-left 8. `.`, `::`, `... (...)`, `... {...}`, `(...) -> ... {...}`, `if (...) {...} else ...` and `... . switch {...}`, left-to-right 9. `(...)` # Optimization of generated code (IR level) 1. as much reuse as possible in the manually written IR code 2. const evaluation (with special handling of partial consts in eg. the ifThenElse condition, multiplying by zero etc.) 3. elimination of function calls with a single argument itself starting with the inverse call 4. inlining of single use variables 5. unused variable and dead-code elimination 6. extraction of core cast functions # Builtins ## Int ``` associated: from_data, parse, from_little_endian, from_big_endian, min, max, from_base58, sqrt, __to_data operators: __eq, __neq, __neg, __pos, __add, __sub, __mul, __div, __mod, __geq, __gt, __leq, __lt methods: serialize, to_bool, to_hex, to_little_endian, to_big_endian, show, bound, bound_min, bound_max, abs, encode_zigzag, decode_zigzag, to_base58, to_real internal ns: __helios__int ``` ## Real ``` associated: from_data, __to_data, sqrt operators: __eq, __neq, __neg, __pos, __add, __sub, __mul, __div, __geq, __gt, __leq, __lt methods: serialize, show, floor, trunc, ceil, round, internal ns: __helios__real ``` ## Bool ``` associated: and, or, from_data, __to_data operators: __eq, __neq, __not, __and (desugars as 'and'), __or (desugars as 'or') methods: serialize, to_int, show internal ns: __helios__bool ``` ## String ``` associated: from_data, __to_data operators: __eq, __neq, __add methods: serialize, starts_with, ends_with, encode_utf8 internal ns: __helios__string ``` ## ByteArray ``` associated: from_data, __to_data operators: __eq, __neq, __add, __lt, __leq, __gt, __geq getters: length methods: serialize, slice, starts_with, ends_with, sha2, sha3, blake2b, decode_utf8, show, prepend internal ns: __helios__bytearray ``` ## List ``` associated: new, new_const, from_data, __to_data operators: __eq, __neq, __add getters: length, head, tail methods: serialize, is_empty, get, prepend, any, all, find, find_safe, filter, fold, fold_lazy, map, sort, for_each, get_singleton, drop, take, drop_end, take_end, sum, join, flatten internal ns: __helios__list ``` ## Map ``` associated: from_data, __to_data operators: __eq, __neq, __add getters: length, head_key, head_value, tail methods: serialize, is_empty, get, get_safe, set, delete, all, all_keys, all_values, any, any_key, any_value, filter, filter_by_key, filter_by_value, fold, fold_keys, fold_values, fold_lazy, fold_keys_lazy, fold_values_lazy, map_keys, map_values, prepend sort, sort_by_key, sort_by_value, find, find_key, find_key_safe, find_by_key, find_value, find_value_safe, find_by_value, for_each, to_list, update, update_safe internal ns: __helios__map ``` ## Option ``` associated: from_data, __to_data operators: __eq, __neq methods: serialize, unwrap, map internal ns: __helios__option ``` ### Option::Some ``` operators: __eq, __neq, __to_data getters: some methods: serialize hidden: new, cast internal ns: __helios__option__some ``` ### Option::None ``` operators: __eq, __neq, __to_data methods: serialize hidden: new, cast internal ns: __helios__option__none ``` ## ScriptHash ``` associated: from_data, __to_data operators: __eq, __neq methods: serialize internal ns: __helios__scripthash ``` ## PubKeyHash, DatumHash ``` associated: new, from_data, __to_data operators: __eq, __neq, __lt, __leq, __gt, __geq methods: serialize, show internal ns: __helios__hash ``` ## ValidatorHash, MintingPolicyHash, StakingValidatorHash ``` associated: new, from_data, from_script_hash, __to_data operators: __eq, __neq, __lt, __leq, __gt, __geq methods: serialize, show macros: CURRENT internal ns: __helios__hash ``` ## PubKey ``` associated: new, from_data, __to_data operators: __eq, __neq methods: serialize, show, verify internal ns: __helios__pubkey ``` ## ScriptContext ``` associated: from_data, __to_data operators: __eq, __neq getters: tx methods: serialize, get_spending_purpose_output_id, get_current_validator_hash, get_current_minting_policy_hash, get_current_input, get_staking_purpose, get_script_purpose, get_cont_outputs macros: new_spending, new_minting, new_rewarding, new_certifying internal ns: __helios__scriptcontext ``` ## StakingPurpose ``` associated: from_data, __to_data operators: __eq, __neq methods: serialize internal ns: __helios__stakingpurpose ``` ### StakingPurpose::Rewarding ``` operators: __eq, __neq, __to_data getters: credential methods: serialize internal ns: __helios__stakingpurpose__rewarding ``` ### StakingPurpose::Certifying ``` operator: __eq, __neq, __to_data getters: dcert, methods: serialize, internal ns: __helios__stakingpurpose__certifying ``` ## ScriptPurpose ``` associated: from_data, new_minting, new_spending, new_rewarding, new_certifying, __to_data operators: __eq, __neq methods: serialize internal ns: __helios__scriptpurpose ``` ### ScriptPurpose::Minting ``` operators: __eq, __neq, __to_data getters: policy_hash methods: serialize internal ns: __helios__scriptpurpose__minting ``` ### ScriptPurpose::Spending ``` operators: __eq, __neq, __to_data getters: output_id methods: serialize internal ns: __helios__scriptpurpose__spending ``` ### ScriptPurpose::Rewarding ``` operators: __eq, __neq, __to_data getters: credential methods: serialize internal ns: __helios__scriptpurpose__rewarding ``` ### ScriptPurpose::Certifying ``` operator: __eq, __neq, __to_data getters: dcert, methods: serialize, internal ns: __helios__scriptpurpose__certifying ``` ## DCert ``` associated: from_data, __to_data operators: __eq, __neq methods: serialize macros: new_register, new_deregister, new_delegate, new_register_pool, new_retire_pool internal ns: __helios__dcert ``` ### DCert::Register ``` operators: __eq, __neq, __to_data getters: credential methods: serialize internal ns: __helios__dcert__register ``` ### DCert::Deregister ``` operators: __eq, __neq, __to_data getters: credential methods: serialize internal ns: __helios__dcert__deregister ``` ### DCert::Delegate ``` operators: __eq, __neq, __to_data getters: delegator, pool_id methods: serialize internal ns: __helios__dcert__delegate ``` ### DCert::RegisterPool ``` operators: __eq, __neq, __to_data getters: pool_id, pool_vrf methods: serialize internal ns: __helios__dcert__registerpool ``` ### DCert::RetirePool ``` operators: __eq, __neq, __to_data getters: pool_id, epoch methods: serialize internal ns: __helios__dcert__retirepool ``` ## Tx ``` associated: from_data, __to_data operators: __eq, __neq getters: inputs, ref_inputs, outputs, fee, minted, dcerts, withdrawals, time_range, signatories, id methods: serialize, find_datum_hash, outputs_sent_to, outputs_sent_to_datum, outputs_locked_by, outputs_locked_by_datum, value_sent_to, value_sent_to_dataum, value_locked_by, value_locked_by_datum, is_signed_by macros: new hidden: datums internal ns: __helios__tx ``` ## TxId ``` associated: new, from_data, __to_data operators: __eq, __neq, __lt, __leq, __gt, __geq methods: serialize, show macros: CURRENT internal ns: __helios__txid ``` ## TxInput ``` associated: from_data, __to_data operators: __eq, __neq getters: output_id, output, value, datum, address methods: serialize macros: new internal ns: __helios__txinput ``` ## TxOutput ``` associated: from_data, __to_data operators: __eq, __neq getters: address, value, datum, ref_script_hash methods: serialize macros: new hidden: get_datum_hash internal ns: __helios__txoutput ``` ## OutputDatum ``` associated: from_data, __to_data operators: __eq, __neq macros: new_none, new_hash, new_inline methods: inline_data, serialize internal ns: __helios__outputdatum ``` ### OutputDatum::None ``` operators: __eq, __neq, __to_data methods: serialize internal ns: __helios__outputdatum__none ``` ### OutputDatum::Hash ``` operators: __eq, __neq, __to_data getters: hash methods: serialize internal ns: __helios__outputdatum__hash ``` ### OutputDatum::Inline ``` operators: __eq, __neq, __to_data getters: data methods: serialize internal ns: __helios__outputdatum__inline ``` ## Data ``` associated: from_data, __to_data operators: __eq, __neq getters: tag methods: serialize internal ns: __helios__data ``` ## TxOutputId ``` associated: new, from_data, __to_data operators: __eq, __neq, __lt, __leq, __gt, __geq methods: serialize internal ns: __helios__txoutputid ``` ## Address ``` associated: new, new_empty, from_data, __to_data operators: __eq, __neq getters: credential, staking_credential methods: serialize hidden: is_staked internal ns: __helios__address ``` ## Credential ``` associated: new_pubkey, new_validator, from_data, __to_data operators: __eq, __neq methods: serialize hidden: is_pubkey, is_validator internal ns: __helios__credential ``` ### Credential::PubKey ``` associated: from_data, __to_data operators: __eq, __neq getters: hash methods: serialize hidden: cast internal ns: __helios__credential__pubkey ``` ### Credential::Validator ``` associated: from_data, __to_data operators: __eq, __neq getters: hash methods: serialize hidden: cast internal ns: __helios__credential__validator ``` ## StakingHash ``` associated: new_stakekey, new_validator, from_data, __to_data operators: __eq, __neq methods: serialize hidden: is_stakekey, is_validator internal ns: __helios__stakinghash ``` ### StakingHash::StakeKey ``` associated: from_data, __to_data operators: __eq, __neq getters: hash methods: serialize hidden: cast internal ns: __helios__stakinghash__stakekey ``` ### StakingHash::Validator ``` associated: from_data, __to_data operators: __eq, __neq getters: hash methods: serialize hidden: cast internal ns: __helios__stakinghash__validator ``` ## StakingCredential ``` associated: new_hash, new_ptr, from_data, __to_data operators: __eq, __neq methods: serialize internal ns: __helios__stakingcredential ``` ### StakingCredential::Hash ``` operators: __eq, __neq, __to_data methods: serialize internal ns: __helios__stakingcredential__hash ``` ### StakingCredential::Ptr ``` operators: __eq, __neq, __to_data methods: serialize internal ns: __helios__stakingcredential__ptr ``` ## Time ``` associated: new, from_data, __to_data operators: __eq, __neq, __add, __sub, __sub_alt, __geq, __gt, __leq, __lt methods: serialize, show internal ns: __helios__time ``` ## Duration ``` associated: new, from_data, SECOND, MINUTE, HOUR, DAY, WEEK, __to_data operators: __eq, __neq, __add, __sub, __mul, __div, __div_alt, __mod, __geq, __gt, __leq, __lt methods: serialize internal ns: __helios__duration ``` ## TimeRange ``` associated: new, to, from, ALWAYS, NEVER, from_data, __to_data operators: __eq, __neq getters: start, end methods: serialize, contains, is_before, is_after, show internal ns: __helios__timerange ``` ## AssetClass ``` associated: ADA, new, from_data, __to_data operators: __eq, __neq getters: mph, token_name methods: serialize internal ns: __helios__assetclass ``` ## Value ``` associated: ZERO, lovelace, new, from_data, from_map, __to_data operators: __eq, __neq, __add, __sub, __geq, __gt, __leq, __lt methods: serialize, is_zero, get, get_safe, contains, get_policy, contains_policy, to_map, get_lovelace, get_assets, show hidden: get_map_keys, merge_map_keys, get_inner_map, get_inner_map_int, add_or_subtract_inner, add_or_subtract, compare_inner, compare internal ns: __helios__value ``` ## Common (hidden from user) ``` associated: verbose_error, assert_constr_index, not, identity, serialize, is_in_bytearray_list unBoolData, boolData, unStringData, stringData operators: __eq, __neq methods: __identity internal ns: __helios__common ```