PEG语法的PEG解析器

时间:2015-11-20 22:58:02

标签: parsing metadata peg

我正在寻找一个库,在给出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库首选,但任何会有所帮助。

1 个答案:

答案 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
    }
  }
}