50 lines
2.3 KiB
Plaintext
50 lines
2.3 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)
|
|
| If(IfStatement statement)
|
|
| While(WhileStatement statement)
|
|
| 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)
|
|
IfStatement = (Expr condition, Block body, Block? otherwise, span span)
|
|
WhileStatement = (Expr condition, Block body, 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 | Equal | NotEqual | Less | LessEqual | Greater | GreaterEqual
|
|
}
|