/** * Whitespace */  | 
 
   
<DEFAULT> SKIP : {
" "
| "\r"
| "\t"
| "\n"
| <SINGLE_LINE_COMMENT: "//" (~["\n","\r"])* ("\n" | "\r" | "\r\n")>
}
   
   | 
 
/** * Multiline comment. can contain other multi line comments. */  | 
 
   
<DEFAULT> TOKEN : {
<COMMENT_END: "*/">
}
   
   | 
 
   
<DEFAULT> SPECIAL : {
<COMMENT_START: "/*"> : {
}
   
   | 
 
/* OPERATORS & KEYWORDS*/  | 
 
   
<DEFAULT> TOKEN : {
<PLUS: "+">
| <INC: "++">
| <DEC: "--">
| <MINUS: "-">
| <MULTIPLY: "*">
| <DIVIDE: "/">
| <MOD: "%">
| <POW: "**">
| <AND: "&&" | "and">
| <CASE_INS: "case-insensitive">
| <MULTI_LINE: "multi-line">
| <SAND: "&">
| <OR: "||" | "or">
| <LIKE: "like">
| <PIPE: "|">
| <GT: ">">
| <LT: "<">
| <LE: "<=">
| <GE: ">=">
| <EQ: "==">
| <NEQ: "!=">
| <XOR: "^">
| <NOT: "!">
| <CONDITION: "?">
| <CLM: ":">
| <EQUAL: "=">
| <SCL: ";">
| <LPAREN: "(">
| <RPAREN: ")">
| <LBRACE: "{">
| <RBRACE: "}">
| <CLBRACKET: "?[">
| <LBRACKET: "[">
| <RBRACKET: "]">
| <COMMA: ",">
| <DOT: ".">
| <CDOT: "?.">
| <CONTEXT: "context">
| <RETURN: "return" | "ret">
| <MEMORY: "memory" | "mem">
| <SLEEP: "sleep">
| <THROW: "throw">
| <FOR: "for">
| <FUNCTION: "function" | "func">
| <DETERMINISTIC: "deterministic" | "det">
| <SYNC: "sync">
| <ASYNC: "async">
| <ARG: "arg">
| <TRUE: "true">
| <FALSE: "false">
| <NULL: "null" | "nill">
| <E: "E">
| <PI: "PI">
| <FIRST: "first">
| <IF: "if">
| <ELSE: "else">
| <SWAP: "<->" | "<=>">
| <USE: "use">
| <DECIMAL: "decimal" | "dec">
}
   
   | 
 
/** * Number and String constants */  | 
 
   
<DEFAULT> TOKEN : {
<INTEGER: <DECIMAL_LITERAL> (["l","L"])? | <HEX_LITERAL> (["l","L"])? | <OCTAL_LITERAL> (["l","L"])?>
| <#DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])*>
| <#HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+>
| <#OCTAL_LITERAL: "0" (["0"-"7"])*>
| <FLOATING_POINT: (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? (["f","F","d","D"])? | "." (["0"-"9"])+ (<EXPONENT>)? (["f","F","d","D"])? | (["0"-"9"])+ <EXPONENT> (["f","F","d","D"])? | (["0"-"9"])+ (<EXPONENT>)? ["f","F","d","D"]>
| <#EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+>
| <CHARACTER: "\'" (~["\'","\\","\n","\r"] | "\\" (["n","t","b","r","f","\\","\'","\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"])) "\'">
| <STRING: ("\"" | "\'") (~["\"","\\","\n","\r"] | "\\" (["n","t","b","r","f","\\","\'","\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"]))* ("\"" | "\'")>
| <MATCHEXP: "`" (~["`","\\","\n","\r"] | "\\" (["n","t","b","r","f","\\","`","\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"]))* "`">
}
   
   | 
 
/** * ZEL identifiers. */  | 
 
   
<DEFAULT> TOKEN : {
<ID: <LETTER> (<LETTER> | <DIGIT>)*>
| <#LETTER: ["$","A"-"Z","_","a"-"z","\u00c0"-"\u00d6","\u00d8"-"\u00f6","\u00f8"-"\u00ff","\u0100"-"\u1fff","\u3040"-"\u318f","\u3300"-"\u337f","\u3400"-"\u3d2d","\u4e00"-"\u9fff","\uf900"-"\ufaff"]>
| <#DIGIT: ["0"-"9","\u0660"-"\u0669","\u06f0"-"\u06f9","\u0966"-"\u096f","\u09e6"-"\u09ef","\u0a66"-"\u0a6f","\u0ae6"-"\u0aef","\u0b66"-"\u0b6f","\u0be7"-"\u0bef","\u0c66"-"\u0c6f","\u0ce6"-"\u0cef","\u0d66"-"\u0d6f","\u0e50"-"\u0e59","\u0ed0"-"\u0ed9","\u1040"-"\u1049"]>
}
   
   | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| 
    | 
 
| mainprogram | ::= | program <EOF> | 
| program | ::= | ( ( ( programBlockStatic ) | ( statement ) ) ( ( <SCL> ( programBlockStatic | statement ) ) | programBlockStatic )* )? | 
| statement | ::= | operations | 
| | | expression | |
| | | zreturn | |
| | | forStmt | |
| | | ifStmt | |
| | | ( <SLEEP> expression ) | |
| | | ( <THROW> expression ) | |
| | | ( <SYNC> expression ) | |
| | | ( <USE> <DECIMAL> <INTEGER> ) | |
/**
 * The ZEL for statement, (similar with for from GO):
 *   for i = 0, result = 0; i < breakup; i = i + 1 {
 *    result = result + part[i] 
 *   };
 */
   | 
 ||
| forStmt | ::= | <FOR> ( ( operations ( <COMMA> operations )* ) <SCL> )? logical ( <SCL> ( operations ( <COMMA> operations )* ) )? programBlockStatic | 
/**
 * The IF statment. (Similar as in GO):
 *     if v > ma {
 *        ma = v
 *     } else if v < mi {
 *        mi = v
 *     }
 */
   | 
 ||
| ifStmt | ::= | ( <IF> logical ( programBlockStatic | statement ) ) ( <ELSE> ( programBlockStatic | statement ) )? | 
| programBlockStatic | ::= | programBlock | 
/**
 * A zel program block:
 * {
 *  .....
 * }
 */
   | 
 ||
| programBlock | ::= | <LBRACE> program <RBRACE> | 
| zreturn | ::= | <RETURN> ( expression )? | 
/**
 * The ZEL operations:
 *
 * Assignements: x, y, z = {1, 2, 3}; f(x) = 4;
 * Increment: x++
 * Decrement: x--
 * Swap: x <-> y
 *
 */
   | 
 ||
| operations | ::= | assignement | 
| | | swap | |
| | | ( assignableExpression ( <INC> | <DEC> ) ) | |
| assignement | ::= | assignableExpression ( <COMMA> assignableExpression )* ( <EQUAL> expression ) | 
| swap | ::= | assignableExpression <SWAP> assignableExpression | 
| assignableExpression | ::= | ( <ID> ) ( ( params ) | ( ( ( <DOT> <ID> ) | ( <LBRACKET> expression <RBRACKET> ) ) ) )* | 
| expression | ::= | ternary | 
/** * The ternary operator: * a < 0 ? 1 : 2 */  | 
 ||
| ternary | ::= | logical ( ( <CONDITION> ) ternary <CLM> ternary )? | 
/** * Logical operators: AND OR XOR */  | 
 ||
| logical | ::= | compare ( ( <AND> | <OR> | <XOR> ) compare )* | 
/** * Commparison operatiors: < > <= >= == != */  | 
 ||
| compare | ::= | sum ( ( ( <GT> | <LT> | <GE> | <LE> | <EQ> | <NEQ> ) sum ) | ( ( <CASE_INS> )? ( <MULTI_LINE> )? <LIKE> <STRING> ) )* | 
/** * + - operators. */  | 
 ||
| sum | ::= | term ( ( <PLUS> | <MINUS> ) term )* | 
/** * * / % operators */  | 
 ||
| term | ::= | exponent ( ( <MULTIPLY> | <DIVIDE> | <MOD> ) exponent )* | 
/** * the exponent operator: ^ */  | 
 ||
| exponent | ::= | unaryPost ( <POW> unaryPost )* | 
/** * Method invocation + dereferencing. */  | 
 ||
| unaryPost | ::= | unary ( ( params ( <SAND> )? ) | ( <DOT> <ID> ) | ( <CDOT> <ID> ) | ( <LBRACKET> expression <RBRACKET> ) | ( <CLBRACKET> expression <RBRACKET> ) )* | 
| unary | ::= | ( ( <MINUS> | <NOT> ) element ) | 
| | | element | |
| element | ::= | ( constant | ( <ID> ) | sysFunction | ( <FIRST> params ) | <LPAREN> expression <RPAREN> | ( <LBRACE> ( expression ( <COMMA> expression )* )? <RBRACE> ) | ( <PIPE> expression <PIPE> ) ) | 
| params | ::= | <LPAREN> ( expression ( <COMMA> expression )* )? <RPAREN> | 
| constant | ::= | ( <FLOATING_POINT> | <INTEGER> | <TRUE> | <FALSE> | <CHARACTER> | <NULL> | <STRING> | <MATCHEXP> ) | 
| | | <E> | |
| | | <PI> | |
| | | <MEMORY> | |
| parseInteger | ::= | java code | 
| sysFunction | ::= | ( <FUNCTION> ( <DETERMINISTIC> )? ( ( <SYNC> ) | ( <ASYNC> ) )? ( <ID> )? ( <LPAREN> ( <ID> ( <COMMA> <ID> )* ) <RPAREN> )? ) ( <EQUAL> )? programBlock |