|
|
|
"use strict";
|
|
|
|
|
|
|
|
const mapObj = require("map-obj");
|
|
|
|
|
|
|
|
let GrammarError = require("./grammar-error");
|
|
|
|
let compiler = require("./compiler");
|
|
|
|
let parser = require("./parser");
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
// PEG.js version (uses semantic versioning).
|
|
|
|
VERSION: require("../package.json").version,
|
|
|
|
|
|
|
|
GrammarError: GrammarError,
|
|
|
|
parser: parser,
|
|
|
|
compiler: compiler,
|
|
|
|
|
|
|
|
// Generates a parser from a specified grammar and returns it.
|
|
|
|
//
|
|
|
|
// The grammar must be a string in the format described by the metagramar in
|
|
|
|
// the parser.pegjs file.
|
|
|
|
//
|
|
|
|
// Throws |peg.parser.SyntaxError| if the grammar contains a syntax error or
|
|
|
|
// |peg.GrammarError| if it contains a semantic error. Note that not all
|
|
|
|
// errors are detected during the generation and some may protrude to the
|
|
|
|
// generated parser and cause its malfunction.
|
|
|
|
generate(grammar, options = {}) {
|
|
|
|
// FIXME: Validatem
|
|
|
|
|
|
|
|
let config = {
|
|
|
|
parser: parser,
|
|
|
|
passes: mapObj(compiler.passes, (stage, passesForStage) => {
|
|
|
|
return [ stage, Object.values(passesForStage) ];
|
|
|
|
})
|
|
|
|
};
|
|
|
|
|
|
|
|
let parseResult = config.parser.parse(grammar);
|
|
|
|
|
|
|
|
if (parseResult.imports.length === 0) {
|
|
|
|
return compiler.compile(
|
|
|
|
parseResult,
|
|
|
|
config.passes,
|
|
|
|
options
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
throw new Error("`import` syntax can only be used with `generateFromFile`");
|
|
|
|
}
|
|
|
|
},
|
|
|
|
generateFromFile: function (path, options = {}) {
|
|
|
|
throw new Error(`Unimplemented`);
|
|
|
|
}
|
|
|
|
};
|