UNPKG

strips

Version:

Basic AI planning with STRIPS and PDDL.

105 lines (80 loc) 3.06 kB
/* PDDL2JSON - PEG.js (http://pegjs.org) grammar parser script for converting PDDL to JSON. Designed for strips "domain" files. Copyright (c) 2015 Kory Becker http://primaryobjects.com/kory-becker */ program = result:domain { return result; } domain = space* delimiter* "define" space* delimiter* "domain" space* domainName:word delimiter* req:req? constants:constants? types:types* predicates:predicates? actions:action* { return { domain: domainName.join('').replace(/[,:?]/g, ''), requirements: req || [], types: types ? types[0] : null, actions: actions }; } req = ":requirements" req:reqType* delimiter* { var result = []; for (var i in req) { result.push(req[i]); } return result; } reqType = space* ":" req:word { return req.join('').replace(/[,:?]/g, ''); } types = ":types" names:typeName* delimiter* { var result = []; for (var i in names) { result.push(names[i]); } return result; } typeName = space* name:word { return name.join('').replace(/[,:?]/g, ''); } constants = ":constants" space* names:constant+ delimiter* { var result = []; for (var i in names) { result.push(names[i]); } return result; } constant = name:word+ space* { return name.join('').replace(/[,:?]/g, ''); } predicates = ":predicates" space* pred:predicate* delimiter* { var result = []; for (var i in pred) { result.push(pred[i]); } return result; } predicate = delimiter* name:word+ space* param:parameterTyped* { return { name: name.join('').replace(/[,:?]/g, ''), parameters: param }; } action = ":action" space* operationName:word parameters:parametersTyped precondition:precondition effect:effect { return { action: operationName.join('').replace(/[,:?]/g, ''), parameters: parameters, precondition: precondition, effect: effect }; } logic = operation:logicOp* delimiter* action:word space* params:parameter* delimiter* { return { operation: operation.join('').replace(/[,:? ]/g, ''), action: action.join('').replace(/[,:? ]/g, ''), parameters: params }; } boolean = "#t" / "#f" integer = [1-9] [0-9]* string = "\"" ("\\" . / [^"])* "\"" word = word:([a-zA-Z0-9\-]+) { return word; } symbol = (!delimiter .)+ space = [\n\r\t ] / comment paren = "(" / ")" logicOp = "and" / "not" delimiter = paren / space comment = ";" [a-zA-Z0-9\_\-\;\?\.\:\!\@\#\$\%\^\&\*\~\(\)\[\]\{\}\'\"\<\>\,\/\\ ]* [\n\r] parameters = space* ":parameters" delimiter+ params:parameter+ delimiter space* { return params; } parameter = "?" param:word space* { return param.join('').replace(/[,:? ]/g, ''); } parametersTyped = space* ":parameters" delimiter+ params:parameterTyped+ delimiter space* { return params; } parameterTyped = "?" param:word space* type:type? { return { parameter: param.join('').replace(/[,:? ]/g, ''), type: type }; } type = "-" space* name:word space* { return name.join('').replace(/[,:? ]/g, ''); } precondition = space* ":precondition" delimiter+ logic:logic+ { return logic; } effect = space* ":effect" delimiter+ logic:logic+ { return logic; }