qpg
TypeScript icon, indicating that this package has built-in type declarations

0.0.4 • Public • Published

[WIP] QPG

Zero configuration parser generator that just works.

QPG is not designed to be fast, but to provide a really nice experience for those of us who just want to create a parser for their new awesome programming language and get things done.

Right now only JavaScript is supported, but it's easy to add a new backend.

Unlike many parser generators QPG produces an understandable AST without any bullshit and it's designed to work best for programming languages!

Example

@SOURCE := @statements STATEMENT[]
 
STATEMENT :=
  EXPRESSION_STATEMENT
 
@EXPRESSION_STATEMENT :=
  -
    @expression EXPRESSION
    ";"
 
EXPRESSION :=
  ADD
 
@BINARY ADD :=
  MUL
  ADD "+" MUL
  ADD "-" MUL
 
@BINARY MUL :=
  NUM
  MUL "*" NUM
  MUL "/" NUM
 
$NUM := /\\d+/

top level @ means the node is actually an AST node, and then you can use @ to catch things in the Node object.

$ means this is a text-only AST Node (like Numeric literal, string literal and so on) and we want to catch the part of the source code that matched against the pattern.

BINARY is designed to work with binary operations and especially those that are left-recursive.

- starts a new multiline path.

And then you can easily use your generated parser like following:

const s = parser.parse("3 + 4 * 5; 2 - 5;");
console.log(JSON.stringify(s, null, 2));`;

and this is the clean output I promised:

{
  "kind": "SOURCE",
  "statements": [
    {
      "kind": "EXPRESSION_STATEMENT",
      "expression": {
        "kind": "ADD",
        "op": "+",
        "lhs": {
          "kind": "NUM",
          "value": "3"
        },
        "rhs": {
          "kind": "MUL",
          "op": "*",
          "lhs": {
            "kind": "NUM",
            "value": "4"
          },
          "rhs": {
            "kind": "NUM",
            "value": "5"
          }
        }
      }
    },
    {
      "kind": "EXPRESSION_STATEMENT",
      "expression": {
        "kind": "ADD",
        "op": "-",
        "lhs": {
          "kind": "NUM",
          "value": "2"
        },
        "rhs": {
          "kind": "NUM",
          "value": "5"
        }
      }
    }
  ]
}

Unresolved issues

I'm still thinking about how to handle comments in the codes - any idea is welcomed.

Readme

Keywords

none

Package Sidebar

Install

npm i qpg

Weekly Downloads

3

Version

0.0.4

License

MIT

Unpacked Size

112 kB

Total Files

33

Last publish

Collaborators

  • qti3e