interpreter — API
export class Lexer { private regex = /\s*(=>|{|}|<|>|<\/|\/>|::|\$|[A-Za-z_][A-Za-z_0-9]*|\d+|\S)\s*/g;
public tokenize(code: string): Token[] { let result: Token[] = []; let match; while (match = this.regex.exec(code)) { let token: Token; if (match[1] === '<' || match[1] === '>' || match[1] === '</' || match[1] === '/>') { token = { type: TokenType.XMLTag, value: match[1] }; } else if (match[1] === '::') { token = { type: TokenType.TypeScriptNamespace, value: match[1] }; } else if (match[1] === '$') { token = { type: TokenType.PHPVariable, value: match[1] }; } else if (!isNaN(Number(match[1]))) { token = { type: TokenType.Number, value: Number(match[1]) }; } else { token = { type: TokenType.Identifier, value: match[1] }; } result.push(token); } return result; }}TokenType
Заголовок раздела «TokenType»export enum TokenType { XMLTag = 'XMLTag', TypeScriptNamespace = 'TypeScriptNamespace', PHPVariable = 'PHPVariable', Number = 'Number', Identifier = 'Identifier',}export type Token = { type: TokenType; value: string | number;};ASTNode
Заголовок раздела «ASTNode»export type ASTNode = { type: string; children?: ASTNode[];};ProgramNode
Заголовок раздела «ProgramNode»export type ProgramNode = ASTNode & { type: 'Program'; body: StatementNode[];};StatementNode
Заголовок раздела «StatementNode»export type StatementNode = FunctionDeclarationNode | ClassDeclarationNode | VariableAssignmentNode | EchoStatementNode | ReturnStatementNode | LoopStatementNode | ConditionalStatementNode | TryStatementNode | ModuleImportNode;ExpressionNode
Заголовок раздела «ExpressionNode»export type ExpressionNode = BinaryExpressionNode | UnaryExpressionNode | ConditionalExpressionNode | ArrayExpressionNode | ObjectExpressionNode | CallExpressionNode | MemberExpressionNode | IdentifierNode | LiteralNode;FunctionDeclarationNode
Заголовок раздела «FunctionDeclarationNode»export type FunctionDeclarationNode = ASTNode & { type: 'FunctionDeclaration'; name: IdentifierNode; params: IdentifierNode[]; body: StatementNode[];};ClassDeclarationNode
Заголовок раздела «ClassDeclarationNode»export type ClassDeclarationNode = ASTNode & { type: 'ClassDeclaration'; name: IdentifierNode; properties: PropertyNode[]; methods: FunctionDeclarationNode[];};PropertyNode
Заголовок раздела «PropertyNode»export type PropertyNode = ASTNode & { type: 'Property'; name: IdentifierNode; value: ExpressionNode;};VariableAssignmentNode
Заголовок раздела «VariableAssignmentNode»export type VariableAssignmentNode = ASTNode & { type: 'VariableAssignment'; name: IdentifierNode; value: ExpressionNode;};ModuleImportNode
Заголовок раздела «ModuleImportNode»export type ModuleImportNode = ASTNode & { type: 'ModuleImport'; moduleName: string;};EchoStatementNode
Заголовок раздела «EchoStatementNode»export type EchoStatementNode = ASTNode & { type: 'EchoStatement'; expressions: ExpressionNode[];};ReturnStatementNode
Заголовок раздела «ReturnStatementNode»export type ReturnStatementNode = ASTNode & { type: 'ReturnStatement'; argument: ExpressionNode;};BinaryExpressionNode
Заголовок раздела «BinaryExpressionNode»export type BinaryExpressionNode = ASTNode & { type: 'BinaryExpression'; operator: string; left: ExpressionNode; right: ExpressionNode;};UnaryExpressionNode
Заголовок раздела «UnaryExpressionNode»export type UnaryExpressionNode = ASTNode & { type: 'UnaryExpression'; operator: string; argument: ExpressionNode;};ConditionalExpressionNode
Заголовок раздела «ConditionalExpressionNode»export type ConditionalExpressionNode = ASTNode & { type: 'ConditionalExpression'; test: ExpressionNode; consequent: ExpressionNode; alternate: ExpressionNode;};ArrayExpressionNode
Заголовок раздела «ArrayExpressionNode»export type ArrayExpressionNode = ASTNode & { type: 'ArrayExpression'; elements: ExpressionNode[];};ObjectExpressionNode
Заголовок раздела «ObjectExpressionNode»export type ObjectExpressionNode = ASTNode & { type: 'ObjectExpression'; properties: PropertyNode[];};CallExpressionNode
Заголовок раздела «CallExpressionNode»export type CallExpressionNode = ASTNode & { type: 'CallExpression'; callee: ExpressionNode; arguments: ExpressionNode[];};MemberExpressionNode
Заголовок раздела «MemberExpressionNode»export type MemberExpressionNode = ASTNode & { type: 'MemberExpression'; object: ExpressionNode; property: ExpressionNode;};IdentifierNode
Заголовок раздела «IdentifierNode»export type IdentifierNode = ASTNode & { type: 'Identifier'; name: string;};LiteralNode
Заголовок раздела «LiteralNode»export type LiteralNode = ASTNode & { type: 'Literal'; value: string | number | boolean | null;};LoopStatementNode
Заголовок раздела «LoopStatementNode»export type LoopStatementNode = ASTNode & { type: 'LoopStatement'; init: ExpressionNode; test: ExpressionNode; update: ExpressionNode; body: StatementNode;};ConditionalStatementNode
Заголовок раздела «ConditionalStatementNode»export type ConditionalStatementNode = ASTNode & { type: 'ConditionalStatement'; test: ExpressionNode; consequent: StatementNode; alternate: StatementNode;};TryStatementNode
Заголовок раздела «TryStatementNode»export type TryStatementNode = ASTNode & { type: 'TryStatement'; block: StatementNode; handler: CatchClauseNode;};CatchClauseNode
Заголовок раздела «CatchClauseNode»export type CatchClauseNode = ASTNode & { type: 'CatchClause'; param: IdentifierNode; body: StatementNode;};export type AST = ProgramNode;