StronglyTypedWebLanguage { Program = Statement* Statement = ConstDec | VarDec | LiveDec | ComputedDec | TrackStmt | ExprStmt | Block ConstDec = "const" identifier "=" Expr VarDec = "var" identifier "=" Expr LiveDec = "live" identifier "=" Expr ComputedDec = "computed" identifier Block TrackStmt = "track" ListOf LambdaParams? Block ExprStmt = Expr // necessary? Block = "{" Statement* "}" LambdaParams = "|" ListOf "|" ParExpr = "(" Expr ")" Expr = AssignExpr AssignExpr = CompareExpr ("=" CompareExpr)? CompareExpr = AddExpr (CompareOp AddExpr)? CompareOp = "==" | "!=" | "<=" | ">=" | "<" | ">" AddExpr = MulExpr (("+"|"-") MulExpr)* MulExpr = UnaryExpr (("*"|"/"|"%") UnaryExpr)* UnaryExpr = "void" UnaryExpr -- voidExp | "++" UnaryExpr -- preIncrement | "--" UnaryExpr -- preDecrement | "+" UnaryExpr -- unaryPlus | "-" UnaryExpr -- unaryMinus | "~" UnaryExpr -- bnot | "!" UnaryExpr -- lnot | PostfixExpr | FunctionExpr PostfixExpr = CallExpr "++" -- postIncrement | CallExpr "--" -- postDecrement | CallExpr CallExpr = MemberExpr ("(" ListOf ")")? MemberExpr = Literal ("." identifier)* FunctionExpr = "fn" identifier "(" ListOf* ")" Block Literal = numberLiteral | stringLiteral | booleanLiteral | nullLiteral | identifier | ParExpr | Block // 123 or 12.34 numberLiteral = digit+ ("." digit+)? stringLiteral = "\"" (~"\"" any)* "\"" | "'" (~"'" any)* "'" | "`" (~"`" any)* "`" identifier = ~reservedWord identifierStart (letter | digit | "$" | "_")* identifierStart = letter | "$" | "_" reservedWord = keyword | futureReservedWord | nullLiteral | booleanLiteral nullLiteral = "null" booleanLiteral = "true" | "false" keyword = "const" | "var" | "live" | "computed" | "track" | "when" | "while" | "if" | "else" | "for" | "unreachable" | "catch" | "async" | "await" | "interface" | "struct" | "private" | "public" | "defer" | "fn" | "break" | "void" | "return" | "import" | "export" | "switch" | "continue" futureReservedWord = "new" | "class" | "enum" | "extends" | "super" | "implements" | "yield" sourceCharacter = any // Override Ohm's built-in definition of space. space := whitespace | lineTerminator | comment whitespace = "\t" | "\x0B" -- verticalTab | "\x0C" -- formFeed | " " | "\u00A0" -- noBreakSpace | "\uFEFF" -- byteOrderMark | unicodeSpaceSeparator unicodeSpaceSeparator = "\u2000".."\u200B" | "\u3000" lineTerminator = "\n" | "\r" | "\u2028" | "\u2029" lineTerminatorSequence = "\n" | "\r" ~"\n" | "\u2028" | "\u2029" | "\r\n" comment = multiLineComment | singleLineComment multiLineComment = "/*" (~"*/" sourceCharacter)* "*/" singleLineComment = "//" (~lineTerminator sourceCharacter)* }