pddl-workspace
Version:
67 lines • 2.76 kB
JavaScript
;
/* --------------------------------------------------------------------------------------------
* Copyright (c) Jan Dolejsi. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
* ------------------------------------------------------------------------------------------ */
Object.defineProperty(exports, "__esModule", { value: true });
exports.NumericExpressionParser = void 0;
// import { PddlTokenType } from "./PddlTokenizer";
// import { PddlRange, DocumentPositionResolver } from "../DocumentPositionResolver";
const NumericExpression_1 = require("../NumericExpression");
const __1 = require("..");
/**
* Parses `(+ (a) (b))` numeric expressions.
*/
class NumericExpressionParser {
constructor(rootNode) {
this.expression = this.parseNode(rootNode);
}
getExpression() {
return this.expression;
}
parseNode(node) {
switch (node.getToken().tokenText) {
case '(+':
const summants = this.parseChildren(node);
return new NumericExpression_1.Sum(summants);
case '(*':
const multiplicants = this.parseChildren(node);
return new NumericExpression_1.Product(multiplicants);
case '(/': {
const operands = this.parseChildren(node);
if (operands.length === 2) {
return new NumericExpression_1.Division(operands[0], operands[1]);
}
else {
return undefined;
}
}
case '(-': {
const operands = this.parseChildren(node);
if (operands.length === 2) {
return new NumericExpression_1.Subtraction(operands[0], operands[1]);
}
else {
return undefined;
}
}
}
if (node.getToken().tokenText.startsWith('(')) {
return new __1.VariableExpression(node.getNestedText());
}
else if (parseFloat(node.getToken().tokenText)) {
// the parsed value may be NaN
return new NumericExpression_1.NumericLiteral(parseFloat(node.getToken().tokenText));
}
return undefined;
}
parseChildren(node) {
return node.getNonWhitespaceNonCommentChildren()
.map(childNode => this.parseNode(childNode))
// todo: should not be filtering out elements that failed to parse, but rather reporting the failure
.filter(c => !!c)
.map(c => c);
}
}
exports.NumericExpressionParser = NumericExpressionParser;
//# sourceMappingURL=NumericExpressionParser.js.map