如何在PEG.js中创建可选单词

时间:2013-10-05 16:22:36

标签: javascript parsing peg pegjs

我正在尝试使用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

3 个答案:

答案 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

希望它有所帮助。