import AssignmentNode from "./ast/AssignmentNode"; import ASTNode from "./ast/ASTNode"; import ASTVisitor from "./ast/ASTVisitor"; import ErrorNode from "./ast/ErrorNode"; import { AnonymousFunctionExpr, ArrayLookupExpr, AssertExpr, BinaryOpExpr, EchoExpr, FunctionCallExpr, GroupingExpr, LcEachExpr, LcForCExpr, LcForExpr, LcIfExpr, LcLetExpr, LetExpr, LiteralExpr, LookupExpr, MemberLookupExpr, RangeExpr, TernaryExpr, UnaryOpExpr, VectorExpr } from "./ast/expressions"; import ScadFile from "./ast/ScadFile"; import { BlockStmt, FunctionDeclarationStmt, IfElseStatement, IncludeStmt, ModuleDeclarationStmt, ModuleInstantiationStmt, NoopStmt, UseStmt } from "./ast/statements"; import Token from "./Token"; /** * This class walks through the AST and generates arrays of tokens and function, which themselves return the same array. * It can be used to search through the AST, or determine the ranges of AST nodes. */ export default abstract class ASTAssembler implements ASTVisitor { protected abstract processAssembledNode(t: (Token | (() => R))[], self: ASTNode): R; visitScadFile(n: ScadFile): R; visitAssignmentNode(n: AssignmentNode): R; visitUnaryOpExpr(n: UnaryOpExpr): R; visitBinaryOpExpr(n: BinaryOpExpr): R; visitTernaryExpr(n: TernaryExpr): R; visitArrayLookupExpr(n: ArrayLookupExpr): R; visitLiteralExpr(n: LiteralExpr): R; visitRangeExpr(n: RangeExpr): R; visitVectorExpr(n: VectorExpr): R; visitLookupExpr(n: LookupExpr): R; visitMemberLookupExpr(n: MemberLookupExpr): R; visitFunctionCallExpr(n: FunctionCallExpr): R; visitLetExpr(n: LetExpr): R; visitAssertExpr(n: AssertExpr): R; visitEchoExpr(n: EchoExpr): R; visitLcIfExpr(n: LcIfExpr): R; visitLcEachExpr(n: LcEachExpr): R; visitLcForExpr(n: LcForExpr): R; visitLcForCExpr(n: LcForCExpr): R; visitLcLetExpr(n: LcLetExpr): R; visitGroupingExpr(n: GroupingExpr): R; visitUseStmt(n: UseStmt): R; visitIncludeStmt(n: IncludeStmt): R; visitModuleInstantiationStmt(n: ModuleInstantiationStmt): R; visitModuleDeclarationStmt(n: ModuleDeclarationStmt): R; visitFunctionDeclarationStmt(n: FunctionDeclarationStmt): R; visitBlockStmt(n: BlockStmt): R; visitNoopStmt(n: NoopStmt): R; visitIfElseStatement(n: IfElseStatement): R; visitAnonymousFunctionExpr(n: AnonymousFunctionExpr): R; visitErrorNode(n: ErrorNode): R; }