pddl-workspace
Version:
176 lines • 6.9 kB
JavaScript
;
/* --------------------------------------------------------------------------------------------
* 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