Files
endorphin-aster-vm/crates/frontend/Endor.asdl
T

46 lines
2.0 KiB
Plaintext

-- Endor AST schema. Source syntax belongs to lexer.peg and grammar.peg.
-- Wire contract: endor-ast-json/1, kind/data tagged sums and UTF-8 byte spans.
-- Builtins: string (owned text), span (UTF-8 byte range), schema_id (wire ID).
-- * is a sequence; ? is optional. Recursion is boxed by the Rust generator.
module Endor {
AstDocument = (schema_id schema, AstRoot root)
AstRoot = Module(Program body)
| Expression(Expr body)
| Interactive(InteractiveInput body)
Name = (string text, span span)
Program = (Decl* declarations, span span)
Decl = (DeclKind kind, span span)
DeclKind = Function(Function definition)
| Class(Class definition)
Class = (Name name, Name? base, Parameter* fields, Function* methods, span span)
Function = (Name name, Parameter* parameters, Name return_type, Block body, span span)
Parameter = (Name name, Name type_name, span span)
Block = (Stmt* statements, span span)
Stmt = (StmtKind kind, span span)
StmtKind = Binding(Binding binding)
| Assignment(Assignment assignment)
| MemberAssignment(MemberAssignment assignment)
| Return(ReturnStatement statement)
| Expression(Expr expression)
| Declaration(Decl declaration)
Binding = (Name name, Expr value, span span)
Assignment = (Name name, Expr value, span span)
MemberAssignment = (Expr object, Name name, Expr value, span span)
ReturnStatement = (Expr? value, span span)
InteractiveInput = (Stmt* statements, span span)
Expr = (ExprKind kind, span span)
ExprKind = Name(string text)
| Number(string spelling)
| String(string value)
| Symbol(Name name)
| Await(Expr operand)
| Unary(UnaryOp operation, Expr operand)
| Binary(BinaryOp operation, Expr left, Expr right)
| Member(Expr object, Name name)
| Call(Expr callee, Expr* arguments)
UnaryOp = Negate
BinaryOp = Add | Subtract | Multiply | Divide
}