Implemented support of hex mode for expression parser

This commit is contained in:
Borys Levytskyi
2015-04-11 19:41:27 +03:00
parent 81a9c9ba77
commit dbca2e03b4
2 changed files with 57 additions and 17 deletions

View File

@@ -1,32 +1,47 @@
app.set('expression', function() {
"use strict";
var decNumber = "\d+";
var hexNumber = "(?:\d|a|b|c|d|e|f)";
var twoOperandsRegex = /^(\d+)\s*(<<|>>|\||\&|\^)\s*(\d+)$/;
var numbersList = /^((\d*)+\s?)+$/;
var modes = {
'dec': {
expr: /^(\d+)\s*(<<|>>|\||\&|\^)\s*(\d+)$/,
list: /^((\d*)+\s?)+$/
},
'hex': {
expr: /^([\d,a-f]+)\s*(<<|>>|\||\&|\^)\s*([\d,a-f]+)$/,
list: /^(([\d,a-f]*)+\s?)+$/
}
};
return {
canParse: function(string) {
return twoOperandsRegex.test(string) || numbersList.test(string);
canParse: function(string, mode) {
var regex = modes[mode || 'dec'];
return regex.expr.test(string) || regex.list.test(string);
},
parse: function(string) {
parse: function(string, mode) {
mode = (mode || 'dec');
var trimmed = string.replace(/^\s+|\s+$/, '');
var matches = twoOperandsRegex.exec(trimmed);
var regex = modes[mode];
var base = getBase(mode);
var matches = regex.expr.exec(trimmed);
if(matches != null) {
return createCalculableExpression(matches);
return createCalculableExpression(matches, base);
}
matches = numbersList.exec(string);
matches = regex.list.exec(string);
if(matches != null) {
return createListOfNumbersExpression(string)
return createListOfNumbersExpression(string, base)
}
}
};
function createCalculableExpression(matches) {
function createCalculableExpression(matches, base) {
var o1 = parseInt(matches[1], 10);
var o2 = parseInt(matches[3], 10);
var o1 = parseInt(matches[1], base);
var o2 = parseInt(matches[3], base);
var m = new app.models.BitwiseOperation();
m.operand1 = o1;
@@ -38,15 +53,23 @@ app.set('expression', function() {
return m;
}
function createListOfNumbersExpression(input) {
function createListOfNumbersExpression(input, base) {
var numbers = [];
input.split(' ').forEach(function(n){
if(n.trim().length > 0) {
numbers.push(parseInt(n));
numbers.push(parseInt(n, base));
}
});
return new app.models.BitwiseNumbers(numbers);
}
function getBase(mode) {
switch (mode){
case 'bin': return 2;
case 'hex': return 16;
case 'dec': return 10;
}
}
});