deimos-lang/src/parser/ast.yaml
2025-09-18 17:00:12 -05:00

1012 lines
19 KiB
YAML

# $schema: ./ast.schema.yaml
# Operators
Operator:
leaf_rules:
- Or
- And
- EqualTo
- NotEqualTo
- Greater
- Less
- GreaterEqual
- LessEqual
- Add
- Subtract
- Multiply
- Divide
- Modulo
- LeftShift
- RightShift
- Spread
- Star
- Not
- Negative
- PlusPlus
- MinusMinus
- CallOp
- Index
# Names
Identifier:
members:
- name:
kind: string
from: whole_pair
FullyQualifiedName:
children:
- identifiers:
rule: Identifier
vec: true
# Lists
TypeUseList:
children:
- type_uses:
rule: TypeUse
vec: true
IdentifierList:
children:
- identifiers:
rule: Identifier
vec: true
ParenthesesOptionalTypeUseList:
children:
- type_use_list:
optional: true
# Type Use
TypeUse:
rules:
- PrimitiveType
- InterfaceOrClassTypeUse
- TupleTypeUse
- FunctionTypeUse
PrimitiveType:
leaf_rules:
- Byte
- Short
- Char
- Int
- Long
- Double
- Bool
- String
- TypedArray
- Any
- Void
TypedArray:
children:
- array_kw:
rule: Array
skip: true
- generic_arguments
InterfaceOrClassTypeUse:
children:
- fully_qualified_name
- generic_arguments:
build:
or_else_default: true
TupleTypeUse:
children:
- tuple_arguments
FunctionTypeUse:
children:
- fn_kw:
rule: Fn
skip: true
- generic_parameters:
build:
or_else_default: true
- parameters:
build:
or_else_default: true
- return_type
# Generic Arguments
GenericArguments:
children:
- type_use_list
# Generic Parameters
GenericParameters:
children:
- identifier_list
# Tuple Arguments
TupleArguments:
children:
- parentheses_optional_type_use_list
# Implements List
ImplementsList:
children:
- type_uses:
rule: TypeUse
vec: true
# Parameters
Parameters:
children:
- parameters:
rule: Parameter
vec: true
Parameter:
children:
- identifier
- type_use
# Return Type
ReturnType:
children:
- type_use
# Top-level constructs
CompilationUnit:
children:
- parent_mod:
optional: true
- use_statements:
rule: UseStatement
vec: true
- module_level_declarations:
rule: ModuleLevelDeclaration
vec: true
- eoi:
rule: EOI
skip: 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
- Star:
child: false
- 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:
kind: 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:
kind: 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:
kind: 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:
kind: boolean
on: rule_present
- fn_kw:
rule: Fn
skip: true
- generics:
rule: GenericParameters
build:
or_else_default: true
- identifier
- parameters
- return_type:
build:
or_else: void
- function_body
OperatorFunction:
children:
- is_public:
rule: Pub
build:
kind: 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:
kind: 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:
kind: boolean
on: rule_present
- is_mut:
rule: Mut
build:
kind: boolean
on: rule_present
- identifier
- type_use
# Statements
Statement:
rules:
- VariableDeclaration
- AssignmentStatement
- ExpressionStatement
- UseStatement
- IfStatement
- WhileStatement
- ForStatement
VariableDeclaration:
children:
- let_kw:
rule: Let
skip: true
- is_mut:
rule: Mut
build:
kind: 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
skip: true
# Expressions
Expression:
polymorphic_type:
enum_members:
- Ternary:
inner:
kind: TernaryExpression
- Or:
inner:
kind: OrExpression
- And:
inner:
kind: AndExpression
- Comparison:
inner:
kind: ComparisonExpression
- Shift:
inner:
kind: ShiftExpression
- Additive:
inner:
kind: AdditiveExpression
- Multiplicative:
inner:
kind: MultiplicativeExpression
- Prefix:
inner:
kind: PrefixExpression
- Suffix:
inner:
kind: SuffixExpression
- Literal:
inner:
kind: Literal
- Fqn:
inner:
kind: FullyQualifiedName
- Closure:
inner:
kind: Closure
build:
kind: TernaryExpression
TernaryExpression:
polymorphic_build:
return_type: Expression
alternatives:
- test:
number_of_pairs: 1
action:
return_build:
kind: OrExpression
- test:
number_of_pairs: 3
action:
build:
enum_variant: Ternary
children:
- test:
kind: Expression
rule: OrExpression
- on_true:
kind: Expression
rule: TernaryTrueAlternative
- on_false:
kind: Expression
rule: TernaryFalseAlternative
TernaryTrueAlternative:
produce:
kind:
node: Expression
TernaryFalseAlternative:
produce:
kind:
node: Expression
OrExpression:
polymorphic_build:
return_type: Expression
alternatives:
- test:
number_of_pairs: 1
action:
return_build:
kind: AndExpression
- test:
number_of_pairs: 3
action:
build:
enum_variant: Or
children:
- left:
kind: Expression
rule: AndExpression
- or_sym:
rule: Or
skip: true
- right:
kind: Expression
rule: Expression
AndExpression:
polymorphic_build:
return_type: Expression
alternatives:
- test:
number_of_pairs: 1
action:
return_build:
kind: ComparisonExpression
- test:
number_of_pairs: 3
action:
build:
enum_variant: And
children:
- left:
kind: Expression
rule: ComparisonExpression
- and_sym:
rule: And
skip: true
- right:
kind: Expression
rule: Expression
ComparisonExpression:
polymorphic_build:
return_type: Expression
alternatives:
- test:
number_of_pairs: 1
action:
return_build:
kind: ShiftExpression
- test:
number_of_pairs: 3
action:
build:
enum_variant: Comparison
children:
- left:
kind: Expression
rule: ShiftExpression
- operator:
kind: ComparisonOperator
rule: ComparisonOperator
- right:
kind: Expression
rule: Expression
ComparisonOperator:
leaf_rules:
- Greater
- Less
- GreaterEqual
- LessEqual
- EqualTo
- NotEqualTo
ShiftExpression:
polymorphic_build:
return_type: Expression
alternatives:
- test:
number_of_pairs: 1
action:
return_build:
kind: AdditiveExpression
- test:
number_of_pairs: 3
action:
build:
enum_variant: Shift
children:
- left:
kind: Expression
rule: AdditiveExpression
- operator:
kind: ShiftOperator
rule: ShiftOperator
- right:
kind: Expression
rule: Expression
ShiftOperator:
leaf_rules:
- LeftShift
- RightShift
AdditiveExpression:
polymorphic_build:
return_type: Expression
alternatives:
- test:
number_of_pairs: 1
action:
return_build:
kind: MultiplicativeExpression
- test:
number_of_pairs: 3
action:
build:
enum_variant: Additive
children:
- left:
kind: Expression
rule: MultiplicativeExpression
- operator:
kind: AdditiveOperator
rule: AdditiveOperator
- right:
kind: Expression
rule: Expression
AdditiveOperator:
leaf_rules:
- Add
- Subtract
MultiplicativeExpression:
polymorphic_build:
return_type: Expression
alternatives:
- test:
number_of_pairs: 1
action:
return_build:
kind: PrefixExpression
- test:
number_of_pairs: 3
action:
build:
enum_variant: Multiplicative
children:
- left:
kind: Expression
rule: PrefixExpression
- operator:
kind: MultiplicativeOperator
rule: MultiplicativeOperator
- right:
kind: Expression
rule: Expression
MultiplicativeOperator:
leaf_rules:
- Multiply
- Divide
- Modulo
PrefixExpression:
polymorphic_build:
return_type: Expression
alternatives:
- test:
number_of_pairs: 1
action:
return_build:
kind: SuffixExpression
- test:
number_of_pairs: 2
action:
build:
enum_variant: Prefix
children:
- prefix_operators:
kind: PrefixOperators
rule: PrefixOperators
- right:
kind: Expression
rule: SuffixExpression
PrefixOperators:
children:
- operators:
rule: PrefixOperator
vec: true
PrefixOperator:
leaf_rules:
- Spread
- Not
- Negative
SuffixExpression:
polymorphic_build:
return_type: Expression
alternatives:
- test:
number_of_pairs: 1
action:
return_build:
kind: PrimaryExpression
- test:
number_of_pairs: 2
action:
build:
enum_variant: Suffix
children:
- left:
kind: Expression
rule: PrimaryExpression
- suffix_operators:
kind: SuffixOperators
rule: SuffixOperators
SuffixOperators:
children:
- operators:
rule: SuffixOperator
vec: true
SuffixOperator:
rules:
- PlusPlus:
child: false
- MinusMinus:
child: false
- ObjectProperty
- ObjectIndex
- Call
ObjectProperty:
children:
- identifier
ObjectIndex:
children:
- expression
PrimaryExpression:
polymorphic_enum:
return_type: Expression
rules:
- Literal:
wrap:
enum_variant: Literal
- FullyQualifiedName:
wrap:
enum_variant: Fqn
- Closure:
wrap:
enum_variant: Closure
- ParenthesizedExpression:
return_build:
kind: Expression
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
# Literals
Literal:
rules:
- IntLiteral:
kind: int
- LongLiteral:
kind: long
- DoubleLiteral:
kind: double
- SingleQuoteString:
kind: string
- DString
- BacktickString
- BooleanLiteral:
kind: boolean
# Numbers
IntLiteral:
produce:
kind: int
LongLiteral:
produce:
kind: long
DoubleLiteral:
produce:
kind: double
# Strings
SingleQuoteString:
produce:
kind: string
from: string_inner
DString:
children:
- inners:
rule: DStringInner
kind: string
vec: true
- expressions:
rule: DStringExpression
vec: true
DStringInner:
produce:
kind: string
from: whole_pair
DStringExpression:
children:
- expression
BacktickString:
children:
- inners:
rule: BacktickInner
kind: string
vec: true
- expressions:
rule: DStringExpression
vec: true
BacktickInner:
produce:
kind: string
from: whole_pair
BooleanLiteral:
produce:
kind: boolean
from: parse_whole_pair