Help in creating the peg.js parser

I want to create a parser and expression syntax in peg.js that would allow me to do these things

Basically I want to pass in a mask and have a pin number.

The mask has these abilities.

1) generates a random number between 0-9 (character nfor expression?)
2) generates a random number between x and y ((x, y) for expression?)
3) literal numbers are real (I hope nothing is needed for redemption?)
4 ) repeat the previous expression x times ({x} for the expression?)
5) repeat the previous expression between x and y times ({x, y} for the expression?)

so an exemplary expression might be

027n(5,9){4}n12{2,8}(2,4)

the proposed syntax of the expression above is just an example; it may change.

can anyone help in creating a parser for this in peg.js ?

+5
source share
1 answer

The idea is to force it to generate a JavaScript function that, when executed, returns a random string according to the mask.

A literal number is any character from 0 to 9, so make it generate a function that returns itself.

literal_number
 = num:[0-9]
 { return function() {
     return num;
 }; }

Then nfor a random number. Again, this generates a function to return a random number. I added + ''to convert it to a string before returning.

random_number
 = "n"
 { return function() {
     return Math.floor(Math.random() * 10) + '';
 }; }

(a,b) a b , . :

number
 = digits:[0-9]+ { return parseInt(digits.join(""), 10); }

(a,b).

random_number_between
 = "(" a:number "," b:number ")"
 { return function() {
     return a + Math.floor(Math.random() * (b - a + 1)) + ''
 }; }

, 3 (literal_number, random_number, random_number_between) , .

single_expression
 = random_number
 / random_number_between
 / literal_number

, {n} {a,b}, . , .

, N , .

repeated_expression
 = ex:single_expression "{" n:number "}" {
       return function() {
           var result = '';
           for (var i = 0; i < n; i ++) {
               result += ex();
           }
           return result;
       };
   }
 / ex:single_expression "{" a:number "," b:number "}" {
       return function() {
           var result = '';
           var n = a + Math.floor(Math.random() * (b - a + 1))
           for (var i = 0; i < n; i ++) {
               result += ex();
           }
           return result;
       };
   }
 / ex:single_expression

, .

expression
 = list:repeated_expression* {
       return function() {
           var result = '';
           for (var i = 0; i < list.length; i ++) {
               result += list[i]();
           }
           return result;
       };
   }

, , . , a, . , , .

mask
 = ex:expression
 { return ex() }

: 027n(5,9){4}n12{2,8}(2,4) 0271568891222224.

+17

All Articles