# $schema: ./ast.schema.yaml # Top-level constructs CompilationUnit: children: - parent_mod - use_statements: rule: UseStatement vec: true - module_level_declarations: rule: ModuleLevelDeclaration vec: true ParentMod: children: - mod_kw: rule: Mod skip: true - fqn: rule: FullyQualifiedName UseStatement: children: - use_kw: rule: Use skip: true - prefixes: rule: UseStatementPrefix vec: true - suffix: rule: UseStatementSuffix UseStatementPrefix: children: - identifier UseStatementSuffix: rules: - Identifier - rule: Star build: UseStatementStarSuffix - UseList UseList: children: - identifiers: rule: Identifier vec: true # Level declarations ModuleLevelDeclaration: rules: - Module - Interface - Class - Function - PlatformFunction InterfaceLevelDeclaration: rules: - CompanionModule - Interface - Class - InterfaceFunction - InterfaceDefaultFunction - InterfaceOperatorFunction - InterfaceDefaultOperatorFunction ClassLevelDeclaration: children: - CompanionModule - Interface - Class - Function - OperatorFunction - PlatformFunction # Main organizational constructs Module: children: - is_public: rule: Pub build: type: boolean on: rule_present - mod_kw: rule: Mod skip: true - identifier: rule: Identifier - declarations: rule: ModuleLevelDeclaration vec: true - end_kw: rule: End skip: true CompanionModule: children: - companion_kw: rule: Companion skip: true - mod_kw: rule: Mod skip: true - declarations: rule: ModuleLevelDeclaration vec: true - end_kw: rule: End skip: true Interface: children: - is_public: rule: Pub build: type: boolean on: rule_present - int_kw: rule: IntKw skip: true - identifier - generic_parameters: build: or_else_default: true - implements_list: build: or_else_default: true - declarations: rule: InterfaceLevelDeclaration vec: true - end_kw: rule: End skip: true Class: children: - is_public: rule: Pub build: type: boolean on: rule_present - class_kw: rule: ClassKw skip: true - identifier - generic_parameters: build: or_else_default: true - class_constructor: build: or_else_default: true - implements_list: build: or_else_default: true - class_level_declarations: rule: ClassLevelDeclaration vec: true # Function constructs Function: children: - is_public: rule: Pub build: type: boolean on: rule_present - fn_kw: rule: Fn skip: true - generics: rule: GenericParameters - identifier - parameters - return_type: build: or_else: void - function_body OperatorFunction: children: - is_public: rule: Pub build: type: boolean on: rule_present - op_kw: rule: Op skip: true - generics: rule: GenericParameters build: or_else_default: true - operator - parameters - return_type: build: or_else: void - function_body PlatformFunction: children: - is_public: rule: Pub build: type: boolean on: rule_present - platform_kw: rule: Platform skip: true - fn_kw: rule: Fn skip: true - generics: rule: GenericParameters build: or_else_default: true - identifier - parameters - return_type InterfaceFunction: children: - fn_kw: rule: Fn skip: true - generics: rule: GenericParameters build: or_else_default: true - identifier - parameters - return_type InterfaceDefaultFunction: children: - def_kw: rule: Def skip: true - fn_kw: rule: Fn skip: true - generics: rule: GenericParameters build: or_else_default: true - identifier - parameters - return_type: build: or_else: void - function_body InterfaceOperatorFunction: children: - op_kw: rule: Op skip: true - generics: rule: GenericParameters build: or_else_default: true - operator - parameters - return_type InterfaceDefaultOperatorFunction: children: - def_kw: rule: Def skip: true - op_kw: rule: Op skip: true - generics: rule: GenericParameters build: or_else_default: true - operator - parameters - return_type: build: or_else: void - function_body # Function Bodies FunctionBody: rules: - FunctionAliasBody - FunctionEqualsBody - FunctionBlockBody FunctionEqualsBody: children: - expression FunctionAliasBody: children: - alias_kw: rule: Alias skip: true - identifier FunctionBlockBody: children: - statements: rule: Statement vec: true - end_kw: rule: End skip: true # Class constructs ClassConstructor: children: - members: rule: Member vec: true Member: children: - is_public: rule: Pub build: type: boolean on: rule_present - is_mut: rule: Mut build: type: boolean on: rule_present - identifier - type_use # Statements Statement: rules: - VariableDeclaration - AssignmentStatement - ExpressionStatement - UseStatement - IfElseStatement - IfStatementStatement - WhileStatement - ForStatement VariableDeclaration: children: - let_kw: rule: Let skip: true - is_mut: rule: Mut build: type: boolean on: rule_present - identifier - type_use: optional: true - expression: optional: true AssignmentStatement: children: - left: rule: Expression - right: rule: Expression ExpressionStatement: children: - expression IfStatement: children: - if_clause - if_else_ifs: rule: IfElseIf vec: true - if_else - end_kw: rule: End skip: true IfClause: children: - if_kw: rule: If skip: true - expression - then_kw: rule: Then skip: true - statements: rule: Statement vec: true IfElseIf: children: - else_kw: rule: Else skip: true - if_clause IfElse: children: - else_kw: rule: Else skip: true - statements: rule: Statement vec: true WhileStatement: children: - while_kw: rule: While skip: true - expression - do_kw: rule: Do skip: true - statements: rule: Statement vec: true - end_kw: rule: End skip: true ForStatement: children: - for_kw: rule: For skip: true - identifier - in_kw: rule: In skip: true - expression - do_kw: rule: Do skip: true - statement: rule: Statement vec: true - end_kw: rule: End vec: true # Expressions Expression: children: - ternary_expression TernaryExpression: children: - or_expression - ternary_alternatives: optional: true TernaryAlternatives: children: - ternary_true_alternative - ternary_false_alternative TernaryTrueAlternative: children: - expression TernaryFalseAlternative: children: - expression OrExpression: children: - left: rule: AndExpression - or_sym: rule: Or skip: true - right: rule: Expression optional: true AndExpression: children: - left: rule: ComparisonExpression - and_sym: rule: And skip: true - right: rule: Expression optional: true ComparisonExpression: children: - left: rule: ShiftExpression - operator: rule: ComparisonOperator optional: true - right: rule: Expression optional: true ComparisonOperator: rules: - Greater - Less - GreaterEqual - LessEqual - EqualTo - NotEqualTo ShiftExpression: children: - left: rule: AdditiveExpression - operator: rule: ShiftOperator optional: true - right: rule: Expression ShiftOperator: rules: - LeftShift - RightShift AdditiveExpression: children: - left: rule: MultiplicativeExpression - operator: rule: AdditiveOperator optional: true - right: rule: Expression optional: true MultiplicativeExpression: children: - left: rule: PrefixExpression - operator: rule: MultiplicativeOperator optional: true - right: rule: Expression MultiplicativeOperator: type: leaf_enum rules: - Multiply - Divide - Modulo PrefixExpression: children: - operators: rule: PrefixOperator vec: true PrefixOperator: type: leaf_enum rules: - Spread - Not - Negative SuffixExpression: children: - left: rule: PrimaryExpression - operators: rule: SuffixOperator vec: true SuffixOperator: type: leaf_enum rules: - PlusPlus - MinusMinus - ObjectProperty: child: true - ObjectIndex: child: true - Call: child: true ObjectProperty: children: - identifier ObjectIndex: children: - expression PrimaryExpression: rules: - Literal - FullyQualifiedName - Closure - ParenthesizedExpression ParenthesizedExpression: children: - expression # Calls Call: rules: - ParenthesesCall - NonParenthesesCall ParenthesesCall: children: - turbo_fish: optional: true - expression_list: optional: true - closure: optional: true NonParenthesesCall: children: - turbo_fish: optional: true - expression_list: optional: true - closure: optional: true TurboFish: children: - generic_arguments ExpressionList: children: - expressions: rule: Expression vec: true # Closure Closure: children: - closure_parameters: build: or_else_default: true - statements: rule: Statement vec: true ClosureParameters: children: - parameters: rule: ClosureParameters vec: true ClosureParameter: children: - identifier - type_use: optional: true