strips
Version:
Basic AI planning with STRIPS and PDDL.
105 lines (80 loc) • 3.06 kB
Plain Text
/*
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\_\-\;\?\.\:\!\@\
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; }