Files
boring-lang/packages/boringlang/src/parse/grammar.ts

77 lines
4.1 KiB
TypeScript
Raw Normal View History

2025-08-18 22:53:36 -06:00
import * as ohm from "ohm-js";
export const boringGrammar = ohm.grammar(String.raw`
Boringlang {
2026-01-20 17:47:36 -07:00
GenericUsage = "[" ListOf<TypeUsage, ","> "]"
GenericParameter = identifier ":" ListOf<TypeUsage, "+"> -- conditions
| identifier
GenericDeclaration = "[" ListOf<GenericParameter, ","> "]"
2025-08-18 22:53:36 -06:00
ReturnStatement = "return" Expression ";"
2025-08-19 21:54:06 -06:00
LetStatement = "let" identifier (":" TypeUsage)? "=" Expression ";"
2025-10-09 17:40:54 -06:00
AssignmentStatement = identifier "=" Expression ";" -- identifier
| StructGetter "=" Expression ";" -- getter
2025-08-18 22:53:36 -06:00
ExpressionStatement = Expression ";"
Statement = ExpressionStatement
| LetStatement
| ReturnStatement
| AssignmentStatement
LiteralInt = digit+
LiteralFloat = digit* "." digit+
LiteralBool = "true" | "false"
LiteralString = "\"" (~"\"" any)* "\""
| "'" (~"'" any)* "'"
2025-08-19 21:54:06 -06:00
LiteralStructField = identifier ":" Expression
2026-01-20 17:47:36 -07:00
LiteralStruct = identifier (GenericUsage)? "{" ListOf<LiteralStructField, ","> "}"
2025-08-19 21:54:06 -06:00
identifier = (letter | "_")+(letter | digit | "_")*
StructGetter = Expression "." identifier
2025-08-18 22:53:36 -06:00
IfExpression = "if" "(" Expression ")" Block ("else" Block)?
2026-01-20 17:47:36 -07:00
Path = Path "::" identifier (GenericUsage)? -- nested
| identifier (GenericUsage)? -- base
2025-10-09 17:40:54 -06:00
PrimaryExpression = LiteralInt
2025-08-18 22:53:36 -06:00
| LiteralFloat
| LiteralBool
| LiteralString
2025-10-09 17:40:54 -06:00
| Path -- path
2025-08-18 22:53:36 -06:00
| "(" Expression ")" -- parens
2025-10-09 17:40:54 -06:00
StructExpression = LiteralStruct
| Block
| IfExpression
| PrimaryExpression
2026-01-20 17:47:36 -07:00
MemberExpression = MemberExpression "." identifier (GenericUsage)? -- structGetter
2025-10-09 17:40:54 -06:00
| StructExpression
2026-01-20 17:47:36 -07:00
CallExpression = CallExpression "." identifier (GenericUsage)? -- structGetter
2025-10-09 17:40:54 -06:00
| CallExpression "(" ListOf<Expression, ","> ")" -- functionCall
| MemberExpression "(" ListOf<Expression, ","> ")" -- memberFunctionCall
| MemberExpression
MultExpression = MultExpression "*" CallExpression -- mult
| MultExpression "/" CallExpression -- div
| CallExpression
AddExpression = Expression "+" MultExpression -- plus
| Expression "-" MultExpression -- minus
| MultExpression
Expression = AddExpression
2025-08-18 22:53:36 -06:00
Block = "{" Statement* Expression? "}"
2026-01-20 17:47:36 -07:00
NamedTypeUsage = identifier (GenericUsage)?
2025-08-18 22:53:36 -06:00
TypeUsage = NamedTypeUsage
| "fn" "(" ListOf<TypeUsage, ","> ")" ":" TypeUsage -- function_tu
2025-08-19 21:54:06 -06:00
FunctionArgument = identifier ":" TypeUsage
2026-01-20 17:47:36 -07:00
FunctionDeclaration = "fn" identifier (GenericDeclaration)? "(" ListOf<FunctionArgument, ","> ")" ":" TypeUsage
2025-08-18 22:53:36 -06:00
Function = FunctionDeclaration Block
2025-08-19 21:54:06 -06:00
StructTypeField = identifier ":" TypeUsage
2026-01-20 17:47:36 -07:00
StructTypeDeclaration = "type" identifier (GenericDeclaration)? "struct" "{" ListOf<StructTypeField, ","> "}"
2025-08-18 22:53:36 -06:00
TraitMethod = FunctionDeclaration ";"
2026-01-20 17:47:36 -07:00
TraitTypeDeclaration = "type" identifier (GenericDeclaration)? "trait" "{" TraitMethod* "}"
2025-08-18 22:53:36 -06:00
TypeDeclaration = StructTypeDeclaration
| TraitTypeDeclaration
2026-01-20 17:47:36 -07:00
Impl = "impl" (GenericDeclaration)? (NamedTypeUsage "for")? NamedTypeUsage "{" Function* "}"
2025-08-18 22:53:36 -06:00
ModuleItem = Function
| TypeDeclaration
| Impl
Module = ModuleItem*
lineTerminator = "\n" | "\r" | "\u2028" | "\u2029"
comment = "//" (~lineTerminator any)* lineTerminator
space += comment
}
`);