use crate::*; /// The entire semantic program, ready to generate bytecode. pub struct Program { pub definitions: Vec, pub invocations: Vec, } /// A symbol definition. pub struct Definition { pub name: String, pub source: SourceSpan, pub arguments: Vec, pub variant: DefinitionVariant, } pub struct ArgumentDefinition { pub name: String, pub source: SourceSpan, pub variant: ArgumentDefinitionVariant, } pub enum ArgumentDefinitionVariant { Integer, Block, } pub enum DefinitionVariant { Integer(IntegerDefinition), Block(Vec), } pub struct IntegerDefinition { pub source: SourceSpan, pub variant: IntegerDefinitionVariant, } pub enum IntegerDefinitionVariant { Literal(usize), Constant(ConstantExpression), Reference(String), } pub struct BlockToken { pub source: SourceSpan, pub variant: BlockTokenVariant, } pub enum BlockTokenVariant { Invocation(Invocation), Comment(String), Word(PackedBinaryLiteral), } pub struct Invocation { pub name: String, pub source: SourceSpan, pub arguments: Vec, } pub struct InvocationArgument { pub source: SourceSpan, pub variant: InvocationArgumentVariant, } pub enum InvocationArgumentVariant { BlockLiteral(Vec), IntegerLiteral(usize), ConstantExpression(ConstantExpression), Reference(String), }