UNPKG

costreamjs

Version:

A high-performance streaming programming language for parallel architecture. This repo (js-version) is created for better using & reading & debugging.

402 lines (366 loc) 12.4 kB
import { SymbolTable } from "../FrontEnd/symbol" export interface YYLTYPE { first_line: number last_line: number first_column: number last_column: number } export class Node { _loc?: YYLTYPE constructor(loc: YYLTYPE) } /********************************************************/ /* 1.1 declaration */ /********************************************************/ export class declarator extends Node { identifier: idNode op?:'=' initializer: any type:string constructor(loc: YYLTYPE, identifier: idNode, initializer: any) } export class idNode extends Node{ name:string //例如处理 int foo[10]={1,2,3} 时, name 存储的是 foo isArray: Boolean /* 对于 a[1][2],arg_list 的值为[1,2] * 对于 a[], arg_list 值为 [0] //如果做了语义检查后还存在数组的长度为0,则抛出错误 * 对于 a[][5],arg_list 的值为[0,5] * 对于 a[x] , 则在常量传播的步骤中为 x 确定具体值 * 对于 a[] = {0,1,2}, 则在语义检查的步骤中动态计算出长度3,然后设置 arg_list=[3] */ arg_list: Array<number|string> constructor(loc:YYLTYPE,name:string,arg?:number|string) } export class declareNode extends Node { type: string | strdclNode init_declarator_list: declarator[] | string[] constructor(loc: YYLTYPE, type: string, init_declarator_list: declarator[]) } /********************************************************/ /* 1.2 function.definition 函数声明 */ /********************************************************/ export class function_definition extends Node { constructor(loc, type, declarator, compound) { super(loc) this.type = type this.name = declarator.identifier this.op1 = '(' this.param_list = declarator.parameter this.op2 = ')' this.funcBody = compound } } /********************************************************/ /* 2. composite */ /********************************************************/ export class compositeNode extends Node { compName: string inout: ComInOutNode body: compBodyNode _symbol_table: SymbolTable constructor(loc: YYLTYPE, head: compHeadNode, body: compBodyNode) } export class compHeadNode extends Node { compName: string inout: ComInOutNode constructor(loc, compName: string, inout: ComInOutNode) } export class ComInOutNode extends Node { input_list: inOutdeclNode[] output_list: inOutdeclNode[] constructor(loc, input_list?: inOutdeclNode[], output_list?:inOutdeclNode[]) } export class inOutdeclNode extends Node { strType: strdclNode id: string constructor(loc, strType: strdclNode, id: string) } export class strdclNode extends Node { id_list: Array<{type:string, identifier:string}> constructor(loc, type:string, identifier: string) } export class compBodyNode extends Node { param: paramNode stmt_list: Node[] constructor(loc: YYLTYPE, param: paramNode, stmt_list: Node[]) } export class paramNode extends Node { op?:'param' param_list?:declarator[] constructor(loc:YYLTYPE, param_list?:declarator[]) } export class operBodyNode extends Node{ stmt_list: Node[] op1: 'init' init: blockNode op2: 'work' work: blockNode op3: 'win' win: winStmtNode[] constructor(loc: YYLTYPE, stmt_list: Node[], init:blockNode, work: blockNode, window: winStmtNode[]) } export class winStmtNode extends Node { winName: string type: 'sliding' | 'tumbling' arg_list: number[] constructor(loc, winName:string, { type:string, arg_list }) } /********************************************************/ /* 3. statement 花括号内以';'结尾的结构是statement */ /********************************************************/ export type statement = blockNode | binopNode | forNode | operatorNode | splitjoinNode | pipelineNode export class blockNode extends Node { op1: '{' stmt_list: Node[] op2: '}' _symbol_table: SymbolTable constructor(loc: YYLTYPE, op1: '{', stmt_list: Node[], op2: '}') } export class jump_statement extends Node { constructor(loc, op1, op2) { super(loc) Object.assign(this, { op1, op2 }) } } export class labeled_statement extends Node { constructor(loc, op1, op2, op3, statement) { super(loc) Object.assign(this, { op1, op2, op3, statement }) } } export class selection_statement extends Node { constructor(loc, op1, op2, exp, op3, statement, op4, else_statement) { super(loc) Object.assign(this, { op1, op2, exp, op3, statement, op4, else_statement }) } } export class whileNode extends Node { exp: expNode statement: Node constructor(loc, exp:expNode, statement: Node) } export class doNode extends Node { type: 'do' statement: Node | blockNode exp: Node constructor(loc, exp: Node, statement: Node) } export class forNode extends Node { init: binopNode cond: binopNode next: unaryNode | binopNode statement: blockNode | statement constructor(loc: YYLTYPE, init: binopNode, cond: binopNode, next: unaryNode | binopNode, statement: blockNode | statement) } /********************************************************/ /* 4. expression 计算表达式头节点 */ /********************************************************/ export class expNode extends Node { _value: number getValue(): number } type exp = expNode type primary_expression = string | expNode type argument_expression_list = exp[] type operator_arguments = void | argument_expression_list type postfix_expression = primary_expression | compositeCallNode | callNode | binopNode | unaryNode | operatorNode | splitjoinNode | pipelineNode; type unary_expression = postfix_expression | unaryNode | castNode type basic_type_name = string type type_specifier = string type expression = expNode | expNode[] export class unaryNode extends expNode { first: string | unary_expression second: unary_expression | string constructor(loc: YYLTYPE, first: string | unary_expression, second: primary_expression | string) }; export class castNode extends expNode { op1: '(' type: basic_type_name op2: ')' exp: unary_expression constructor(loc: YYLTYPE, type: basic_type_name, exp: unary_expression) } export class binopNode extends expNode { left: exp | string op: string right: exp constructor(loc: YYLTYPE, left: exp, op: string, right: exp) } export class ternaryNode extends expNode { first: exp second: exp third: exp constructor(loc: YYLTYPE, first: exp, second: exp, third: exp) } export class parenNode extends expNode { op1: '(' exp: exp op2: ')' constructor(loc: YYLTYPE, exp: exp) } export class callNode extends expNode { name: expNode | string arg_list: expNode[] constructor(loc, name: expNode|string, arg_list: expNode[]) } export class lib_binopNode extends Node{ lib_name: string function_name: string constructor(loc, lib_name:string,function_name:string) } export class constantNode extends expNode { /** 表示常量的原字符串,例如0x10是数字16的原字符串 */ source: string constructor(loc: YYLTYPE, sourceStr: string) } /********************************************************/ /* operNode in expression's right */ /********************************************************/ export class operNode extends Node { outputs?: string[] inputs?: string[] } export class fileReaderNode extends operNode{ fileName: string operName: 'FileReader' /** 一次读入的数据量 */ dataLength: number constructor(loc: YYLTYPE,fileName:string,dataLength: number) } export class compositeCallNode extends operNode { compName: string inputs?: string[] params: expNode[] _symbol_table: SymbolTable constructor(loc: YYLTYPE, compName: string, inputs?: string[], params?: expNode[]) } export class operatorNode extends operNode { operName: string inputs: string[] operBody: operBodyNode _symbol_table: SymbolTable constructor(loc: YYLTYPE, operName: string, inputs: string[], operBody: operBodyNode) } export class splitjoinNode extends operNode { compName: string inputs?: string[] stmt_list: statement[] split: splitNode body_stmts: statement[] join: joinNode constructor(loc: YYLTYPE, options: object) } export class pipelineNode extends operNode { compName: "pipeline" inputs?: string[] body_stmts: statement[] } export class splitNode extends Node { name: "split" type: "duplicate" | "roundrobin" arg_list?: constantNode[] constructor(loc: YYLTYPE, node: duplicateNode | roundrobinNode) } export class joinNode extends Node { name: "join" type: "duplicate" | "roundrobin" arg_list?: constantNode[] constructor(loc: YYLTYPE, node: duplicateNode | roundrobinNode) } export class duplicateNode extends Node { arg_list: constantNode[] } export class roundrobinNode extends Node { arg_list: constantNode[] } export class addNode extends Node { name: "add" content: pipelineNode | splitjoinNode constructor(loc: YYLTYPE, content: pipelineNode | splitjoinNode) } /********************************************************/ /* 矩阵相关 node */ /********************************************************/ export class matrix_constant extends Node { /** rawData 是存储矩阵原始数据的多维数组. 维数不确定, 1/2/3维分别可表示 向量/矩阵/矩阵数组 */ rawData: [exp] | [[exp]] | [[[exp]]] /** shape 表示矩阵相关数据的维度, 例如一维向量shape为[5], 二维矩阵为[5,5], 图像 RGB 矩阵为[3,28,28]*/ shape: number[] constructor(loc: YYLTYPE, rawData: Array<exp, matrix_constant>) } /* 存放矩阵切片的下标, 例如 vector[0:5] 表示 下标[0,5) 即0~5不含5 兼容多重格式(_表示 undefined), 例如 * [1:5] --- { start: 1, op:':', end: 5 } * [1:] --- { start: 1, op:':', end: _ } * [:5] --- { start: _, op:':', end: 5 } * [:] --- { start: _, op:':', end: _ } * [0] --- { start: 0, op: _ , end: _ } */ export class matrix_slice_pair extends Node { start?: number op?: ':' end?: number constructor(loc, start, op, end) } /** 存放 name[1:4, 2:5] 的结构, 寓意为矩阵切片结果, 也可存储 Out[0]等流变量寻址 */ export class matrix_section extends expNode{ exp:string slice_pair_list: matrix_slice_pair[] constructor(loc, exp, slice_pair_list) } /** 神经网络相关 node */ export class sequentialNode extends operNode { compName: string arg_list: exp[] body_stmts: statement[] constructor(loc: YYLTYPE, options: object) } export class layerNode extends Node { layerName: string arg_list: exp[] prevLayer: layerNode nextLayer: layerNode inputSize : number[] level: number constructor(loc: YYLTYPE,layerName: string, arg_list: Node[]) } export class denseLayerNode extends layerNode { rows: number cols: number } export class conv2DLayerNode extends layerNode { /** 输出空间的维度 (即卷积中滤波器的输出数量) */ filters: number; /** 对于conv2D, 为2 */ dimension: number; /* 2D 卷积窗口的宽度和高度 */ kernel_size: number[]; /* 卷积沿宽度和高度方向的步长 */ strides: number[]; /* 扩展, 一般为[0,0] */ paddings: number[]; /* 正向傳播過程输出的特征图的尺寸(2維) */ outputFeatureMapSize: number[]; inputErrorSize: number[]; } export class maxPooling2DLayerNode extends layerNode { /** 整数,池化层的窗口大小 */ pool_size: number /** 输入空间的维度 */ depth: number /** 经过池化后输出的尺寸 */ outputPooledSize:number[] } export class averagePooling2DLayerNode extends layerNode { /** 整数,池化层的窗口大小 */ pool_size: number /** 输入空间的维度 */ depth: number /** 经过池化后输出的尺寸 */ outputPooledSize:number[] } export class activationLayerNode extends layerNode { count: number }