我正在寻找一个库,在给出PEG语法输入的情况下,例如:
Expression
= A B
A
= [0-9]
B
= [a-z]
将输出机器可读版本,例如:
{
"expression":{
"components":[
{
"type": "subexpression",
"subexpressionName": "A"
},
{
"type": "subexpression",
"subexpressionName": "B"
}
]
},
"subexpressions":[
{
"name": "A",
"components":[
{
"type": "regex",
"regexString": "[0-9]"
}
]
},
{
"name": "B",
"components":[
{
"type": "regex",
"regexString": "[a-z]"
}
]
}
]
}
有谁知道这样的图书馆? Javascript库首选,但任何会有所帮助。
答案 0 :(得分:0)
感谢Ira上面的评论,我有一个更深入的了解,并找到了我需要的东西。
我正在使用的库是pegjs,它使得解析语法成为JSON变得简单易行。
var pegjs = require('pegjs');
var exampleGrammar = ''+
'Expression \n'+
' = A B \n'+
' \n'+
'A \n'+
' = [0-9] \n'+
' \n'+
'B \n'+
' = [a-z] ';
var parsed = pegjs.parser.parse(exampleGrammar);
console.log(JSON.stringify(parsed));
如果有人有兴趣,它会给出输出:
{
"type":"grammar",
"initializer":null,
"rules":[
{
"type":"rule",
"name":"Expression",
"expression":{
"type":"sequence",
"elements":[
{
"type":"rule_ref",
"name":"A",
"location":{
"start":{
"offset":16,
"line":2,
"column":5
},
"end":{
"offset":17,
"line":2,
"column":6
}
}
},
{
"type":"rule_ref",
"name":"B",
"location":{
"start":{
"offset":18,
"line":2,
"column":7
},
"end":{
"offset":19,
"line":2,
"column":8
}
}
}
],
"location":{
"start":{
"offset":16,
"line":2,
"column":5
},
"end":{
"offset":19,
"line":2,
"column":8
}
}
},
"location":{
"start":{
"offset":0,
"line":1,
"column":1
},
"end":{
"offset":25,
"line":3,
"column":1
}
}
},
{
"type":"rule",
"name":"A",
"expression":{
"type":"class",
"parts":[
[
"0",
"9"
]
],
"inverted":false,
"ignoreCase":false,
"rawText":"[0-9]",
"location":{
"start":{
"offset":55,
"line":5,
"column":5
},
"end":{
"offset":60,
"line":5,
"column":10
}
}
},
"location":{
"start":{
"offset":38,
"line":4,
"column":1
},
"end":{
"offset":64,
"line":6,
"column":1
}
}
},
{
"type":"rule",
"name":"B",
"expression":{
"type":"class",
"parts":[
[
"a",
"z"
]
],
"inverted":false,
"ignoreCase":false,
"rawText":"[a-z]",
"location":{
"start":{
"offset":94,
"line":8,
"column":5
},
"end":{
"offset":99,
"line":8,
"column":10
}
}
},
"location":{
"start":{
"offset":77,
"line":7,
"column":1
},
"end":{
"offset":103,
"line":9,
"column":1
}
}
}
],
"location":{
"start":{
"offset":0,
"line":1,
"column":1
},
"end":{
"offset":103,
"line":9,
"column":1
}
}
}