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 '[' ':' colElmType ']' |
colElmType | : scalarType | anyType |
stmt | : [flow] varlist [':=' expr ] |
flow | | RETURN | BARRIER | CATCH | LEAVE | REDO | RAISE |
varlist | : variable | '(' variable [',' variable ] * ')' |
variable | : identifier |
expr | : fcncall | [factor operator] factor |
factor | : literal_constant | NIL | var |
fcncall | : moduleName '.' name '(' [args] ')' |
args | : factor [',' factor]* |