Как написать синтаксис диапазона в 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.


person Hemraj Rijal    schedule 30.12.2020    source источник


Ответы (2)


Мы не могли сопоставить регулярное выражение непосредственно в 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. Надеюсь, это поможет и другим.

person Hemraj Rijal    schedule 04.01.2021

Вот еще одно решение без регулярного выражения:

numberRange = "1" [0-2] [0-8] / [1-9] [0-9] / [1-9]
person Josh Voigts    schedule 13.01.2021