ohm-grammar-solace/stwl.ohm
Norman Köhring ad3d1268a0 initial
2025-06-09 21:50:12 +02:00

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)*
}