Skip to main content

MAL syntax

The MAL syntax is summarized below in extended BNF. Alternative constructs are seperated by | and grouped by parenthesis. Optional parts are marked with square brackets. A repetition is marked with either '+' or '*' to indicate at least once and many times, respectively. Lexical tokens are illustrated in small capitals.

program : (statement ';') *
statement : moduleStmt [helpinfo] | definition [helpinfo]
  | includeStmt | stmt
moduleStmt : MODULE ident | ATOM ident [':'ident]
includeStmt : INCLUDE identifier | INCLUDE string_literal
definition : [UNSAFE] COMMAND header ADDRESS identifier
  | [UNSAFE] PATTERN header ADDRESS identifier
  | [INLINE | UNSAFE ] FUNCTION header statement* END name
  | FACTORY header statement* END name
helpinfo : COMMENT string_literal
header : name '(' params ')' result
name : [ moduleName '.' ] name
result : typeName | '(' params ')'
params : binding [',' binding]*
binding : identifier typeName
typeName : scalarType | columnType | ':' any ['_' digit]
scalarType : ':' identifier
columnType : ':' BAT ['[' ':' 'oid' ',' colElmType ']']
colElmType : scalarType | anyType
stmt : [flow] varlist [':=' expr ]
flow | RETURN  | BARRIER | CATCH | LEAVE | REDO | RAISE
varlist : variable | '(' variable [',' variable ] * ')'
variable : identifier [ props ]
expr : fcncall | [factor operator] factor
factor : literal_constant | NIL | var
fcncall : moduleName '.' name '(' [args] ')'
args : factor [',' factor]*