deimos-lang/src/parser/ast.schema.yaml
2025-09-25 18:43:05 -05:00

557 lines
15 KiB
YAML

$schema: https://json-schema.org/draft/2020-12/schema
title: Deimos AST generation spec
type: object
description: Top level is a map of node names in Pascal case (e.g., CompilationUnit) to node definitions.
additionalProperties:
$ref: "#/$defs/NodeDefinition"
$defs:
# Top level
NodeDefinition:
type: object
additionalProperties: false
description: |
A definition of a node type. The main key in this hash determines the type of node: `children` for Struct node,
`members` for Leaf-Struct node, `rules` for Enum node, `leaf_rules` for Leaf-Enum node, and `produce` for a
translate rule.
A Struct node has child nodes and other properties, and is built by looping through all the inner pairs of the
given Parser Pair.
A Leaf-Struct node does not have child nodes, but does have members. The members are built by some kind of parsing
of the string value of the the given Parser Pair (i.e., no looping through inner pairs).
An Enum node maps Parser Rules to an enum of node types. Each enum member may have a child, or not. By default, a
Rule name maps to the node type-name of a single child.
A Leaf-Enum node is like a regular enum node, but no children are allowed. Rather, the Parser Rule maps to a bare
enum member.
A translate rule simply translates the Parser rule into some kind of arbitrary type, such as a string, int, etc.
oneOf:
- $ref: "#/$defs/StructNodeDefinition"
- $ref: "#/$defs/LeafStructNodeDefinition"
- $ref: "#/$defs/EnumNodeDefinition"
- $ref: "#/$defs/LeafEnumNodeDefinition"
- $ref: "#/$defs/ProductionDefinition"
- $ref: "#/$defs/NodeProductionDefinition"
- $ref: "#/$defs/PolymorphicTypeDefinition"
- $ref: "#/$defs/PolymorphicEnumLoopBuildDefinition"
- $ref: "#/$defs/PolymorphicPassThroughDefinition"
# Struct
StructNodeDefinition:
type: object
additionalProperties: false
properties:
struct:
$ref: "#/$defs/StructProps"
required:
- struct
StructProps:
type: object
additionalProperties: false
description: A description of a Struct node to be built.
properties:
children:
type: array
description: Ordered child fields for this node.
items:
$ref: "#/$defs/StructChild"
required:
- children
StructChild:
description: |
A definition of a Struct node's child. Either a bare child name (string) in snake case, or an object. The former
is a shorthand where the child name and built type are the same; casing is automatically done. The latter allows
further customization of the built child.
oneOf:
- type: string
- $ref: "#/$defs/StructChildHash"
StructChildHash:
type: object
description: Single-key object mapping the child-name to its advanced definition.
minProperties: 1
maxProperties: 1
additionalProperties: false
patternProperties:
"^[a-z][a-z0-9_]*$":
$ref: "#/$defs/StructChildProps"
StructChildProps:
type: object
description: One of skip/vec/single child specs.
oneOf:
- $ref: "#/$defs/StructChildSkipHash"
- $ref: "#/$defs/StructChildVecHash"
- $ref: "#/$defs/StructChildMemberHash"
StructChildSkipHash:
type: object
additionalProperties: false
properties:
skip:
$ref: "#/$defs/StructChildSkipProps"
required:
- skip
StructChildSkipProps:
type: object
additionalProperties: false
description: A definition for a child rule that does nothing, i.e., is skipped.
properties:
rule:
type: string
required:
- rule
StructChildVecHash:
type: object
additionalProperties: false
properties:
vec:
$ref: "#/$defs/StructChildVecProps"
StructChildVecProps:
type: object
additionalProperties: false
description: A definition for a child rule that can be matched multiple times.
properties:
rule:
type: string
kind:
type: string
required:
- rule
StructChildMemberHash:
type: object
additionalProperties: false
properties:
member:
$ref: "#/$defs/StructChildMemberProps"
required:
- member
StructChildMemberProps:
type: object
additionalProperties: false
properties:
rule:
type: string
description: The rule to match.
optional:
type: boolean
description: If true, this child will be stored as an Option.
build:
$ref: "#/$defs/StructChildMemberBuildProps"
StructChildMemberBuildProps:
type: object
additionalProperties: false
oneOf:
- $ref: "#/$defs/StructChildMemberBuildNodeHash"
- $ref: "#/$defs/StructChildMemberBuildBooleanHash"
StructChildMemberBuildNodeHash:
type: object
additionalProperties: false
properties:
node:
$ref: "#/$defs/StructChildMemberBuildNodeProps"
required:
- node
StructChildMemberBuildNodeProps:
type: object
additionalProperties: false
description: A definition of a single-type child to build.
properties:
kind:
type: string
with:
type: string
or_else:
type: string
description: The method name to call upon the built-type if the rule is not found. Takes precedence over "or_else_default".
or_else_default:
type: boolean
description: Whether to call the default method on the built-type if the rule is not found.
StructChildMemberBuildBooleanHash:
type: object
additionalProperties: false
properties:
boolean:
$ref: "#/$defs/StructChildMemberBuildBooleanProps"
required:
- boolean
StructChildMemberBuildBooleanProps:
type: object
additionalProperties: false
description: A boolean member to be built.
properties:
on:
type: string
enum:
- rule_present
required:
- on
# Leaf Struct Node
LeafStructNodeDefinition:
type: object
additionalProperties: false
description: A description of a Leaf-Struct node to be built.
properties:
leaf_struct:
type: object
additionalProperties: false
properties:
members:
type: array
description: Ordered members for this node.
items:
$ref: "#/$defs/LeafStructMemberDefinition"
required:
- members
required:
- leaf_struct
LeafStructMemberDefinition:
type: object
description: Single-key object mapping the member-name to what is to be built by parsing the Parser Pair.
minProperties: 1
maxProperties: 1
additionalProperties: false
patternProperties:
"^[a-z][a-z0-9_]*$":
oneOf:
- $ref: "#/$defs/LeafStructBuildMember"
LeafStructBuildMember:
type: object
description: A specification for a member to build.
additionalProperties: false
properties:
kind:
enum:
- string
- file_id
- range
required:
- kind
# Enum node
EnumNodeDefinition:
type: object
additionalProperties: false
description: A description of an Enum node to be built.
properties:
tree_enum:
type: object
additionalProperties: false
properties:
rules:
type: array
description: Alternative parse rules that build this node.
items:
$ref: "#/$defs/EnumChildDefinition"
required:
- rules
required:
- tree_enum
EnumChildDefinition:
oneOf:
- type: string
description: Shorthand where child name, var, build, and with are inferred from the given Pascal-case rule name.
- $ref: "#/$defs/LongEnumChildWrapper"
LongEnumChildWrapper:
type: object
minProperties: 1
maxProperties: 1
additionalProperties: false
patternProperties:
"^([A-Z][a-z]*)*$":
properties:
child:
type: boolean
kind:
enum:
- int
- long
- double
- string
- boolean
# Leaf Enum
LeafEnumNodeDefinition:
type: object
additionalProperties: false
description: A description of a leaf-enum node to be built.
properties:
leaf_enum:
type: object
additionalProperties: false
properties:
rules:
type: array
description: Alternative parse rules that build this node.
items:
type: string
required:
- rules
required:
- leaf_enum
# Polymorphic Type
PolymorphicTypeDefinition:
type: object
additionalProperties: false
properties:
polymorphic_type:
type: object
additionalProperties: false
properties:
variants:
type: array
items:
$ref: "#/$defs/PolymorphicTypeVariantHash"
build:
type: object
additionalProperties: false
properties:
kind:
type: string
required:
- kind
required:
- variants
- build
required:
- polymorphic_type
PolymorphicTypeVariantHash:
type: object
additionalProperties: false
minProperties: 1
maxProperties: 1
patternProperties:
"^([A-Z][a-z]*)*$":
properties:
inner:
type: object
additionalProperties: false
properties:
kind:
type: string
required:
- kind
# Polymorphic Enum Loop Build
PolymorphicEnumLoopBuildDefinition:
type: object
additionalProperties: false
properties:
polymorphic_enum_loop_build:
type: object
additionalProperties: false
properties:
kind:
type: string
reverse:
type: boolean
rules:
type: array
items:
$ref: "#/$defs/PolymorphicEnumLoopBuildRule"
required:
- kind
- rules
required:
- polymorphic_enum_loop_build
PolymorphicEnumLoopBuildRule:
type: object
additionalProperties: false
minProperties: 1
maxProperties: 1
patternProperties:
"^([A-Z][a-z]*)*$":
type: object
oneOf:
- $ref: "#/$defs/PolymorphicEnumLoopBuildPassThrough"
- $ref: "#/$defs/PolymorphicEnumLoopBuildBuild"
PolymorphicEnumLoopBuildPassThrough:
type: object
additionalProperties: false
properties:
pass_through:
type: object
additionalProperties: false
properties:
kind:
type: string
with:
type: string
required:
- kind
- with
required:
- pass_through
PolymorphicEnumLoopBuildBuild:
type: object
additionalProperties: false
properties:
build:
type: object
additionalProperties: false
properties:
variant:
type: string
children:
type: array
items:
$ref: "#/$defs/PolymorphicEnumLoopBuildBuildChild"
required:
- variant
- children
required:
- build
PolymorphicEnumLoopBuildBuildChild:
type: object
additionalProperties: false
minProperties: 1
maxProperties: 1
patternProperties:
"^[a-z][a-z_]*$":
type: object
oneOf:
- $ref: "#/$defs/PolymorphicEnumLoopBuildBuildUseCurrent"
- $ref: "#/$defs/PolymorphicEnumLoopBuildBuildOnEach"
PolymorphicEnumLoopBuildBuildUseCurrent:
type: object
additionalProperties: false
properties:
use_current:
type: object
additionalProperties: false
properties:
kind:
type: string
required:
- kind
required:
- use_current
PolymorphicEnumLoopBuildBuildOnEach:
type: object
additionalProperties: false
properties:
on_each:
type: object
additionalProperties: false
properties:
rule:
type: string
required:
- rule
required:
- on_each
# Polymorphic Pass Through
PolymorphicPassThroughDefinition:
type: object
additionalProperties: false
properties:
polymorphic_pass_through:
$ref: "#/$defs/PolymorphicPassThroughProps"
required:
- polymorphic_pass_through
PolymorphicPassThroughProps:
type: object
additionalProperties: false
properties:
build:
type: object
additionalProperties: false
properties:
kind:
type: string
required:
- kind
variants:
type: array
items:
$ref: "#/$defs/PolymorphicPassThroughVariantHash"
required:
- build
- variants
PolymorphicPassThroughVariantHash:
type: object
additionalProperties: false
minProperties: 1
maxProperties: 1
patternProperties:
"^([A-Z][a-z]*)*$":
$ref: "#/$defs/PolymorphicPassThroughVariantProps"
PolymorphicPassThroughVariantProps:
type: object
additionalProperties: false
oneOf:
- $ref: "#/$defs/PolymorphicPassThroughVariantInner"
- $ref: "#/$defs/PolymorphicPassThroughVariantPassThrough"
PolymorphicPassThroughVariantInner:
type: object
additionalProperties: false
properties:
inner:
type: object
additionalProperties: false
properties:
kind:
type: string
required:
- kind
required:
- inner
PolymorphicPassThroughVariantPassThrough:
type: object
additionalProperties: false
properties:
pass_through:
type: object
additionalProperties: false
properties:
kind:
type: string
required:
- kind
required:
- pass_through
# Production
ProductionDefinition:
type: object
properties:
production:
type: object
properties:
kind:
enum:
- int
- long
- double
- string
- boolean
from:
enum:
- string_inner
- whole_pair
- parse_whole_pair
required:
- kind
required:
- production
# Node Production
NodeProductionDefinition:
type: object
additionalProperties: false
properties:
node_production:
type: object
additionalProperties: false
properties:
kind:
type: string
with:
type: string
required:
- kind
- with
required:
- node_production