2013-10-05 15 views
3

我正在嘗試使用PEG.js構建一個簡單的解析器。我希望用戶能夠輸入一系列關鍵字,在它們之間有一個可選的「AND」,但我似乎無法獲得可選和正常工作。它總是期待它,即使我已經標記了它? (零個或一個)。如何在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

好的,沒關係。我想到了。這是因爲我在'and'之前的可選空白作爲規則的一部分,所以它預期了規則的其餘部分。我只是需要把它搬出去,到規則,就像這樣:

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 

希望它可以幫助別人。