UNPKG

pddl-workspace

Version:
141 lines 8.23 kB
"use strict"; /* -------------------------------------------------------------------------------------------- * 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