Ako { Program = Stmt* // Statement Block = "{" Stmt* "}" Stmt = (Metadata | If | Assign | AssignTask | TaskDef | SkipTask | Task | ForLoop | Expr | comment) Assign = AssignLeft | AssignAdd | AssignIncr | AssignDecr | AssignSub AssignTask = Var "=" (SkipTask | Task) AssignLeft = Var "=" Expr AssignAdd = Var "+=" Expr AssignSub = Var "-=" Expr AssignIncr = Var "++" AssignDecr = Var "--" Metadata = "##" id Term TaskDef = "task" id (Array)? Block SkipTask = "@@" ListOf "(" NamedArguments ")" Task = "@" ListOf "(" NamedArguments ")" NamedArguments = ListOf<(KeyValue | Expr), ","> Arguments = ListOf // Expression Pipe = (Pipe | ExprItem) "|>" ExprItem Expr = Pipe | ExprItem ExprItem = LambdaInline | MathExpr Term = Fn | bool | Var | Number | String | Array | Dictionary | Last Fn = ListOf "(" Arguments ")" // Lambda = "(" ListOf ")" "=>" Block LambdaInline = "(" ListOf ")" "=>" Expr // Math MathExpr = BinExpr BinExpr = BinExpr "and" EqExpr -- and | BinExpr "or" EqExpr -- or | EqExpr EqExpr = EqExpr "==" AddExpr -- eq | EqExpr "!=" AddExpr -- neq | EqExpr "<" AddExpr -- lt | EqExpr "<=" AddExpr -- lte | EqExpr ">" AddExpr -- gt | EqExpr ">=" AddExpr -- gte | AddExpr AddExpr = AddExpr "+" MulExpr -- plus | AddExpr "-" MulExpr -- minus | MulExpr MulExpr = MulExpr "*" PriExpr -- times | MulExpr "/" PriExpr -- divide | MulExpr "%" PriExpr -- mod | PriExpr PriExpr = "(" Expr ")" -- paren | "-" PriExpr -- neg | "NOT" PriExpr -- not | Term "++" -- inc | Term "--" -- dec | Term // Conditionnal If = "if" Expr Block ("elif" Expr Block)* ("else" Block)? // Loop ForLoop = Foreach | While | Infinite | Continue | Return Foreach = "for" id ("," id)? "in" Expr Block While = "for" Expr Block Infinite = "for" Block Continue = "continue" Return = "return" (Expr)? // Identifier / Variable Last = "$" Var = Var "[" Expr "]" -- subscript | Var "[" Expr? ":" Expr? "]" -- range | Var "." id -- select | id -- single id = ~(keyword end) char char = letter (letter | digit | "_")* keyword = "$" | "task" | "for" | "false" | "true" | "or" | "and" | "not" | "if" | "elif" | "else" | "continue" | "return" // List Array = "[" ListOf "]" Dictionary = "{" ListOf "}" KeyValue = id "=" Expr // Boolean bool = "true" | "false" // String String = sqString | dqString | emptyString squote = "'" sqString = (squote (~squote any)+ squote) dquote = "\"" dqString = (dquote (~dquote any)+ dquote) emptyString = "\"\"" | "''" // Number Number (a number literal) = hex | float | int int = digit+ float = digit+ "." digit+ hex = "#" hexDigit+ // Other space := "\t" | " " | "\n" | "\r" comment = singlecomment | multilinecomment singlecomment = "//" (~"\n" any)* multilinecomment = "/*" (~"*/"any)* "*/" }