我正在尝试使用PEG.js构建一个简单的解析器。我希望用户能够输入一系列关键字,并在它们之间选择“AND”,但我似乎无法获得可选和工作。它总是期待它,即使我用它标记它? (零或一)。
将此语法粘贴到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”,“bar”]的数组:
foo bar
foo and bar
答案 0 :(得分:1)
好的,没关系。我想到了。这是因为我在'和'之前做了可选的空格,作为和规则的一部分,所以它期望其余的规则。我只需将其移出对规则,就像这样:
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]
答案 1 :(得分: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]+
答案 2 :(得分: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
希望它有所帮助。