Я написал следующий синтаксический анализатор (вставить в http://pegjs.org/online и он работает):PEG.js помощь - необязательно свободный текст следуют пар ключ-значение
Expression = Pairs/FullTextWithPairs
Pairs = (';'? _ p:Pair { return p; })*
FullTextWithPairs = fto:FullText po:Pairs
{
\t var arr = [];
if (fto) {
\t arr.push(fto);
}
return arr.concat(po);
}
FullText = ft:ValueString ';'
\t {
\t return {'key' : 'fullText', 'op': '=', 'value': ft};
}
Pair = k:Field op:Operator v:ValueString
\t {
\t var res = {'key' : k, 'op': op, 'value': v};
console.log(res);
return res;
}
Operator = ('<>'/[=><])
ValueString = vs:[^;]+ {return vs.join('');}
Field = 'location'/'application'/'count'
_ = ' '*
Он разбирает эту строку кнопочная пары значений: location=USA; application<>app; count>5
к этому: [ { "key": "location", "op": "=", "value": "USA" }, { "key": "application", "op": "<>", "value": "app" }, { "key": "count", "op": ">", "value": "5" } ]
проблема заключается в том, я хочу, чтобы дать возможность свободного поиска текста, а также, который вводится Befor е пары ключ-значение, например: это: free text foobar; location=USA; application<>app; count>5
и получить это: [ { "key": "fullText", "op": "=", "value": "free text foobar" }, { "key": "location", "op": "=", "value": "USA" }, { "key": "application", "op": "<>", "value": "app" }, { "key": "count", "op": ">", "value": "5" } ]
Анализатор должен признать, что первую часть не пара ключ-значение (в соответствии с «Пара» правил) и вставки это как объект «fullText».
В основном «Выражение» правило должно делать это, согласно тому, что я читал в документации - A/B означает, что если А не пройти B испытывается. Во втором случае «Париж» неудачен, потому что «свободный текст foobar» не проходит правило «Пары», но он просто генерирует исключение вместо того, чтобы двигаться дальше.
Congrats кому дожили до здесь, что я делаю неправильно? :) Спасибо