js-slang
Version:
Javascript-based implementations of Source, written in Typescript
223 lines (222 loc) • 8.29 kB
TypeScript
import { Token } from "./tokenizer";
export declare namespace ExprNS {
interface Visitor<T> {
visitBigIntLiteralExpr(expr: BigIntLiteral): T;
visitBinaryExpr(expr: Binary): T;
visitCompareExpr(expr: Compare): T;
visitBoolOpExpr(expr: BoolOp): T;
visitGroupingExpr(expr: Grouping): T;
visitLiteralExpr(expr: Literal): T;
visitUnaryExpr(expr: Unary): T;
visitTernaryExpr(expr: Ternary): T;
visitLambdaExpr(expr: Lambda): T;
visitMultiLambdaExpr(expr: MultiLambda): T;
visitVariableExpr(expr: Variable): T;
visitCallExpr(expr: Call): T;
}
abstract class Expr {
startToken: Token;
endToken: Token;
protected constructor(startToken: Token, endToken: Token);
abstract accept(visitor: Visitor<any>): any;
}
class BigIntLiteral extends Expr {
value: string;
constructor(startToken: Token, endToken: Token, value: string);
accept(visitor: Visitor<any>): any;
}
class Binary extends Expr {
left: Expr;
operator: Token;
right: Expr;
constructor(startToken: Token, endToken: Token, left: Expr, operator: Token, right: Expr);
accept(visitor: Visitor<any>): any;
}
class Compare extends Expr {
left: Expr;
operator: Token;
right: Expr;
constructor(startToken: Token, endToken: Token, left: Expr, operator: Token, right: Expr);
accept(visitor: Visitor<any>): any;
}
class BoolOp extends Expr {
left: Expr;
operator: Token;
right: Expr;
constructor(startToken: Token, endToken: Token, left: Expr, operator: Token, right: Expr);
accept(visitor: Visitor<any>): any;
}
class Grouping extends Expr {
expression: Expr;
constructor(startToken: Token, endToken: Token, expression: Expr);
accept(visitor: Visitor<any>): any;
}
class Literal extends Expr {
value: true | false | number | string;
constructor(startToken: Token, endToken: Token, value: true | false | number | string);
accept(visitor: Visitor<any>): any;
}
class Unary extends Expr {
operator: Token;
right: Expr;
constructor(startToken: Token, endToken: Token, operator: Token, right: Expr);
accept(visitor: Visitor<any>): any;
}
class Ternary extends Expr {
predicate: Expr;
consequent: Expr;
alternative: Expr;
constructor(startToken: Token, endToken: Token, predicate: Expr, consequent: Expr, alternative: Expr);
accept(visitor: Visitor<any>): any;
}
class Lambda extends Expr {
parameters: Token[];
body: Expr;
constructor(startToken: Token, endToken: Token, parameters: Token[], body: Expr);
accept(visitor: Visitor<any>): any;
}
class MultiLambda extends Expr {
parameters: Token[];
body: StmtNS.Stmt[];
varDecls: Token[];
constructor(startToken: Token, endToken: Token, parameters: Token[], body: StmtNS.Stmt[], varDecls: Token[]);
accept(visitor: Visitor<any>): any;
}
class Variable extends Expr {
name: Token;
constructor(startToken: Token, endToken: Token, name: Token);
accept(visitor: Visitor<any>): any;
}
class Call extends Expr {
callee: Expr;
args: Expr[];
constructor(startToken: Token, endToken: Token, callee: Expr, args: Expr[]);
accept(visitor: Visitor<any>): any;
}
}
export declare namespace StmtNS {
interface Visitor<T> {
visitIndentCreation(stmt: Indent): T;
visitDedentCreation(stmt: Dedent): T;
visitPassStmt(stmt: Pass): T;
visitAssignStmt(stmt: Assign): T;
visitAnnAssignStmt(stmt: AnnAssign): T;
visitBreakStmt(stmt: Break): T;
visitContinueStmt(stmt: Continue): T;
visitReturnStmt(stmt: Return): T;
visitFromImportStmt(stmt: FromImport): T;
visitGlobalStmt(stmt: Global): T;
visitNonLocalStmt(stmt: NonLocal): T;
visitAssertStmt(stmt: Assert): T;
visitIfStmt(stmt: If): T;
visitWhileStmt(stmt: While): T;
visitForStmt(stmt: For): T;
visitFunctionDefStmt(stmt: FunctionDef): T;
visitSimpleExprStmt(stmt: SimpleExpr): T;
visitFileInputStmt(stmt: FileInput): T;
}
abstract class Stmt {
startToken: Token;
endToken: Token;
protected constructor(startToken: Token, endToken: Token);
abstract accept(visitor: Visitor<any>): any;
}
class Indent extends Stmt {
constructor(startToken: Token, endToken: Token);
accept(visitor: Visitor<any>): any;
}
class Dedent extends Stmt {
constructor(startToken: Token, endToken: Token);
accept(visitor: Visitor<any>): any;
}
class Pass extends Stmt {
constructor(startToken: Token, endToken: Token);
accept(visitor: Visitor<any>): any;
}
class Assign extends Stmt {
name: Token;
value: ExprNS.Expr;
constructor(startToken: Token, endToken: Token, name: Token, value: ExprNS.Expr);
accept(visitor: Visitor<any>): any;
}
class AnnAssign extends Stmt {
name: Token;
value: ExprNS.Expr;
ann: ExprNS.Expr;
constructor(startToken: Token, endToken: Token, name: Token, value: ExprNS.Expr, ann: ExprNS.Expr);
accept(visitor: Visitor<any>): any;
}
class Break extends Stmt {
constructor(startToken: Token, endToken: Token);
accept(visitor: Visitor<any>): any;
}
class Continue extends Stmt {
constructor(startToken: Token, endToken: Token);
accept(visitor: Visitor<any>): any;
}
class Return extends Stmt {
value: ExprNS.Expr | null;
constructor(startToken: Token, endToken: Token, value: ExprNS.Expr | null);
accept(visitor: Visitor<any>): any;
}
class FromImport extends Stmt {
module: Token;
names: Token[];
constructor(startToken: Token, endToken: Token, module: Token, names: Token[]);
accept(visitor: Visitor<any>): any;
}
class Global extends Stmt {
name: Token;
constructor(startToken: Token, endToken: Token, name: Token);
accept(visitor: Visitor<any>): any;
}
class NonLocal extends Stmt {
name: Token;
constructor(startToken: Token, endToken: Token, name: Token);
accept(visitor: Visitor<any>): any;
}
class Assert extends Stmt {
value: ExprNS.Expr;
constructor(startToken: Token, endToken: Token, value: ExprNS.Expr);
accept(visitor: Visitor<any>): any;
}
class If extends Stmt {
condition: ExprNS.Expr;
body: Stmt[];
elseBlock: Stmt[] | null;
constructor(startToken: Token, endToken: Token, condition: ExprNS.Expr, body: Stmt[], elseBlock: Stmt[] | null);
accept(visitor: Visitor<any>): any;
}
class While extends Stmt {
condition: ExprNS.Expr;
body: Stmt[];
constructor(startToken: Token, endToken: Token, condition: ExprNS.Expr, body: Stmt[]);
accept(visitor: Visitor<any>): any;
}
class For extends Stmt {
target: Token;
iter: ExprNS.Expr;
body: Stmt[];
constructor(startToken: Token, endToken: Token, target: Token, iter: ExprNS.Expr, body: Stmt[]);
accept(visitor: Visitor<any>): any;
}
class FunctionDef extends Stmt {
name: Token;
parameters: Token[];
body: Stmt[];
varDecls: Token[];
constructor(startToken: Token, endToken: Token, name: Token, parameters: Token[], body: Stmt[], varDecls: Token[]);
accept(visitor: Visitor<any>): any;
}
class SimpleExpr extends Stmt {
expression: ExprNS.Expr;
constructor(startToken: Token, endToken: Token, expression: ExprNS.Expr);
accept(visitor: Visitor<any>): any;
}
class FileInput extends Stmt {
statements: Stmt[];
varDecls: Token[];
constructor(startToken: Token, endToken: Token, statements: Stmt[], varDecls: Token[]);
accept(visitor: Visitor<any>): any;
}
}