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.