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
Section titled “TokenType”export enum TokenType { XMLTag = 'XMLTag', TypeScriptNamespace = 'TypeScriptNamespace', PHPVariable = 'PHPVariable', Number = 'Number', Identifier = 'Identifier',}export type Token = { type: TokenType; value: string | number;};ASTNode
Section titled “ASTNode”export type ASTNode = { type: string; children?: ASTNode[];};ProgramNode
Section titled “ProgramNode”export type ProgramNode = ASTNode & { type: 'Program'; body: StatementNode[];};StatementNode
Section titled “StatementNode”export type StatementNode = FunctionDeclarationNode | ClassDeclarationNode | VariableAssignmentNode | EchoStatementNode | ReturnStatementNode | LoopStatementNode | ConditionalStatementNode | TryStatementNode | ModuleImportNode;ExpressionNode
Section titled “ExpressionNode”export type ExpressionNode = BinaryExpressionNode | UnaryExpressionNode | ConditionalExpressionNode | ArrayExpressionNode | ObjectExpressionNode | CallExpressionNode | MemberExpressionNode | IdentifierNode | LiteralNode;FunctionDeclarationNode
Section titled “FunctionDeclarationNode”export type FunctionDeclarationNode = ASTNode & { type: 'FunctionDeclaration'; name: IdentifierNode; params: IdentifierNode[]; body: StatementNode[];};ClassDeclarationNode
Section titled “ClassDeclarationNode”export type ClassDeclarationNode = ASTNode & { type: 'ClassDeclaration'; name: IdentifierNode; properties: PropertyNode[]; methods: FunctionDeclarationNode[];};PropertyNode
Section titled “PropertyNode”export type PropertyNode = ASTNode & { type: 'Property'; name: IdentifierNode; value: ExpressionNode;};VariableAssignmentNode
Section titled “VariableAssignmentNode”export type VariableAssignmentNode = ASTNode & { type: 'VariableAssignment'; name: IdentifierNode; value: ExpressionNode;};ModuleImportNode
Section titled “ModuleImportNode”export type ModuleImportNode = ASTNode & { type: 'ModuleImport'; moduleName: string;};EchoStatementNode
Section titled “EchoStatementNode”export type EchoStatementNode = ASTNode & { type: 'EchoStatement'; expressions: ExpressionNode[];};ReturnStatementNode
Section titled “ReturnStatementNode”export type ReturnStatementNode = ASTNode & { type: 'ReturnStatement'; argument: ExpressionNode;};BinaryExpressionNode
Section titled “BinaryExpressionNode”export type BinaryExpressionNode = ASTNode & { type: 'BinaryExpression'; operator: string; left: ExpressionNode; right: ExpressionNode;};UnaryExpressionNode
Section titled “UnaryExpressionNode”export type UnaryExpressionNode = ASTNode & { type: 'UnaryExpression'; operator: string; argument: ExpressionNode;};ConditionalExpressionNode
Section titled “ConditionalExpressionNode”export type ConditionalExpressionNode = ASTNode & { type: 'ConditionalExpression'; test: ExpressionNode; consequent: ExpressionNode; alternate: ExpressionNode;};ArrayExpressionNode
Section titled “ArrayExpressionNode”export type ArrayExpressionNode = ASTNode & { type: 'ArrayExpression'; elements: ExpressionNode[];};ObjectExpressionNode
Section titled “ObjectExpressionNode”export type ObjectExpressionNode = ASTNode & { type: 'ObjectExpression'; properties: PropertyNode[];};CallExpressionNode
Section titled “CallExpressionNode”export type CallExpressionNode = ASTNode & { type: 'CallExpression'; callee: ExpressionNode; arguments: ExpressionNode[];};MemberExpressionNode
Section titled “MemberExpressionNode”export type MemberExpressionNode = ASTNode & { type: 'MemberExpression'; object: ExpressionNode; property: ExpressionNode;};IdentifierNode
Section titled “IdentifierNode”export type IdentifierNode = ASTNode & { type: 'Identifier'; name: string;};LiteralNode
Section titled “LiteralNode”export type LiteralNode = ASTNode & { type: 'Literal'; value: string | number | boolean | null;};LoopStatementNode
Section titled “LoopStatementNode”export type LoopStatementNode = ASTNode & { type: 'LoopStatement'; init: ExpressionNode; test: ExpressionNode; update: ExpressionNode; body: StatementNode;};ConditionalStatementNode
Section titled “ConditionalStatementNode”export type ConditionalStatementNode = ASTNode & { type: 'ConditionalStatement'; test: ExpressionNode; consequent: StatementNode; alternate: StatementNode;};TryStatementNode
Section titled “TryStatementNode”export type TryStatementNode = ASTNode & { type: 'TryStatement'; block: StatementNode; handler: CatchClauseNode;};CatchClauseNode
Section titled “CatchClauseNode”export type CatchClauseNode = ASTNode & { type: 'CatchClause'; param: IdentifierNode; body: StatementNode;};export type AST = ProgramNode;