import PRuleTokenFilter from "./PRuleTokenFilter"; import ApplyOperatorPrecedence from "../postprocess/ApplyOperatorPrecedence"; import IGrammarProcessor from "../postprocess/IGrammarProcessor"; import GPrecedenceTokens from "./GPrecedenceTokens"; export default class GRuleToken { constructor(){ } name:string = null; prefix:string = null; suffix:string = null; contentTokens:Array; multiTokens:boolean = false; filter:string; comment:string; filters:Array; init():void { } } // class export class GNodeToken extends GRuleToken { constructor() { super() } precedenceTokens:Array; init():void { this.contentTokens = []; if (this.precedenceTokens) { var precedenceLine:GPrecedenceTokens for (precedenceLine of this.precedenceTokens) { var tokenList:Array = precedenceLine.values var token:string for (token of tokenList) { this.contentTokens.push(token); } } } this.contentTokens.sort(GNodeToken.onLength); } // init static onLength(a1:string, a2:string):number { if (a1.length > a2.length) { return -1; } else if (a1.length == a2.length) { return 0; } return 1 } // default names of nodes, can be overrideed ie ^OP: (op) -> (left) (right) opName:string = "operator"; firstNodeName:string = "first"; secondNodeName:string = "second"; // associativity isL:boolean = false; isR:boolean = false; private _processor:ApplyOperatorPrecedence; createGrammarProcessor():IGrammarProcessor { if (!this._processor) { this._processor = new ApplyOperatorPrecedence(); var operators:Array = []; var assocTable:any = {}; var precedenceLine:any for (precedenceLine of this.precedenceTokens) { operators.push(precedenceLine.values); var opValue:string for (opValue of precedenceLine.values) { assocTable[opValue] = precedenceLine.isL ? true : false; // Default to Right associative } } let processor = this._processor processor.assocTable = assocTable; processor.operators = operators; processor.opName = this.opName; processor.firstNodeName = this.firstNodeName processor.secondNodeName = this.secondNodeName; } return this._processor; } // createGrammarProcessor } // class