TS PEG.js is a TS code generation plugin for peggy.
Installs ts-pegjs + peggy
$ npm install ts-pegjs
In Node.js, require both the peggy parser generator and the ts-pegjs plugin:
var peggy = require('peggy');
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: {
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)
Note: Options in CLI mode are written in POSIX (long names as kebab-case) convention e.g. --custom-header but with camelcase on JavaScript e.g. customHeader.
customHeader— A string or an array of strings which are a valid TS code to be injected on the header of the output file. E.g. provides a convenient place for adding library imports.customHeaderFile— A header file to include.errorName— The name of the exported internal error class to override. The default value from version 3.0.0 isPeggySyntaxError. Previous one wasSyntaxError.returnTypes— An object containing rule names as keys and a valid TS return type as string.skipTypeComputation— Boolean. Iftrue,ts-pegjswill not try to use TS to infer types based on your grammar rules.onlyGenerateGrammarTypes— Boolean. Iftrue, only types for your grammar rules (and no parser) will be generated. Cannot be used withskipTypeComputation.doNotCamelCaseTypes— Boolean. By default type names for grammar rules are converted to CamelCase. Iftrue, this conversion is not done and type names will match the casing of your grammar rules.
Sample usage:
peggy --plugin ./src/tspegjs -o examples/arithmetics.ts --cache examples/arithmetics.pegjs
(Note ./src/tspegjs is the path to tspegjs.ts in the project. If you installed ts-pegjs using npm, it should probably be ./node_modules/ts-pegjs/src/tspegjs.)
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:
peggy --plugin ./src/tspegjs --extra-options-file pegconfig.json -o examples/arithmetics.ts --cache examples/arithmetics.pegjs
{
"tspegjs": {
"customHeader": "// import lib\nimport { Lib } from 'mylib';"
},
"returnTypes": {
"Integer": "number",
"Expression": "number",
}
}For rules not listed in
returnTypesobjectanytype is declared by default.
Make sure to pass any additional CLI options, like
--extra-options-filebefore the parameter-oas these will otherwise be treated as arguments to that one.
-
Save parser generated by
pegjs.generateto a file or use the one generated from the CLI tool. -
In client TS code:
import { PeggySyntaxError, parse } from './arithmetics';
try {
const sampleOutput = parse('my sample...');
} catch (ex: PeggySyntaxError) {
// Handle parsing error
// [...]
}Thanks to:
- David Majda for creating pegjs
- Elantcev Mikhail for providing the pegjs PHP plugin, inspiration on this one.
(c) 2017-2023, Pedro J. Molina at metadev.pro
