@scalenc/nc-format
Version:
Library for handling TRUMPF NC file format.
167 lines • 7.67 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ExpressionWriter = void 0;
const models_1 = require("../models");
const Constants_1 = require("./Constants");
class ExpressionWriter {
stream;
constructor(stream) {
this.stream = stream;
}
onBinaryOperation(o) {
let op;
switch (o.operator) {
case models_1.BinaryOperator.MULTIPLY:
op = Constants_1.Constants.MULTIPLY_OPERATOR;
break;
case models_1.BinaryOperator.DIVIDE:
op = Constants_1.Constants.DIVIDE_OPERATOR;
break;
case models_1.BinaryOperator.DIV_DIVIDE:
op = Constants_1.Constants.SPACE + Constants_1.Constants.DIV_OPERATOR + Constants_1.Constants.SPACE;
break;
case models_1.BinaryOperator.MODULO:
op = Constants_1.Constants.SPACE + Constants_1.Constants.MOD_OPERATOR + Constants_1.Constants.SPACE;
break;
case models_1.BinaryOperator.ADD:
op = Constants_1.Constants.ADD_OPERATOR;
break;
case models_1.BinaryOperator.SUBTRACT:
op = Constants_1.Constants.SUBTRACT_OPERATOR;
break;
case models_1.BinaryOperator.B_AND:
op = Constants_1.Constants.SPACE + Constants_1.Constants.B_AND_OPERATOR + Constants_1.Constants.SPACE;
break;
case models_1.BinaryOperator.B_XOR:
op = Constants_1.Constants.SPACE + Constants_1.Constants.B_XOR_OPERATOR + Constants_1.Constants.SPACE;
break;
case models_1.BinaryOperator.B_OR:
op = Constants_1.Constants.SPACE + Constants_1.Constants.B_OR_OPERATOR + Constants_1.Constants.SPACE;
break;
case models_1.BinaryOperator.AND:
op = Constants_1.Constants.SPACE + Constants_1.Constants.AND_OPERATOR + Constants_1.Constants.SPACE;
break;
case models_1.BinaryOperator.XOR:
op = Constants_1.Constants.SPACE + Constants_1.Constants.XOR_OPERATOR + Constants_1.Constants.SPACE;
break;
case models_1.BinaryOperator.OR:
op = Constants_1.Constants.SPACE + Constants_1.Constants.OR_OPERATOR + Constants_1.Constants.SPACE;
break;
case models_1.BinaryOperator.CONCAT:
op = Constants_1.Constants.SPACE + Constants_1.Constants.CONCAT_OPERATOR + Constants_1.Constants.SPACE;
break;
case models_1.BinaryOperator.EQUAL:
op = Constants_1.Constants.SPACE + Constants_1.Constants.EQUAL_OPERATOR + Constants_1.Constants.SPACE;
break;
case models_1.BinaryOperator.INEQUAL:
op = Constants_1.Constants.SPACE + Constants_1.Constants.INEQUAL_OPERATOR + Constants_1.Constants.SPACE;
break;
case models_1.BinaryOperator.GREATER:
op = Constants_1.Constants.SPACE + Constants_1.Constants.GREATER_OPERATOR + Constants_1.Constants.SPACE;
break;
case models_1.BinaryOperator.LESS:
op = Constants_1.Constants.SPACE + Constants_1.Constants.LESS_OPERATOR + Constants_1.Constants.SPACE;
break;
case models_1.BinaryOperator.GREATER_EQUAL:
op = Constants_1.Constants.SPACE + Constants_1.Constants.GREATER_EQUAL_OPERATOR + Constants_1.Constants.SPACE;
break;
case models_1.BinaryOperator.LESS_EQUAL:
op = Constants_1.Constants.SPACE + Constants_1.Constants.LESS_EQUAL_OPERATOR + Constants_1.Constants.SPACE;
break;
default:
throw new Error(`Unknown binary operation ${o.operator}`);
}
o.leftExpression.visit(this);
this.stream.write(op);
o.rightExpression.visit(this);
}
onBracket(b) {
this.stream.write(Constants_1.Constants.OPENING_BRACE);
b.innerExpression.visit(this);
this.stream.write(Constants_1.Constants.CLOSING_BRACE);
}
onFunction(f) {
this.stream.write(f.name);
this.stream.write(Constants_1.Constants.OPENING_BRACE);
f.args.forEach((a, i) => {
if (i > 0) {
this.stream.write(Constants_1.Constants.ARGUMENT_SEPARATOR);
}
if (a !== undefined && a !== null) {
a.visit(this);
}
});
this.stream.write(Constants_1.Constants.CLOSING_BRACE);
}
onNumber(n) {
if (n.isInteger) {
const value = n.value;
switch (n.numberFormat) {
case models_1.NumberFormat.HEXADECIMAL:
this.stream.write(Constants_1.Constants.NUMBER_CONSTANT_SEPARATOR);
this.stream.write('H');
this.stream.write(value.toString(16));
this.stream.write(Constants_1.Constants.NUMBER_CONSTANT_SEPARATOR);
break;
case models_1.NumberFormat.BINARY:
this.stream.write(Constants_1.Constants.NUMBER_CONSTANT_SEPARATOR);
this.stream.write('B');
this.stream.write(value.toString(2));
this.stream.write(Constants_1.Constants.NUMBER_CONSTANT_SEPARATOR);
break;
case models_1.NumberFormat.DECIMAL:
this.stream.write(value.toString());
break;
default:
throw new Error(`Unknown number format ${n.numberFormat}`);
}
}
else {
if (n.numberFormat !== models_1.NumberFormat.DECIMAL) {
throw new Error(`Expected decimal number format for decimal numbers, but found ${n.numberFormat}`);
}
this.stream.write(n.value.toString());
}
}
onString(s) {
this.stream.write(Constants_1.Constants.STRING_SEPARATOR);
this.stream.write(s.value); // Is there any escaping mechanism?
this.stream.write(Constants_1.Constants.STRING_SEPARATOR);
}
onUnaryOperation(o) {
switch (o.operator) {
case models_1.UnaryOperator.NOT:
this.stream.write(Constants_1.Constants.LOGICAL_NOT_OPERATOR);
break;
case models_1.UnaryOperator.B_NOT:
this.stream.write(Constants_1.Constants.BITWISE_NOT_OPERATOR);
break;
case models_1.UnaryOperator.NEGATE:
this.stream.write(Constants_1.Constants.MINUS_SIGN);
break;
case models_1.UnaryOperator.TO_STRING:
this.stream.write(Constants_1.Constants.CONCAT_OPERATOR);
break;
default:
throw new Error(`Unknown unary operator ${o.operator}`);
}
o.expression.visit(this);
}
onVariable(v) {
this.stream.write(v.name);
if (v.fieldExpressions) {
this.stream.write(Constants_1.Constants.OPENING_FIELD_BRACE);
v.fieldExpressions.forEach((e, i) => {
if (i > 0) {
this.stream.write(Constants_1.Constants.ARGUMENT_SEPARATOR);
}
if (e !== undefined && e !== null) {
e.visit(this);
}
});
this.stream.write(Constants_1.Constants.CLOSING_FIELD_BRACE);
}
}
}
exports.ExpressionWriter = ExpressionWriter;
//# sourceMappingURL=ExpressionWriter.js.map