https://github.com/qti3e/qpg
Zero configuration parser generator that just works.
https://github.com/qti3e/qpg
parser-generator
Last synced: 2 months ago
JSON representation
Zero configuration parser generator that just works.
- Host: GitHub
- URL: https://github.com/qti3e/qpg
- Owner: qti3e
- License: mit
- Created: 2019-09-05T13:37:23.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2019-09-06T12:15:58.000Z (over 5 years ago)
- Last Synced: 2025-03-14T22:03:32.258Z (2 months ago)
- Topics: parser-generator
- Language: TypeScript
- Size: 28.3 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# [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
```qpg
@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:
```js
const s = parser.parse("3 + 4 * 5; 2 - 5;");
console.log(JSON.stringify(s, null, 2));`;
```and this is the clean output I promised:
```json
{
"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.