UNPKG

pddl-workspace

Version:
176 lines 6.9 kB
"use strict"; /* -------------------------------------------------------------------------------------------- * Copyright (c) Jan Dolejsi 2019. 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.ActionEffectParser = exports.MakeTrueEffect = exports.AssignEffect = exports.ScaleDownEffect = exports.ScaleUpEffect = exports.DecreaseEffect = exports.IncreaseEffect = exports.MakeFalseEffect = exports.ExpressionEffect = exports.UnrecognizedEffect = exports.VariableEffect = exports.Effect = void 0; const language_1 = require("../language"); function parseTerm(termText) { if (termText.startsWith('?')) { return new language_1.Parameter(termText.slice(1), "object"); } else { return new language_1.ObjectInstance(termText, "object"); } } function parseVariable(node) { const fragments = node.getNestedText().split(/\s+/); return new language_1.Variable(fragments[0], fragments.slice(1).map(term => parseTerm(term))); } class Effect { constructor(node) { this.node = node; } toPddlString() { return this.node.getText(); } } exports.Effect = Effect; class VariableEffect extends Effect { constructor(node, variableModified) { super(node); this.variableModified = variableModified; } getVariableModified() { return this.variableModified; } modifies(variable) { return this.variableModified.name.toLowerCase() === variable.name.toLowerCase(); } } exports.VariableEffect = VariableEffect; class UnrecognizedEffect extends Effect { constructor(node) { super(node); } } exports.UnrecognizedEffect = UnrecognizedEffect; class ExpressionEffect extends VariableEffect { constructor(node, variableModified, expressionNode) { super(node, variableModified); this.expressionNode = expressionNode; } static parseBase(node, expectedToken, creator) { if (node.getToken().tokenText !== expectedToken) { throw new Error(`Invalid '${expectedToken}' effect: ` + node.getText()); } const children = node.getNonWhitespaceNonCommentChildren(); if (children.length === 2) { return creator.apply(this, [node, parseVariable(children[0]), children[1]]); } else { throw new Error(`Invalid '${expectedToken}' effect: ` + node.getText()); } } } exports.ExpressionEffect = ExpressionEffect; class MakeFalseEffect extends VariableEffect { constructor(node, variableModified) { super(node, variableModified); } static parse(node) { if (node.getToken().tokenText !== this.TOKEN) { throw new Error("Invalid 'not' effect: " + node.getText()); } const children = node.getNonWhitespaceNonCommentChildren(); if (children.length === 1) { return new MakeFalseEffect(node, parseVariable(children[0])); } else { throw new Error("Invalid 'not' effect: " + node.getText()); } } } exports.MakeFalseEffect = MakeFalseEffect; MakeFalseEffect.TOKEN = '(not'; class IncreaseEffect extends ExpressionEffect { constructor(node, variableModified, expressionNode) { super(node, variableModified, expressionNode); } static parse(node) { return this.parseBase(node, this.TOKEN, (node, variable, expressionNode) => new IncreaseEffect(node, variable, expressionNode)); } } exports.IncreaseEffect = IncreaseEffect; IncreaseEffect.TOKEN = '(increase'; class DecreaseEffect extends ExpressionEffect { constructor(node, variableModified, expressionNode) { super(node, variableModified, expressionNode); } static parse(node) { return this.parseBase(node, this.TOKEN, (node, variable, expressionNode) => new DecreaseEffect(node, variable, expressionNode)); } } exports.DecreaseEffect = DecreaseEffect; DecreaseEffect.TOKEN = '(decrease'; class ScaleUpEffect extends ExpressionEffect { constructor(node, variableModified, expressionNode) { super(node, variableModified, expressionNode); } static parse(node) { return this.parseBase(node, this.TOKEN, (node, variable, expressionNode) => new ScaleUpEffect(node, variable, expressionNode)); } } exports.ScaleUpEffect = ScaleUpEffect; ScaleUpEffect.TOKEN = '(scale-up'; class ScaleDownEffect extends ExpressionEffect { constructor(node, variableModified, expressionNode) { super(node, variableModified, expressionNode); } static parse(node) { return this.parseBase(node, this.TOKEN, (node, variable, expressionNode) => new ScaleDownEffect(node, variable, expressionNode)); } } exports.ScaleDownEffect = ScaleDownEffect; ScaleDownEffect.TOKEN = '(scale-down'; class AssignEffect extends ExpressionEffect { constructor(node, variableModified, expressionNode) { super(node, variableModified, expressionNode); } static parse(node) { return this.parseBase(node, this.TOKEN, (node, variable, expressionNode) => new AssignEffect(node, variable, expressionNode)); } } exports.AssignEffect = AssignEffect; AssignEffect.TOKEN = '(assign'; class MakeTrueEffect extends VariableEffect { constructor(node, variableModified) { super(node, variableModified); } static parse(node) { if (this.TOKENS.includes(node.getToken().tokenText)) { return this.parse(node.getSingleNonWhitespaceChild()); } return new MakeTrueEffect(node, parseVariable(node)); } } exports.MakeTrueEffect = MakeTrueEffect; MakeTrueEffect.TOKENS = ['(and', '(at start', '(at end']; class ActionEffectParser { static parseEffect(node) { switch (node.getToken().tokenText) { case MakeFalseEffect.TOKEN: return MakeFalseEffect.parse(node); case AssignEffect.TOKEN: return AssignEffect.parse(node); case IncreaseEffect.TOKEN: return IncreaseEffect.parse(node); case DecreaseEffect.TOKEN: return DecreaseEffect.parse(node); case ScaleUpEffect.TOKEN: return ScaleUpEffect.parse(node); case ScaleDownEffect.TOKEN: return ScaleDownEffect.parse(node); default: if (node.isLeaveBracket() || MakeTrueEffect.TOKENS.includes(node.getToken().tokenText)) { return MakeTrueEffect.parse(node); } else { return new UnrecognizedEffect(node); } } } } exports.ActionEffectParser = ActionEffectParser; //# sourceMappingURL=ActionEffectParser.js.map