106 lines
3.1 KiB
Text
106 lines
3.1 KiB
Text
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<identifier, ","> LambdaParams? Block
|
|
ExprStmt = Expr // necessary?
|
|
|
|
Block = "{" Statement* "}"
|
|
LambdaParams = "|" ListOf<identifier, ","> "|"
|
|
|
|
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<Expr, ","> ")")?
|
|
MemberExpr = Literal ("." identifier)*
|
|
|
|
FunctionExpr = "fn" identifier "(" ListOf<identifier, ",">* ")" 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)*
|
|
}
|