Symbols Used (adapted from Amber syntax page - http://xamber.org/syntax.html) [] Optional construct with zero or one occurrences {} Repeated construct with zero or more occurrences {}+ Repeated construct with one or more occurrences | alternative constructs () grouping SPTL GRAMMAR BASIC ELEMENTS program = elementblock elementblock = {simpleelement}+ simpleelement = statement | vardec | functiondef STATEMENTS statement = assignstatement | breakstatement | callstatement | closestatement | foreachstatement | forstatement | ifstatement | openstatement | popstatement | predecstatement | preincstatement | printstatement | pushstatement | readstatement | repeatstatement | shiftstatement | whilestatement assignstatement = varname ( simpleassign | addassign | divassign | multassign | postdec | postinc| subassign ) ';' breakstatement = 'break' ';' callstatement = funcname [ '(' list ')' ] ';' closestatement = 'close' filehandle ';' foreachstatement = 'foreach' scalarname '(' arrayname ')' '{' elementblock '}' forstatement = 'for' '(' statement ';' expr ';' statement ';' ')' '{' elementblock '}' ifstatement = 'if' '(' expr ')' '{' elementblock '}' openstatement = 'open' varname ';' popstatement = 'pop' arrayname ';' predecstatement = '--' varname ';' preincstatement = '++' varname ';' printstatement = 'print' [ filehandle ] concat ';' pushstatement = 'push' arrayname ',' list ';' shiftstatement = 'shift' arrayname ';' readstatement = 'read' filehandle ';' repeatstatement = 'repeat' '{' elementblock '}' 'until' '(' expr ')' ';' whilestatement = 'while' '(' expr ') '{' elementblock '}' simpleassign = '=' expr addassign = '+=' expr divassign = '/=' expr multassign = '*=' expr postdec = '--' postinc = '++' subassign = '-=' expr NAMES vardec = 'new' ( scalardec | arraydec ) ';' varname = scalarname | arrayname scalardec = scalarname [ '=' expr ] scalarname = '$' { '_' | letter | digit }+ { '[' expr ']' } arraydec = arrayname [ '=' '(' exprarray ')' ] arrayname = '@' { '_' | letter | digit }+ { '[' expr ']' } functiondef = 'function' funcname '{' elementblock 'return' expr '}' funcname = '&' { '_' | letter | digit }+ filehandle = '^' { '_' | letter | digit }+ EXPRESSIONS expr = boolexpr { boolop boolexpr } exprarray = expr { ',' expr } boolexpr = relexpr [ relop relexpr ] boolop = '&&' | '||' relexpr = [ '-' ] term { addop term } relop = '<' | '>' | '==' | '<=' | '>=' | '!=' term = factor { multop factor } addop = '+' | '-' factor = constant | varname | funcname | '(' expr ')' | negate multop = '*' | '/' | '%' negate = '!' factor constant = boolconstant | numconstant | stringconstant boolconstant = 'true' | 'false' numconstant = digit {digit} stringconstant = plainstring | escapestring concat = expr { '.' expr } plainstring = ''' text ''' escapestring = '"' text '"' list = expr { ',' expr }