簡體   English   中英

幫助創建peg.js解析器

[英]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)語法中, ab是數字,因此我們需要對其進行解析並返回一個數字。 使用計算器示例中的聲明:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM