UNPKG

@scalenc/nc-format

Version:

Library for handling TRUMPF NC file format.

167 lines 7.67 kB
"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