如何在 Peg JS 中编写范围语法

How to write a range syntax in Peg JS

我试图编写语法来验证 1 到 128 之间的数字,但无法在 peg.js 中完成任务,尽管它在与 Javascript 兼容的正则表达式中工作。

正则表达式:^(12[0-8]|1[01][0-9]|[1-9]?[1-9])$

但无法在 peg.js 中复制相同的表达式。

numberRange = l: (rangeRegex) m:(integer*)  {
if(m.length !== 0){
l = l + m.join("");
}
return l;
}

rangeRegex = ^(12[0-8]|1[01][0-9]|[1-9]?[1-9])$

我也尝试在 Peg.js 中使用相同的正则表达式,这会抛出 Expected "!", "$", "&", "(", ".", character class, comment, end of the line, identifier, literal, or whitespace but "^" found.

我们无法在 peg.js 中直接匹配正则表达式,但是,我们可以在 peg.js 的谓词中使用正则表达式来验证数字。如果数字与提供的正则表达式不匹配,我们确实有权抛出自定义错误。

numberRange = l: (rangeRegex* ) {
            if (l.length > 0) {
               l = l.join("");
            }
        
            if (l.match('^(12[0-8]|1[01][0-9]|[1-9][0-9]?)$')) {
               return l;
            } else {
              error("The number must be in a range of 1 to 128");
            }
        }

rangeRegex =[0-9]

以下代码帮助我验证了 1 到 128 范围内的数字。我希望这对其他人也有帮助。

这是另一个没有正则表达式的解决方案:

numberRange = "1" [0-2] [0-8] / [1-9] [0-9] / [1-9]