{"id":25054,"library":"canopy","title":"Canopy","description":"Canopy is a parser compiler for parsing expression grammars (PEG) targeting JavaScript, Java, Python, and Ruby. Version 0.4.1 is the latest stable release; the project appears to be in maintenance mode with no recent activity. It generates standalone parsers with no runtime dependencies, making it lightweight. Unlike PEG.js or Nearley, Canopy offers multi-language code generation from a single grammar file.","status":"maintenance","version":"0.4.1","language":"javascript","source_language":"en","source_url":"git://github.com/jcoglan/canopy","tags":["javascript","parser","compiler","peg"],"install":[{"cmd":"npm install canopy","lang":"bash","label":"npm"},{"cmd":"yarn add canopy","lang":"bash","label":"yarn"},{"cmd":"pnpm add canopy","lang":"bash","label":"pnpm"}],"dependencies":[],"imports":[{"note":"Generated parsers are ESM modules; use ES2015 import syntax.","wrong":"const Parser = require('./path/to/generated-parser')","symbol":"default","correct":"import Parser from './path/to/generated-parser'"},{"note":"The generated parser exports a parse function as the default export.","symbol":"parse","correct":"import Parser from './parser'; const result = Parser.parse('input');"},{"note":"SyntaxTree is a helper type from the main 'canopy' package, not from generated parsers.","wrong":"import { SyntaxTree } from './parser'","symbol":"SyntaxTree","correct":"import { SyntaxTree } from 'canopy'"}],"quickstart":{"code":"// Install canopy globally\n// npm install -g canopy\n\n// grammar.peg\n/*\nprogram <- expr+\nexpr <- number / '(' expr ')'\nnumber <- [0-9]+\n*/\n\n// Compile to JavaScript\n// canopy grammar.peg --lang javascript --output parser.js\n\n// In app.js\nimport Parser from './parser.js'\nconst result = Parser.parse('(42)')\nconsole.log(result)\n","lang":"javascript","description":"Shows how to create a simple PEG grammar, compile it with Canopy CLI, and use the generated parser in JavaScript."},"warnings":[{"fix":"Ensure your code is compatible with strict mode. Avoid using reserved words as node labels.","message":"Generated parsers use strict mode and may fail with 'use strict' conflicts.","severity":"gotcha","affected_versions":">=0.1"},{"fix":"Regenerate parsers after upgrading Canopy to avoid silent failures.","message":"Output format changes between versions; generated parsers from different Canopy versions may not be compatible.","severity":"breaking","affected_versions":">=0.3"},{"fix":"Rewrite left-recursive rules using iteration or right recursion. Canopy does not support left recursion.","message":"Left recursion in grammars causes infinite loops or stack overflow.","severity":"gotcha","affected_versions":">=0.1"},{"fix":"Use version 0.4 or later, or manually convert to ESM.","message":"Canopy does not generate ESM modules by default; output uses CommonJS in older versions.","severity":"deprecated","affected_versions":"<0.4"}],"env_vars":null,"last_verified":"2026-05-01T00:00:00.000Z","next_check":"2026-07-30T00:00:00.000Z","problems":[{"fix":"Run canopy grammar.peg --lang javascript --output parser.js to generate the parser.","cause":"Output file not generated or wrong path.","error":"Cannot find module './parser.js'"},{"fix":"Check grammar for non-ASCII characters or misplaced operators. Refer to PEG specification.","cause":"Grammar contains invalid PEG syntax or characters.","error":"SyntaxError: Unexpected token ILLEGAL"},{"fix":"Use a bundler like Webpack or include a shim for process.env if needed. Alternatively, avoid using environment variable features.","cause":"Generated parser used in non-Node environment without browser polyfill.","error":"ReferenceError: process is not defined"}],"ecosystem":"npm","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}