AWL syntax chart
/*
--------------------------------------------------------------
Syntax root
--------------------------------------------------------------
*/
/* Sequence of root statements */
ROOT_STMT_SEQ:
| ROOT_STMT
| ROOT_STMT ';' ROOT_STMT_SEQ
| SYNTAX_ERR ROOT_STMT_SEQ /* syntax error recovery */
;
ROOT_STMT: STMT /* root statement -> execute */
;
SYNTAX_ERR: error ';' /* syntax error */
;
/*
--------------------------------------------------------------
Rules for statements
--------------------------------------------------------------
*/
/* Single statement */
STMT:
EXPR /* any expression is statement */
| FC_DEF /* functor/class definition */
| S_DEF /* scope definition */
;
/* Functor/class definition */
FC_DEF:
F_DEF /* functor definition */
| C_DEF /* class definition */
;
/* Statement sequence:
statements, separated with ';' */
O_STMT:
| STMT
;
STMT_SEQ:
O_STMT
| O_STMT ';' STMT_SEQ
;
/*
--------------------------------------------------------------
Functor && class definitions
--------------------------------------------------------------
*/
/* Parameter or local */
LOCAL: L_IDENT
;
/* Parameter flag ('@', if lazy passing) */
PARAM_FLAG:
| '@'
;
/* Parameter list */
PARAM_LIST:
| PARAM_FLAG LOCAL PARAM_LIST
;
/* Optional parameters list */
O_PARAM_LIST:
| '(' PARAM_LIST ')'
;
/* Locals list (no return) */
LOCAL_LIST:
| LOCAL LOCAL_LIST
;
/* Optional locals list (no return) */
O_LOCAL_LIST:
| ':' '[' LOCAL_LIST ']'
;
/* Functor definition header]
([optional] parameters + [optional] locals, returns parameters) */
F_DEF_HEAD:
O_PARAM_LIST O_LOCAL_LIST
;
/* Functor definition */
F_DEF: /* functor name */
'!' L_IDENT
/* functor header & body */
F_DEF_HEAD '=' EXPR
;
/* List of definitions */
FC_LIST:
FC_DEF
| FC_LIST ',' FC_DEF
;
/* List of definitions (optional) */
O_FC_LIST:
| ''
;
/* Optional superclass */
O_SUPER:
| '[' PREFIX ']'
;
/* Optional constructor */
O_CTOR:
| '=' C_EXPR
;
/* Optional destructor */
O_DTOR:
| '~' C_EXPR
;
/* Class definition */
C_DEF: /* class header */
'!!' O_SUPER L_IDENT
/* optional parameter list */
O_PARAM_LIST
/* optional locals list */
O_LOCAL_LIST
/* optional constructor */
O_CTOR
/* optional destructor */
O_DTOR
/* local functors/classes */
O_FC_LIST
;
/* Scope definition */
S_DEF: '!' '%' L_IDENT
''
;
/*
--------------------------------------------------------------
Rules for expressions
--------------------------------------------------------------
*/
/* Scalar literal */
L_LIT:
L_FIXED
| L_FLOAT
| L_STRING
;
/* Prefix reference */
PREFIX: L_IDENT
;
/* Variable reference */
R_VAR: L_IDENT
;
/* Sequence of expressions (comma-separated) */
XP_SEQ:
| EXPR
| EXPR ',' XP_SEQ
;
/* Sequence of closed expressions */
CXP_SEQ:
| C_EXPR CXP_SEQ
;
/* Closed expression (allowed with prefix) */
C_EXPR_PFX:
L_LIT /* literal */
| '(' XP_SEQ ')' /* list of any expressions */
;
/* Closed expression */
C_EXPR_NN:
C_EXPR_PFX
| '[' CXP_SEQ ']' /* list of closed expressions */
| '' /* block */
;
/* TODO: remove this mess... */
C_EXPR: C_EXPR_NN
| R_VAR /* variable reference */
;
/* Expression: terminal (postfix) */
XP_TERM: C_EXPR_NN /* (closed expression) */
| R_VAR
/* prefixed expression */
| PREFIX R_VAR ==> $1:($2)
/* prefixed expression */
| PREFIX C_EXPR_PFX ==> $1:($2)
/* list item */
| XP_TERM '[' EXPR ']' ==> l_item($3, $1)
/* array/hash element */
| XP_TERM '' ==> a_elem($1, $3)
/* list tail */
| XP_TERM '[>]' ==> l_tail($1)
;
/* Qualifier: */
Q_PFX:
PREFIX
;
XP_NTERM: XP_TERM
| XP_TERM '.' XP_NTERM ==> with($1, $3)
| XP_TERM '!' XP_NTERM ==> apply($1, $3)
| Q_PFX '!!' /* "Qualified as": $4 in context $1 */
XP_NTERM
;
/* Expression: terminal (prefix) */
XP_PTERM: XP_NTERM
/* list head */
| '[<]' XP_PTERM ==> l_head($2)
;
/* Expression: unary postfix */
XP_POST:
XP_PTERM
/* (post increment/decrement) */
| XP_POST '++' ==> inc_p($1)
| XP_POST '--' ==> dec_p($1)
/* (string slice) */
| XP_POST '$' '[' EXPR ']' ==> s_slice($4, $1)
;
/* Expression: anonimous functor (lambda) definition */
F_LAMBDA: '!'
/* functor header & body */
F_DEF_HEAD '=' C_EXPR
;
/* Expression: unary prefix */
XP_PRE:
XP_POST
/* (pre increment/decrement) */
| '++' XP_PRE ==> inc($2)
| '--' XP_PRE ==> dec($2)
/* (absolute value) */
| '+' XP_PRE ==> abs($2)
/* (negation) */
| '-' XP_PRE ==> neg($2)
/* (bitwise complement) */
| '~' XP_PRE ==> not($2)
/* (sign) */
| '>' XP_PRE ==> sgn($2)
/* (string length) */
| '#' '$' XP_PRE ==> s_len($3)
/* (list length) */
| '#' XP_PRE ==> l_len($2)
/* (list reverse) */
| '[~]' XP_PRE ==> l_rev($2)
/* (devaluator) */
| '@' XP_PRE ==> deval($2)
/* (evaluator) */
| '^' XP_PRE ==> ^($2)
/* (prefix reference) */
| '!' PREFIX
/* (anonimous functor def) */
| F_LAMBDA
;
/* Expression: multiplicative */
XP_MUL:
XP_PRE
/* (multiplication) */
| XP_MUL '*' XP_PRE ==> mul($1, $3)
/* (division) */
| XP_MUL '/' XP_PRE ==> div($1, $3)
/* (integer division) */
| XP_MUL '%' XP_PRE ==> idiv($1, $3)
/* (integer remainder) */
| XP_MUL '%%' XP_PRE ==> irem($1, $3)
/* (bit shift left) */
| XP_MUL '<<' XP_PRE ==> shl($1, $3)
/* (bit shift right) */
| XP_MUL '>>' XP_PRE ==> shr($1, $3)
/* (string replication) */
| XP_MUL '*' '$' XP_PRE ==> s_rep($1, $4)
/* (list replication) */
| XP_MUL '[*]' XP_PRE ==> l_rep($3, $1)
/* (string search backward) */
| XP_MUL '<<' '$' XP_PRE ==> s_findlast($1, $4)
/* (string search forward) */
| XP_MUL '>>' '$' XP_PRE ==> s_findfirst($1, $4)
;
/* Expression: additive */
XP_ADD:
XP_MUL
/* (addition) */
| XP_ADD '+' XP_MUL ==> add($1, $3)
/* (subtraction) */
| XP_ADD '-' XP_MUL ==> sub($1, $3)
/* (string concatenation) */
| XP_ADD '+' '$' XP_MUL ==> s_cat($1, $4)
/* (list concatenation) */
| XP_ADD '[+]' XP_MUL ==> l_cat($1, $3)
;
/* Expression: maximum/minimum */
XP_MUM:
XP_ADD
/* (minimum) */
| XP_MUM '?<' XP_ADD ==> min($1, $3)
/* (maximum) */
| XP_MUM '?>' XP_ADD ==> max($1, $3)
/* (string minimum) */
| XP_MUM '?<' '$' XP_ADD ==> s_min($1, $4)
/* (string maximum) */
| XP_MUM '?>' '$' XP_ADD ==> s_max($1, $4)
;
/* Expression: comparative */
XP_CMP:
XP_MUM
/* (less than) */
| XP_MUM '<' XP_MUM ==> lt($1, $3)
/* (less than or equal) */
| XP_MUM '~>' XP_MUM ==> le($1, $3)
/* (greater than) */
| XP_MUM '>' XP_MUM ==> gt($1, $3)
/* (greater than or equal) */
| XP_MUM '~<' XP_MUM ==> ge($1, $3)
/* (equality) */
| XP_MUM '==' XP_MUM ==> eq($1, $3)
/* (inequality) */
| XP_MUM '~=' XP_MUM ==> ne($1, $3)
/* (compare) */
| XP_MUM '>' XP_MUM ==> cmp($1, $3)
/* (string less than) */
| XP_MUM '<' '$' XP_MUM ==> s_lt($1, $4)
/* (string less than or equal) */
| XP_MUM '~>' '$' XP_MUM ==> s_le($1, $4)
/* (string greater than) */
| XP_MUM '>' '$' XP_MUM ==> s_gt($1, $4)
/* (string greater than or equal) */
| XP_MUM '~<' '$' XP_MUM ==> s_ge($1, $4)
/* (string equality) */
| XP_MUM '==' '$' XP_MUM ==> s_eq($1, $4)
/* (string inequality) */
| XP_MUM '~=' '$' XP_MUM ==> s_ne($1, $4)
/* (string compare) */
| XP_MUM '>' '$' XP_MUM ==> s_cmp($1, $4)
;
/* Expression: logical/bitwise */
XP_BIT:
XP_CMP
/* (bitwise AND) */
| XP_BIT '&' XP_CMP ==> and($1, $3)
/* (bitwise OR) */
| XP_BIT '|' XP_CMP ==> or($1, $3)
/* (bitwise XOR) */
| XP_BIT '~' XP_CMP ==> xor($1, $3)
;
/* (optional bit expression */
O_XP_BIT:
| XP_BIT
;
/* Expression: conditional/iterative */
XP_CND:
XP_BIT
/* (range list) */
| O_XP_BIT '..' O_XP_BIT ==> ($1, $3)
/* (conditional AND clause) */
| XP_BIT '&&' XP_CND ==> c_and($1, $3)
/* (conditional OR clause) */
| XP_BIT '||' XP_CND ==> c_or($1, $3)
/* (conditional IF clause) */
| XP_BIT '?' XP_CND ':' ==> if($1, $3)
/* (conditional UNLESS clause) */
| XP_BIT '~' '?' XP_CND ':' ==> unless($1, $4)
/* (conditional IF clause) */
| XP_BIT '?' XP_CND ':' XP_CND ==> if($1, $3, $5)
/* (conditional UNLESS clause) */
| XP_BIT '~' '?' XP_CND ':' XP_CND ==> unless($1, $4, $6)
/* (loop WHILE clause / precondition) */
| XP_BIT '??' XP_CND ==> while($1, $3)
/* (loop WHILE clause / postcondition) */
| '??' C_EXPR XP_BIT ==> do_while($3, $2)
/* (loop UNTIL clause / precondition) */
| XP_BIT '~' '??' XP_CND ==> until($1, $4)
/* (loop UNTIL clause / postcondition) */
| '~' '??' C_EXPR XP_BIT ==> do_until($4, $3)
;
/* Unary ops (for combined assignment) */
OPC_UN:
'+' ==> !abs
| '-' ==> !neg
| '~' ==> !not
;
/* Binary ops (for combined assignment / reduction) */
OPC_BIN:
'+' ==> !add
| '-' ==> !sub
| '*' ==> !mul
| '/' ==> !div
| '%' ==> !idiv
| '%%' ==> !irem
| '?<' ==> !min
| '?>' ==> !max
| '<<' ==> !shl
| '>>' ==> !shr
| '&' ==> !and
| '|' ==> !or
| '~' ==> !xor
| '+' '$' ==> !s_cat
| '*' '$' ==> !s_rep
| '?<' '$' ==> !s_min
| '?>' '$' ==> !s_max
;
/* Expression: assignment/exchange */
XP_EXX:
XP_CND
| XP_PTERM '=' XP_EXX ==> set($1, $3)
| '=' XP_PTERM ':' XP_EXX ==> set_a($1, $3)
| XP_PTERM '=' ':' OPC_UN ==> comb ($4:($1))
| '=' XP_PTERM ':' OPC_UN ==> comb_a ($4:($2))
| XP_PTERM '=' OPC_BIN ':' XP_EXX ==> comb ($3:($1, $5)
| '=' XP_PTERM OPC_BIN ':' XP_EXX ==> comb_a ($3:($2, $5)
| '[=]' OPC_BIN XP_PTERM ==> reduce ($2:($3))
| XP_PTERM ':' '=' ':' XP_PTERM ==> swap($1, $5)
| XP_PTERM ':' '=' XP_EXX ==> let($1, $4)
| XP_PTERM ':>' XP_EXX ==> f_get($1, $3)
| XP_PTERM '<:' XP_EXX ==> f_put($1, $3)
| ':>' XP_PRE ==> f_get(, $2)
| '<:' XP_PRE ==> f_put(, $2)
| XP_PTERM '[<-]' XP_EXX ==> l_push($1, $3)
| XP_PTERM '[->]' XP_EXX ==> l_pop($1, $3)
;
/* Expression: root */
EXPR: XP_EXX
;
