2013-10-05 2 views
3

Я пытаюсь создать простой парсер с PEG.js. Я хочу, чтобы пользователь мог вводить ряд ключевых слов с опциональным «И» между ними, но я не могу получить дополнительный и рабочий. Он всегда этого ожидает, хотя я отметил его? (ноль или один).Как сделать необязательное слово в PEG.js

Вставить эту грамматику в http://pegjs.majda.cz/online:

parse = pair+ 

pair = p:word and? { return p } 

word = w:char+ { return w.join(""); } 

char = c:[^ \r\n\t] { return c; } 

and = ws* 'and'i ws* 

ws = [ \t] 

Моя цель состоит в том, чтобы иметь один из этих входов разбора в массив [ "Foo", "бар"]:

foo bar 
foo and bar 

ответ

1

Ok, неважно. Я понял. Это было потому, что я сделал необязательные пробелы, предшествующие «и», как часть правил и, поэтому он ожидал остальной части правила. Мне просто нужно, чтобы переместить его, в правило пара, например, так:

parse = pair+ 
pair = p:word ws* and? { return p } 
word = w:char+ { return w.join(""); } 
char = c:[^ \r\n\t] { return c; } 
and = 'and'i ws* 
ws = [ \t] 
0

Вот мой ответ:

start 
    = words 

words 
    = head:word tail:(and (word))* { 
    var words = [head]; 
    tail.forEach(function (word) { 
     word = word[1]; 
     words.push(word); 
    }) 
    return words; 
    } 

and 
    = ' and ' 
/$' '+ 

word 
    = $chars 

chars 'chars' 
    = [a-zA-Z0-9]+ 
0

Я знаю, что это очень старый вопрос, но, видя, как это не ответил, а кто-то может наткнуться на него, я хотел бы представить свой ответ:

Program 
    = w1:$Word _ wds:(_ "and"? _ w:$Word { return w; })* _ { 
     wds.unshift(w1); 
     return wds; 
    } 
Word 
    = [a-zA-Z]+ 
_ 
    = [ ,\t]* 

«и» не является обязательным, и вы можете добавить столько слов, сколько вы хотите. Парсер пропустит «и» и вернет список слов. Я взял на себя смелость удалить запятые.

Вы можете попробовать его https://pegjs.org/online со строкой как:

carlos, peter, vincent, thomas, and shirly 

Надеется, что это поможет кому-то.

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