至少有一个

Nearley at least one

我有一个语法,我希望在两个术语之间有一些空格(包括换行符)。应该有一些空格,即如果两个术语相接触,它应该失败,但是可以有任意多的空格。我遇到的问题是空格和换行符是不同的标记。我不知道如何在 nearley 中制作 "at least one"。

我设法用 EBNF 修饰符解决了这个问题:

ws -> %WS | %NL

# At least one whitespace
someWS -> ws:+

# none or some whitespace
manyWS -> ws:*

如果您正在使用 moo.js,那么您可以使用正则表达式预定义空格。

@{%
  const moo = require('moo')
  let lexer = moo.compile({
    space: {match: /\s+/, lineBreaks: true}
    // other rules
  });
%}

@lexer lexer

_ -> null | %space {% d => null %} // any amount of white space or none
__ -> %space {% d => " " %} // at least one white space token