2016-10-31 9 views
0

Я написал следующий синтаксический анализатор (вставить в 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 кому дожили до здесь, что я делаю неправильно? :) Спасибо

ответ

0

Играл с грамматикой еще немного, решение заключается в использовании пара и (по некоторым причинам), чтобы изменить порядок «Выражение» правило:

Expression = FullTextWithPairs/Pairs 
 

 
Pairs = (';'? _ p:Pair { return p; })* 
 

 
FullTextWithPairs = fto:FullText po:Pairs 
 
{ 
 
\t var arr = []; 
 
    if (fto) { 
 
    \t arr.push(fto); 
 
    } 
 
    return arr.concat(po); 
 
} 
 
    
 
FullText = !Pair 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' 
 

 
_ = ' '*

 Смежные вопросы

  • Нет связанных вопросов^_^