[英]help creating peg.js parser
我想在peg.js中創建解析器和表達式語法,這將允許我做這些事情
基本上我想傳遞一個掩碼並有一個數字輸出。
面具有這些能力。
1)生成0-9之間的隨機數(表達式的字符n
?)
2)在x和y之間生成一個隨機數((x,y)用於表達式?)
3)字面數字是有效的(希望沒有任何需要的東西?)
4)重復前面的表達式x次(表達式為{x}?)
5)重復x和y次之間的前一個表達式({x,y}表達式?)
所以一個例子表達式可能是
027n(5,9){4}n12{2,8}(2,4)
上面提出的表達式語法只是一個例子,它可以改變。
任何人都可以在peg.js中為此創建解析器提供幫助嗎?
我們的想法是讓它生成一個JavaScript函數,該函數在執行時將根據掩碼返回一個隨機字符串。
文字數字是介於0到9之間的任何字符,因此要生成一個返回自身的函數。
literal_number
= num:[0-9]
{ return function() {
return num;
}; }
那么n
是一個隨機數。 同樣,這會生成一個返回隨機數的函數。 在返回之前,我添加了+ ''
將其轉換為字符串。
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)) + ''
}; }
因此,這三件事(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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.