## Compiling in browsers

Both the nearley parser and compiled grammars work in browsers; simply include `nearley.js` and your compiled `grammar.js` file in `<script>` tags and use nearley as usual. However, the nearley compiler is not designed for the browser – you should precompile your grammars and only serve the generated JS files to browsers.

If you absolutely have to compile a grammar in a browser (for example, to implement a nearley IDE) then you can use a tool like Webpack or Rollup to include the `nearley` NPM package in your browser code. Then, you can utilize the `nearleyc` internals to compile grammars dynamically.

    const nearley = require("nearley");
    const compile = require("nearley/lib/compile");
    const generate = require("nearley/lib/generate");
    const nearleyGrammar = require("nearley/lib/nearley-language-bootstrapped");

    function compileGrammar(sourceCode) {
        // Parse the grammar source into an AST
        const grammarParser = new nearley.Parser(nearleyGrammar);
        grammarParser.feed(sourceCode);
        const grammarAst = grammarParser.results[0]; // TODO check for errors

        // Compile the AST into a set of rules
        const grammarInfoObject = compile(grammarAst, {});
        // Generate JavaScript code from the rules
        const grammarJs = generate(grammarInfoObject, "grammar");

        // Pretend this is a CommonJS environment to catch exports from the grammar.
        const module = { exports: {} };
        eval(grammarJs);

        return module.exports;
    }

    const grammar = compileGrammar("main -> foo | bar");

    const parser = new nearley.Parser(nearley.Grammar.fromCompiled(grammar));