gerber-to-svg
Version:
Gerber and NC drill file to SVG converter
98 lines (89 loc) • 2.21 kB
JavaScript
(function() {
var NUMBER, OPERATOR, TOKEN, isNumber, parse, tokenize;
OPERATOR = /[\+\-\/xX\(\)]/;
NUMBER = /[\$\d\.]+/;
TOKEN = new RegExp("(" + OPERATOR.source + ")|(" + NUMBER.source + ")", 'g');
tokenize = function(arith) {
var results;
return results = arith.match(TOKEN);
};
isNumber = function(token) {
return NUMBER.test(token);
};
parse = function(arith) {
var consume, index, parseExpression, parseMultiplication, parsePrimary, peek, tokens;
tokens = tokenize(arith);
index = 0;
peek = function() {
return tokens[index];
};
consume = function(t) {
if (t === peek()) {
return index++;
}
};
parsePrimary = function() {
var exp, t;
t = peek();
consume(t);
if (isNumber(t)) {
exp = {
type: 'n',
val: t
};
} else if (t === '(') {
exp = parseExpression();
if (peek() !== ')') {
throw new Error("expected ')'");
} else {
consume(')');
}
} else {
throw new Error("" + t + " is unexpected in an arithmetic string");
}
return exp;
};
parseMultiplication = function() {
var exp, rhs, t;
exp = parsePrimary();
t = peek();
while (t === 'x' || t === '/' || t === 'X') {
consume(t);
if (t === 'X') {
console.warn("Warning: uppercase 'X' as multiplication symbol is incorrect; macros should use lowercase 'x' to multiply");
t = 'x';
}
rhs = parsePrimary();
exp = {
type: t,
left: exp,
right: rhs
};
t = peek();
}
return exp;
};
parseExpression = function() {
var exp, rhs, t;
exp = parseMultiplication();
t = peek();
while (t === '+' || t === '-') {
consume(t);
rhs = parseMultiplication();
exp = {
type: t,
left: exp,
right: rhs
};
t = peek();
}
return exp;
};
return parseExpression();
};
module.exports = {
tokenize: tokenize,
isNumber: isNumber,
parse: parse
};
}).call(this);