{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "urn:endor:ast:sha256:ad2ac52943dd26e08395c0d2698861da98bb89c360241c4712c769de86709fd0", "$ref": "#/$defs/AstDocument", "$defs": { "Span": { "type": "object", "properties": { "start": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "end": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } }, "required": [ "start", "end" ], "additionalProperties": false }, "AstDocument": { "type": "object", "properties": { "schema": { "const": "urn:endor:ast:sha256:ad2ac52943dd26e08395c0d2698861da98bb89c360241c4712c769de86709fd0" }, "root": { "$ref": "#/$defs/AstRoot" } }, "required": [ "schema", "root" ], "additionalProperties": false }, "AstRoot": { "oneOf": [ { "type": "object", "properties": { "kind": { "const": "Module" }, "data": { "$ref": "#/$defs/Program" } }, "required": [ "kind", "data" ], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "const": "Expression" }, "data": { "$ref": "#/$defs/Expr" } }, "required": [ "kind", "data" ], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "const": "Interactive" }, "data": { "$ref": "#/$defs/InteractiveInput" } }, "required": [ "kind", "data" ], "additionalProperties": false } ] }, "Name": { "type": "object", "properties": { "text": { "type": "string" }, "span": { "$ref": "#/$defs/Span" } }, "required": [ "text", "span" ], "additionalProperties": false }, "Program": { "type": "object", "properties": { "declarations": { "type": "array", "items": { "$ref": "#/$defs/Decl" } }, "span": { "$ref": "#/$defs/Span" } }, "required": [ "declarations", "span" ], "additionalProperties": false }, "Decl": { "type": "object", "properties": { "kind": { "$ref": "#/$defs/DeclKind" }, "span": { "$ref": "#/$defs/Span" } }, "required": [ "kind", "span" ], "additionalProperties": false }, "DeclKind": { "oneOf": [ { "type": "object", "properties": { "kind": { "const": "Function" }, "data": { "$ref": "#/$defs/Function" } }, "required": [ "kind", "data" ], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "const": "Class" }, "data": { "$ref": "#/$defs/Class" } }, "required": [ "kind", "data" ], "additionalProperties": false } ] }, "Class": { "type": "object", "properties": { "name": { "$ref": "#/$defs/Name" }, "base": { "anyOf": [ { "$ref": "#/$defs/Name" }, { "type": "null" } ] }, "fields": { "type": "array", "items": { "$ref": "#/$defs/Parameter" } }, "methods": { "type": "array", "items": { "$ref": "#/$defs/Function" } }, "span": { "$ref": "#/$defs/Span" } }, "required": [ "name", "fields", "methods", "span" ], "additionalProperties": false }, "Function": { "type": "object", "properties": { "name": { "$ref": "#/$defs/Name" }, "parameters": { "type": "array", "items": { "$ref": "#/$defs/Parameter" } }, "return_type": { "$ref": "#/$defs/Name" }, "body": { "$ref": "#/$defs/Block" }, "span": { "$ref": "#/$defs/Span" } }, "required": [ "name", "parameters", "return_type", "body", "span" ], "additionalProperties": false }, "Parameter": { "type": "object", "properties": { "name": { "$ref": "#/$defs/Name" }, "type_name": { "$ref": "#/$defs/Name" }, "span": { "$ref": "#/$defs/Span" } }, "required": [ "name", "type_name", "span" ], "additionalProperties": false }, "Block": { "type": "object", "properties": { "statements": { "type": "array", "items": { "$ref": "#/$defs/Stmt" } }, "span": { "$ref": "#/$defs/Span" } }, "required": [ "statements", "span" ], "additionalProperties": false }, "Stmt": { "type": "object", "properties": { "kind": { "$ref": "#/$defs/StmtKind" }, "span": { "$ref": "#/$defs/Span" } }, "required": [ "kind", "span" ], "additionalProperties": false }, "StmtKind": { "oneOf": [ { "type": "object", "properties": { "kind": { "const": "Binding" }, "data": { "$ref": "#/$defs/Binding" } }, "required": [ "kind", "data" ], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "const": "Assignment" }, "data": { "$ref": "#/$defs/Assignment" } }, "required": [ "kind", "data" ], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "const": "MemberAssignment" }, "data": { "$ref": "#/$defs/MemberAssignment" } }, "required": [ "kind", "data" ], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "const": "Return" }, "data": { "$ref": "#/$defs/ReturnStatement" } }, "required": [ "kind", "data" ], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "const": "Expression" }, "data": { "$ref": "#/$defs/Expr" } }, "required": [ "kind", "data" ], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "const": "Declaration" }, "data": { "$ref": "#/$defs/Decl" } }, "required": [ "kind", "data" ], "additionalProperties": false } ] }, "Binding": { "type": "object", "properties": { "name": { "$ref": "#/$defs/Name" }, "value": { "$ref": "#/$defs/Expr" }, "span": { "$ref": "#/$defs/Span" } }, "required": [ "name", "value", "span" ], "additionalProperties": false }, "Assignment": { "type": "object", "properties": { "name": { "$ref": "#/$defs/Name" }, "value": { "$ref": "#/$defs/Expr" }, "span": { "$ref": "#/$defs/Span" } }, "required": [ "name", "value", "span" ], "additionalProperties": false }, "MemberAssignment": { "type": "object", "properties": { "object": { "$ref": "#/$defs/Expr" }, "name": { "$ref": "#/$defs/Name" }, "value": { "$ref": "#/$defs/Expr" }, "span": { "$ref": "#/$defs/Span" } }, "required": [ "object", "name", "value", "span" ], "additionalProperties": false }, "ReturnStatement": { "type": "object", "properties": { "value": { "anyOf": [ { "$ref": "#/$defs/Expr" }, { "type": "null" } ] }, "span": { "$ref": "#/$defs/Span" } }, "required": [ "span" ], "additionalProperties": false }, "InteractiveInput": { "type": "object", "properties": { "statements": { "type": "array", "items": { "$ref": "#/$defs/Stmt" } }, "span": { "$ref": "#/$defs/Span" } }, "required": [ "statements", "span" ], "additionalProperties": false }, "Expr": { "type": "object", "properties": { "kind": { "$ref": "#/$defs/ExprKind" }, "span": { "$ref": "#/$defs/Span" } }, "required": [ "kind", "span" ], "additionalProperties": false }, "ExprKind": { "oneOf": [ { "type": "object", "properties": { "kind": { "const": "Name" }, "data": { "type": "string" } }, "required": [ "kind", "data" ], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "const": "Number" }, "data": { "type": "string" } }, "required": [ "kind", "data" ], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "const": "String" }, "data": { "type": "string" } }, "required": [ "kind", "data" ], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "const": "Symbol" }, "data": { "$ref": "#/$defs/Name" } }, "required": [ "kind", "data" ], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "const": "Unary" }, "data": { "type": "object", "properties": { "operation": { "$ref": "#/$defs/UnaryOp" }, "operand": { "$ref": "#/$defs/Expr" } }, "required": [ "operation", "operand" ], "additionalProperties": false } }, "required": [ "kind", "data" ], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "const": "Binary" }, "data": { "type": "object", "properties": { "operation": { "$ref": "#/$defs/BinaryOp" }, "left": { "$ref": "#/$defs/Expr" }, "right": { "$ref": "#/$defs/Expr" } }, "required": [ "operation", "left", "right" ], "additionalProperties": false } }, "required": [ "kind", "data" ], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "const": "Member" }, "data": { "type": "object", "properties": { "object": { "$ref": "#/$defs/Expr" }, "name": { "$ref": "#/$defs/Name" } }, "required": [ "object", "name" ], "additionalProperties": false } }, "required": [ "kind", "data" ], "additionalProperties": false }, { "type": "object", "properties": { "kind": { "const": "Call" }, "data": { "type": "object", "properties": { "callee": { "$ref": "#/$defs/Expr" }, "arguments": { "type": "array", "items": { "$ref": "#/$defs/Expr" } } }, "required": [ "callee", "arguments" ], "additionalProperties": false } }, "required": [ "kind", "data" ], "additionalProperties": false } ] }, "UnaryOp": { "enum": [ "Negate" ] }, "BinaryOp": { "enum": [ "Add", "Subtract", "Multiply", "Divide" ] } } }