【问题标题】:How to make optional word in PEG.js如何在 PEG.js 中制作可选词
【发布时间】:2013-10-05 16:22:35
【问题描述】:

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

【问题讨论】:

    标签: javascript parsing peg pegjs


    【解决方案1】:

    好吧,没关系。我想到了。这是因为我将 'and' 前面的可选空格作为 and 规则的一部分,所以它期望规则的其余部分。我只需要将它移出,进入 pair 规则,如下所示:

    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]
    

    【讨论】:

      【解决方案2】:

      我知道这是一个非常古老的问题,但是看到它没有得到回答并且有人可能会偶然发现它,我想提交我的答案:

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

      “and”是可选的,您可以添加任意数量的单词。解析器将跳过“and”并返回单词列表。我冒昧地删除了逗号。

      你可以试试https://pegjs.org/online,使用如下字符串:

      carlos, peter, vincent, thomas, and shirly
      

      希望它对某人有所帮助。

      【讨论】:

        【解决方案3】:

        这是我的答案:

        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]+
        

        【讨论】:

          猜你喜欢
          • 2014-09-06
          • 1970-01-01
          • 2017-01-21
          • 1970-01-01
          • 2011-05-13
          • 1970-01-01
          • 1970-01-01
          • 2016-01-28
          • 2019-05-06
          相关资源
          最近更新 更多