Claude Code Plugins

Community-maintained marketplace

Feedback

Use when writing PEG grammars with Peggy (formerly PEG.js) - parsing expression grammars, parser generation, and syntax definition

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name peggy
description Use when writing PEG grammars with Peggy (formerly PEG.js) - parsing expression grammars, parser generation, and syntax definition

Peggy Parser Generator

Quick Start

// grammar.peggy
Expression = head:Term tail:(_ ("+" / "-") _ Term)* {
  return tail.reduce((result, [, op, , term]) => {
    return op === "+" ? result + term : result - term;
  }, head);
}

Term = Integer / "(" _ expr:Expression _ ")" { return expr; }

Integer = digits:[0-9]+ { return parseInt(digits.join(""), 10); }

_ = [ \t\n\r]*
import * as peggy from 'peggy';
import fs from 'fs';

const grammar = fs.readFileSync('grammar.peggy', 'utf-8');
const parser = peggy.generate(grammar);
const result = parser.parse('2 + 3 * 4'); // 14

Core Syntax

Pattern Meaning
"literal" Match exact string
[a-z] Character class
rule1 / rule2 Ordered choice (try rule1 first)
rule* Zero or more
rule+ One or more
rule? Optional
&rule Positive lookahead
!rule Negative lookahead
label:rule Capture as variable
{ code } Action (return value)

Rule Definitions

// Named rule
Identifier = [a-zA-Z_][a-zA-Z0-9_]* { return text(); }

// With semantic action
Number = digits:[0-9]+ { return parseInt(digits.join(""), 10); }

// Choice with labels
BinaryOp = left:Term op:("+" / "-") right:Term {
  return { type: "binary", op, left, right };
}

Built-in Functions

  • text() - Matched text as string
  • location() - Start/end positions
  • expected(desc) - Throw expected error
  • error(message) - Throw custom error

CLI Usage

npx peggy grammar.peggy -o parser.js
npx peggy --format es grammar.peggy  # ES module output

Tips

  • Order choices from most to least specific
  • Use !. for "not end of input"
  • Whitespace is significant; define _ rule for optional whitespace
  • Use @ prefix for pluck: @value:Rule returns just the labeled value