import Operand from './Operand'; import Operator from './Operator' import ListOfNumbers from './ListOfNumbers'; import BitwiseOperation from './BitwiseOperation'; import { Expression, ExpressionElement } from './expression-interfaces'; import { numberParser } from './numberParser'; export { default as Operand } from './Operand'; export { default as Operator } from './Operator'; export { default as ListOfNumbers } from './ListOfNumbers'; export { default as BitwiseOperation } from './BitwiseOperation'; interface IExpressionParserFactory { canCreate: (input: string) => boolean; create: (input: string) => Expression; }; class ExpressionParser { factories: IExpressionParserFactory[]; constructor() { this.factories = []; }; canParse (input: string) : boolean { var trimmed = input.replace(/^\s+|\s+$/, ''); var i = this.factories.length-1; for(;i>=0;i--) { if(this.factories[i].canCreate(trimmed)){ return true; } } return false; }; parse (input: string) : Expression | null { var trimmed = input.replace(/^\s+|\s+$/, ''); var i = 0, l = this.factories.length, factory; for(;i p.length > 0) .map(p => numberParser.caseParse(p)) .filter(n => n === false) .length === 0; }; create (input : string) : Expression { const numbers = input.split(' ') .filter(p => p.length > 0) .map(m => parseScalarValue(m)); return new ListOfNumbers(input, numbers); } } class BitwiseOperationExpressionFactory implements IExpressionParserFactory { fullRegex: RegExp; regex: RegExp; constructor() { this.fullRegex = /^[-,~,<,>,&,^|,*,/,-,b,x,l,s,u,a-f,0-9,+\s]+$/i; this.regex = /(<<|>>|>>>|\||&|\^|\+|\*|\/|(?