import { Primitive, PrimitiveInt16U, PrimitiveInt32U } from '@sage-js/core'; import { OSI, StringP8NTable, Subroutine, Instruction, FunctionDefinitionTable, ClassDefinition, ClassDefinitionTable } from '@sage-js/res-osi'; import { MapIdentifierToASTNodeStatementInstruction, MapIdentifierToASTNodeStatementBlock, MapIdToSubroutineOffset, SymbolToIndex } from '../../types'; import { ASTNode } from '../../ast/node/class'; import { ASTNodeArgument } from '../../ast/node/argument/class'; import { ASTNodeArguments } from '../../ast/node/arguments'; import { ASTNodeFile } from '../../ast/node/file'; import { ASTNodeStatements } from '../../ast/node/statements'; import { ASTNodeStatementBlock } from '../../ast/node/statement/block'; import { ASTNodeStatementInstruction } from '../../ast/node/statement/instruction'; import { Assembly } from '../class'; /** * AssemblyAssembler constructor. */ export declare class AssemblyAssembler extends Assembly { constructor(); /** * Reset any stateful properties. */ reset(): void; /** * Assemble AST to OSI. * * @param ast AST file. * @returns OSI instance. */ assemble(ast: ASTNodeFile): OSI; /** * Assemble metadata AST block into OSI. * * @param ast AST block. * @param osi OSI instance. */ assembleMetadata(ast: ASTNodeStatementBlock, osi: OSI): void; /** * Assemble string AST block into OSI. * * @param ast AST block. * @param osi OSI instance. */ assembleStrings(ast: ASTNodeStatementBlock, osi: OSI): void; /** * Assemble globals AST block into OSI. * * @param ast AST block. * @param osi OSI instance. */ assembleGlobals(ast: ASTNodeStatementBlock, osi: OSI): void; /** * Assemble symbols AST block into OSI. * * @param ast AST block. * @param osi OSI instance. */ assembleSymbols(ast: ASTNodeStatementBlock, osi: OSI): void; /** * Assemble sources AST block into OSI. * * @param ast AST block. * @param osi OSI instance. */ assembleSources(ast: ASTNodeStatementBlock, osi: OSI): void; /** * Assemble a generic string AST block into table. * * @param ast AST block. * @param table String table. * @param blockID Block ID. * @param instructionID Instruction ID. */ assembleStringP8NTable(ast: ASTNodeStatementBlock, table: StringP8NTable, blockID: string, instructionID: string): void; /** * Assemble a generic string AST instruction into table. * * @param ast AST instruction. * @param table StringP8NTable instance. * @param instructionID Instruction ID. */ assembleStringP8NTableEntry(ast: ASTNodeStatementInstruction, table: StringP8NTable, instructionID: string): void; /** * Assemble a functions AST block into OSI. * * @param ast AST block. * @param osi OSI instance. * @param idToOffset Maps ID to offset. */ assembleFunctions(ast: ASTNodeStatementBlock, osi: OSI, idToOffset: MapIdToSubroutineOffset): void; /** * Assemble a function AST instruction into table. * * @param ast AST instruction. * @param functionDefinitionTable FunctionDefinitionTable instance. * @param idToOffset Maps ID to offset. */ assembleFunction(ast: ASTNodeStatementInstruction, functionDefinitionTable: FunctionDefinitionTable, idToOffset: MapIdToSubroutineOffset): void; /** * Assemble a classes AST block into OSI. * * @param ast AST block. * @param osi OSI instance. * @param idToOffset Maps ID to offset. */ assembleClasses(ast: ASTNodeStatementBlock, osi: OSI, idToOffset: MapIdToSubroutineOffset): void; /** * Assemble a class AST block into table. * * @param ast AST block. * @param classDefinitionTable ClassDefinitionTable instance. * @param idToOffset Maps ID to offset. * @param symbolToIndex Get symbol or add. */ assembleClass(ast: ASTNodeStatementBlock, classDefinitionTable: ClassDefinitionTable, idToOffset: MapIdToSubroutineOffset, symbolToIndex: SymbolToIndex): void; /** * Assemble a class property AST instruction into definition. * * @param ast AST instruction. * @param classDefinition Definition instance. * @param symbolToIndex Get symbol or add. */ assembleClassProperty(ast: ASTNodeStatementInstruction, classDefinition: ClassDefinition, symbolToIndex: SymbolToIndex): void; /** * Assemble a class method AST instruction into definition. * * @param ast AST instruction. * @param classDefinition Definition instance. * @param idToOffset Maps ID to offset. * @param symbolToIndex Get symbol or add. */ assembleClassMethod(ast: ASTNodeStatementInstruction, classDefinition: ClassDefinition, idToOffset: MapIdToSubroutineOffset, symbolToIndex: SymbolToIndex): void; /** * Assemble subroutines AST blocks into OSI. * * @param asts AST blocks. * @param osi OSI instance. * @param idToOffset Maps ID to offset. */ assembleSubroutines(asts: ASTNodeStatementBlock[], osi: OSI, idToOffset: MapIdToSubroutineOffset): void; /** * Assemble subroutine AST block into OSI. * * @param ast AST block. * @param osi OSI instance. * @param idToOffset Maps ID to offset. */ assembleSubroutine(ast: ASTNodeStatementBlock, osi: OSI, idToOffset: MapIdToSubroutineOffset): void; /** * Assemble subroutine AST statements into OSI. * * @param ast AST block. * @param osi OSI instance. * @returns The offset. */ assembleSubroutineBody(ast: ASTNodeStatementBlock, osi: OSI): PrimitiveInt32U; /** * Assemble instruction AST instruction into subroutine. * * @param ast AST instruction. * @param subroutine Subroutine instance. */ assembleInstruction(ast: ASTNodeStatementInstruction, subroutine: Subroutine): void; /** * Assemble arguments AST into instruction. * * @param ast AST instruction. * @param instruction Instruction instance. */ assembleInstructionArguments(ast: ASTNodeStatementInstruction, instruction: Instruction): void; /** * Assemble argument AST into instruction. * * @param ast AST instruction. * @param instruction Instruction instance. * @param index Argument index. */ assembleInstructionArgument(ast: ASTNodeStatementInstruction, instruction: Instruction, index: number): void; /** * Decode argument AST into a number. * * @param argument AST argument. * @returns Decoded number. */ protected _assembleDecodeArgumentNumber(argument: ASTNodeArgument): number; /** * Decode argument AST into a primitive. * * @param primitive Primitive object to decode new of. * @param argument AST argument. * @returns Decoded argument. */ protected _assembleDecodeArgument(primitive: T, argument: ASTNodeArgument): T; /** * Groups a list of statements by type, ignoring the empty lines. * * @param asts AST statements list. * @returns The blocks and instructions. */ protected _assembleGroupStatementsList(asts: ASTNodeStatements[]): { blocks: ASTNodeStatementBlock[]; instructions: ASTNodeStatementInstruction[]; }; /** * Groups statements by type, ignoring the empty lines. * * @param ast AST statements. * @returns The blocks and instructions. */ protected _assembleGroupStatements(ast: ASTNodeStatements): { blocks: ASTNodeStatementBlock[]; instructions: ASTNodeStatementInstruction[]; }; /** * Map instructions by identifier. * * @param instructions AST instructions. * @returns The map. */ protected _assembleIdentifierMappedInstructions(instructions: ASTNodeStatementInstruction[]): MapIdentifierToASTNodeStatementInstruction; /** * Map blocks by identifier. * * @param blocks AST blocks. * @returns The map. */ protected _assembleIdentifierMappedBlocks(blocks: ASTNodeStatementBlock[]): MapIdentifierToASTNodeStatementBlock; /** * Get and remove instructions from map. * * @param map Map object. * @param id Identifier string. * @returns The map. */ protected _assembleIdentifierMappedInstructionsConsume(map: MapIdentifierToASTNodeStatementInstruction, id: string): ASTNodeStatementInstruction[]; /** * Get and remove blocks from map. * * @param map Map object. * @param id Identifier string. * @returns The map. */ protected _assembleIdentifierMappedBlocksConsume(map: MapIdentifierToASTNodeStatementBlock, id: string): ASTNodeStatementBlock[]; /** * Get and remove an instruction from map, throwing if more than one. * * @param map Map object. * @param id Identifier string. * @returns The instruction or null. */ protected _assembleIdentifierMappedInstructionsConsumeOneOptional(map: MapIdentifierToASTNodeStatementInstruction, id: string): ASTNodeStatementInstruction | null; /** * Get and remove a block from map, throwing if more than one. * * @param map Map object. * @param id Identifier string. * @returns The block or null. */ protected _assembleIdentifierMappedBlocksConsumeOneOptional(map: MapIdentifierToASTNodeStatementBlock, id: string): ASTNodeStatementBlock | null; /** * Get and remove a block from map, throwing if more than one. * * @param map Map object. * @param id Identifier string. * @param container Container element used for throwing exceptions. * @returns The instruction or null. */ protected _assembleIdentifierMappedInstructionsConsumeOne(map: MapIdentifierToASTNodeStatementInstruction, id: string, container: ASTNode | null): ASTNodeStatementInstruction; /** * Get and remove an instruction from map, throwing if more than one. * * @param map Map object. * @param id Identifier string. * @param container Container element used for throwing exceptions. * @returns The block or null. */ protected _assembleIdentifierMappedBlocksConsumeOne(map: MapIdentifierToASTNodeStatementBlock, id: string, container: ASTNode | null): ASTNodeStatementBlock; /** * Assert mapped instructions object is empty. * * @param map Map object. */ protected _assembleAssertInstructionByIdentifierEmpty(map: MapIdentifierToASTNodeStatementInstruction): void; /** * Assert mapped blocks object is empty. * * @param map Map object. */ protected _assembleAssertBlockByIdentifierEmpty(map: MapIdentifierToASTNodeStatementBlock): void; /** * Assert arguments entry count. * * @param args Arguments node. * @param count Expected count. */ protected _assembleAssertArgumentCount(args: ASTNodeArguments, count: number): void; /** * Assert arguments entry count range. * * @param args Arguments node. * @param min Expected min. * @param max Expected max. */ protected _assembleAssertArgumentCountRange(args: ASTNodeArguments, min: number, max: number): void; /** * Assert an empty list of instructions. * * @param asts Instructions list. */ protected _assembleAssertNoInstructions(asts: ASTNodeStatementInstruction[]): void; /** * Assert an empty list of blocks. * * @param asts Blocks list. */ protected _assembleAssertNoBlocks(asts: ASTNodeStatementBlock[]): void; /** * Convert argument to symbol, adding new if needed. * * @param ast Arg node. * @param symbolToIndex Get symbol or add. * @returns Decoded symbol. */ protected _assembleConvertArgumentToSymbol(ast: ASTNodeArgument, symbolToIndex: SymbolToIndex): PrimitiveInt16U; /** * Symbol index getter, adding if necessary. * * @param osi OSI instance. * @returns Getter function. */ protected _assembleSymbolToIndex(osi: OSI): SymbolToIndex; }