TS PEG.js is a TS code generation plugin for PEG.js.
Install PEG.js with ts-pegjs plugin
$ npm install ts-pegjs
In Node.js, require both the PEG.js parser generator and the ts-pegjs plugin:
var pegjs = require("pegjs");
var tspegjs = require("ts-pegjs");
To generate a TS parser, pass to pegjs.generate
ts-pegjs plugin and your grammar:
var parser = pegjs.generate("start = ('a' / 'b')+", {
output: "source",
format: "commonjs",
plugins: [tspegjs],
"tspegjs": {
"noTslint": false,
"tslintIgnores": "rule1,rule2",
"customHeader": "// import lib\nimport { Lib } from 'mylib';"
}
});
The method will return source code of generated parser as a string.
Supported options of pegjs.generate
:
cache
— iftrue
, makes the parser cache results, avoiding exponential parsing time in pathological cases but making the parser slower (default:false
). This is strongly recommended for big grammars (like javascript.pegjs or css.pegjs in example folder)allowedStartRules
— rules the parser will be allowed to start parsing from (default: the first rule in the grammar)
no-tslint
— Excludes the default tslint rules exclusions (defaults to false).tslint-ignores
— A custom list of tslint rules to be excluded (comma separated, if no provided, a default tslint rule exclusion list will be applied).custom-header
— A custom header of TS code to be injected on the header of the output file. E.g. provides a convenient place for adding library imports.returnTypes
— An object containing rule names as keys and return type as string.
Sample usage:
pegjs --plugin ./src/tspegjs -o examples/arithmetics.ts --cache examples/arithmetics.pegjs
It will generarate the parser in the TS flavour.
If you need to pass specific plugin options you can use the option --extra-options-file
provided by pegjs and pass it a filename (e.g. pegconfig.json) containing specific options like the following JSON sample:
pegjs --plugin ./src/tspegjs --extra-options-file pegconfig.json -o examples/arithmetics.ts --cache examples/arithmetics.pegjs
{
"tspegjs": {
"noTslint": false,
"tslintIgnores": "rule1,rule2",
"customHeader": "// import lib\nimport { Lib } from 'mylib';"
}
}
Make sure to pass any additional CLI options, like
--extra-options-file
before the parameter-o
as these will otherwise be treated as arguments to that one.
-
Save parser generated by
pegjs.generate
to a file or use the one generated from the CLI tool. -
In client TS code:
import { SyntaxError, parse } from './arithmetics';
try {
const sampleOutput = parse('my sample...');
}
catch (ex: SyntaxError)
{
// Handle parsing error
// [...]
}
Thanks to:
- David Majda for creating pegjs
- Futago-za Ryuu for maintain pegjs
- Elantcev Mikhail for providing the pegjs PHP plugin, inspiration on this one.
(c) 2017-2018, Pedro J. Molina at metadev.pro