pddl-workspace
Version:
141 lines • 8.23 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.PddlDomainParser = void 0;
const PddlTokenizer_1 = require("./PddlTokenizer");
const VariablesParser_1 = require("./VariablesParser");
const DocumentPositionResolver_1 = require("../DocumentPositionResolver");
const DerivedVariableParser_1 = require("./DerivedVariableParser");
const DomainInfo_1 = require("../DomainInfo");
const InstantActionParser_1 = require("./InstantActionParser");
const DurativeActionParser_1 = require("./DurativeActionParser");
const PddlInheritanceParser_1 = require("./PddlInheritanceParser");
const PddlConstraintsParser_1 = require("./PddlConstraintsParser");
const PddlSyntaxTreeBuilder_1 = require("./PddlSyntaxTreeBuilder");
const PddlFileParser_1 = require("./PddlFileParser");
const vscode_uri_1 = require("vscode-uri");
const SyntaxInjector_1 = require("../injector/SyntaxInjector");
const JobSchedulingSyntaxInjector_1 = require("../injector/JobSchedulingSyntaxInjector");
/**
* Planning Domain parser.
*/
class PddlDomainParser extends PddlFileParser_1.PddlFileParser {
constructor(options) {
var _a;
super();
this.injectors = (_a = options === null || options === void 0 ? void 0 : options.injectors) !== null && _a !== void 0 ? _a : new SyntaxInjector_1.SyntaxInjectors([new JobSchedulingSyntaxInjector_1.JobSchedulingSyntaxInjector()]);
}
async tryParse(fileUri, fileVersion, fileText, syntaxTree, positionResolver) {
//(define (domain domain_name)
const defineNode = syntaxTree.getDefineNode();
if (!defineNode) {
return undefined;
}
const domainNode = defineNode.getFirstOpenBracket('domain');
if (!domainNode) {
return undefined;
}
return this.parse(fileUri, fileVersion, fileText, domainNode, syntaxTree, positionResolver);
}
parse(fileUri, fileVersion, fileText, domainNode, syntaxTree, positionResolver) {
const domainNameNode = domainNode.getFirstChild(PddlTokenizer_1.PddlTokenType.Other, /./);
if (!domainNameNode)
return undefined;
const domainName = domainNameNode.getToken().tokenText;
const domainInfo = new DomainInfo_1.DomainInfo(fileUri, fileVersion, domainName, syntaxTree, positionResolver);
domainInfo.setText(fileText);
this.parseDomainStructure(domainInfo, positionResolver);
this.inject(domainInfo, positionResolver);
return domainInfo;
}
static parseText(domainText, fileNameOrIdentifier = vscode_uri_1.URI.parse('string://noname'), version = -1) {
const parser = new PddlSyntaxTreeBuilder_1.PddlSyntaxTreeBuilder(domainText);
const syntaxTree = parser.getTree();
//(define (domain domain_name)
const defineNode = syntaxTree.getDefineNode();
if (!defineNode) {
return undefined;
}
const domainNode = defineNode.getFirstOpenBracket('domain');
if (!domainNode) {
return undefined;
}
const positionResolver = new DocumentPositionResolver_1.SimpleDocumentPositionResolver(domainText);
return new PddlDomainParser().parse(fileNameOrIdentifier, version, domainText, domainNode, syntaxTree, positionResolver);
}
parseDomainStructure(domainInfo, positionResolver) {
const defineNode = domainInfo.syntaxTree.getDefineNodeOrThrow();
PddlDomainParser.parseRequirements(defineNode, domainInfo);
const typesNode = defineNode.getFirstOpenBracket(':types');
if (typesNode) {
domainInfo.setTypeInheritance(PddlInheritanceParser_1.PddlInheritanceParser.parseInheritance(typesNode.getNestedNonCommentText()), typesNode, positionResolver);
}
const constantsNode = defineNode.getFirstOpenBracket(':constants');
if (constantsNode) {
const constantsText = constantsNode.getNestedNonCommentText();
domainInfo.setConstants(PddlInheritanceParser_1.PddlInheritanceParser.toTypeObjects(PddlInheritanceParser_1.PddlInheritanceParser.parseInheritance(constantsText)), constantsNode);
}
const predicatesNode = defineNode.getFirstOpenBracket(':predicates');
if (predicatesNode) {
const predicates = new VariablesParser_1.VariablesParser(predicatesNode, positionResolver).getVariables();
domainInfo.setPredicates(predicates, predicatesNode);
}
const functionsNode = defineNode.getFirstOpenBracket(':functions');
if (functionsNode) {
const functions = new VariablesParser_1.VariablesParser(functionsNode, positionResolver).getVariables();
domainInfo.setFunctions(functions, functionsNode);
}
domainInfo.setDerived(PddlDomainParser.parseDerived(defineNode, positionResolver));
const instantActions = this.parseActionProcessOrEvent(defineNode, positionResolver, "action");
const durativeActions = this.parseDurativeActions(defineNode, positionResolver);
const jobs = this.parseJob(defineNode, positionResolver);
domainInfo.setActions(instantActions.concat(durativeActions).concat(jobs));
const processes = this.parseActionProcessOrEvent(defineNode, positionResolver, "process");
const events = this.parseActionProcessOrEvent(defineNode, positionResolver, "event");
domainInfo.setProcesses(processes);
domainInfo.setEvents(events);
const constraintsNode = defineNode.getFirstOpenBracket(':constraints');
if (constraintsNode) {
const constraints = new PddlConstraintsParser_1.PddlConstraintsParser().parseConstraints(constraintsNode);
domainInfo.setConstraints(constraints);
}
}
static parseRequirements(defineNode, fileInfo) {
const requirementsNode = defineNode.getFirstOpenBracket(':requirements');
if (requirementsNode) {
const requirements = requirementsNode.getNonWhitespaceChildren()
.filter(node => node.getToken().type === PddlTokenizer_1.PddlTokenType.Keyword)
.map(node => node.getToken().tokenText.toLowerCase());
fileInfo.setRequirements(requirements, requirementsNode);
}
else {
fileInfo.setRequirements([], requirementsNode);
}
}
static parseDerived(defineNode, positionResolver) {
return defineNode.getChildrenOfType(PddlTokenizer_1.PddlTokenType.OpenBracketOperator, /\(\s*:derived$/)
.map(derivedNode => new DerivedVariableParser_1.DerivedVariablesParser(derivedNode, positionResolver).getVariable())
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
.filter(derived => !!derived).map(derived => derived);
}
parseActionProcessOrEvent(defineNode, positionResolver, keyword) {
return defineNode.getChildrenOfType(PddlTokenizer_1.PddlTokenType.OpenBracketOperator, new RegExp("\\(\\s*:" + keyword + "$"))
.map(actionNode => new InstantActionParser_1.InstantActionParser(actionNode, positionResolver).getAction());
}
parseDurativeActions(defineNode, positionResolver) {
return defineNode.getChildrenOfType(PddlTokenizer_1.PddlTokenType.OpenBracketOperator, /\(\s*:durative-action$/)
.map(actionNode => new DurativeActionParser_1.DurativeActionParser(actionNode, positionResolver).getAction());
}
parseJob(defineNode, positionResolver) {
return defineNode.getChildrenOfType(PddlTokenizer_1.PddlTokenType.OpenBracketOperator, /\(\s*:job$/)
.map(actionNode => new DurativeActionParser_1.JobParser(actionNode, positionResolver).getAction());
}
inject(domainInfo, positionResolver) {
this.injectors.process(domainInfo, positionResolver);
}
}
exports.PddlDomainParser = PddlDomainParser;
//# sourceMappingURL=PddlDomainParser.js.map